Compare commits

...

5 Commits

Author SHA1 Message Date
dforsi ee3ae2fdaf
Merge 954748f452 into 217c900609 2024-04-28 11:26:13 +02:00
f4exb 217c900609 AudioCATSISO: fixed transverter processing 2024-04-28 01:15:36 +02:00
f4exb 956d1e6c07 AudioCATSISO: fixed CAT worker handling 2024-04-27 22:12:03 +02:00
Daniele Forsi 954748f452 Temporarily disable building DATV plugins for MacOS CI
This is a temporary workaround to make CI succeed until the plugins code
is modified to be compatible with a newer version of ffmpeg.
2024-04-26 23:04:12 +02:00
Daniele Forsi 6f107cd915 Fix CI for Mac OS
Build ffmpeg as external project to work around missing includes:
/Users/runner/work/sdrangel/sdrangel/plugins/channelrx/demoddatv/datvideorender.cpp:282:46: error: no member named 'channels' in 'AVCodecContext'
(and similar)
2024-04-26 22:57:41 +02:00
6 changed files with 162 additions and 18 deletions

View File

@ -121,11 +121,11 @@ jobs:
rm -f /usr/local/bin/2to3
brew install opencv
- name: Install brew packages
run: brew install nasm boost hidapi libusb fftw ffmpeg faad2 zlib airspy airspyhf hackrf rtl-sdr libbladerf soapysdr qt
run: brew install nasm boost hidapi libusb fftw faad2 zlib airspy airspyhf hackrf rtl-sdr libbladerf soapysdr qt
- name: Configure SDRangel
run: |
mkdir build && cd build
cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_QT6=ON -DCMAKE_BUILD_TYPE=Release -DARCH_OPT=nehalem -DDEBUG_OUTPUT=ON -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DENABLE_EXTERNAL_LIBRARIES=AUTO -DBUNDLE=ON -DPKG_CONFIG_USE_CMAKE_PREFIX_PATH=TRUE
cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_QT6=ON -DCMAKE_BUILD_TYPE=Release -DARCH_OPT=nehalem -DDEBUG_OUTPUT=ON -DENABLE_CHANNELRX_DEMODDATV=OFF -DENABLE_CHANNELTX_MODDATV=OFF -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DENABLE_EXTERNAL_LIBRARIES=AUTO -DBUNDLE=ON -DPKG_CONFIG_USE_CMAKE_PREFIX_PATH=TRUE
- name: Get filename
id: get_filename
run: echo "filename=$(grep CPACK_PACKAGE_FILE_NAME build/CMakeCache.txt | cut -d "=" -f2)" >> $GITHUB_OUTPUT

View File

@ -144,14 +144,11 @@ bool AudioCATSISO::startRx()
m_inputWorker->startWork();
m_inputWorkerThread->start();
qDebug("AudioCATSISO::startRx: started");
m_rxRunning = true;
qDebug() << "AudioCATSISO::startRx: start CAT";
m_catWorkerThread = new QThread();
m_catWorker = new AudioCATSISOCATWorker();
m_inputWorker->moveToThread(m_catWorkerThread);
m_catWorker->moveToThread(m_catWorkerThread);
QObject::connect(m_catWorkerThread, &QThread::started, m_catWorker, &AudioCATSISOCATWorker::startWork);
QObject::connect(m_catWorkerThread, &QThread::finished, m_catWorker, &QObject::deleteLater);
@ -159,13 +156,23 @@ bool AudioCATSISO::startRx()
m_catWorker->setMessageQueueToGUI(getMessageQueueToGUI());
m_catWorker->setMessageQueueToSISO(getInputMessageQueue());
m_catWorker->startWork();
m_catWorkerThread->start();
qDebug("AudioCATSISO::startRx: started");
m_rxRunning = true;
AudioCATSISOCATWorker::MsgSetRxSampleRate *msgSetRxSampleRate = AudioCATSISOCATWorker::MsgSetRxSampleRate::create(m_rxSampleRate);
m_catWorker->getInputMessageQueue()->push(msgSetRxSampleRate);
AudioCATSISOCATWorker::MsgConfigureAudioCATSISOCATWorker *msgToCAT = AudioCATSISOCATWorker::MsgConfigureAudioCATSISOCATWorker::create(
m_settings, QList<QString>(), true
);
m_catWorker->getInputMessageQueue()->push(msgToCAT);
AudioCATSISOCATWorker::MsgPollTimerConnect *startTimerMsg = AudioCATSISOCATWorker::MsgPollTimerConnect::create();
m_catWorker->getInputMessageQueue()->push(startTimerMsg);
qDebug() << "AudioCATSISO::startRx: CAT started";
m_catRunning = true;
@ -466,6 +473,8 @@ void AudioCATSISO::applySettings(const AudioCATSISOSettings& settings, const QLi
{
audioDeviceManager->removeAudioSource(&m_inputFifo);
audioDeviceManager->addAudioSource(&m_inputFifo, getInputMessageQueue(), m_rxAudioDeviceIndex);
AudioCATSISOCATWorker::MsgSetRxSampleRate *msgSetRxSampleRate = AudioCATSISOCATWorker::MsgSetRxSampleRate::create(m_rxSampleRate);
m_catWorker->getInputMessageQueue()->push(msgSetRxSampleRate);
}
}
@ -557,6 +566,10 @@ void AudioCATSISO::applySettings(const AudioCATSISOSettings& settings, const QLi
forwardTxChange = true;
}
if (settingsKeys.contains("catPollingMs") || force) {
forwardToCAT = true;
}
if (settings.m_useReverseAPI)
{
bool fullUpdate = (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) ||

View File

@ -16,7 +16,9 @@
///////////////////////////////////////////////////////////////////////////////////
#include <QDebug>
#include <QTimer>
#include "dsp/devicesamplesource.h"
#include "audiocatsisocatworker.h"
// Compatibility with all versions of Hamlib
@ -25,6 +27,8 @@
#endif
MESSAGE_CLASS_DEFINITION(AudioCATSISOCATWorker::MsgConfigureAudioCATSISOCATWorker, Message)
MESSAGE_CLASS_DEFINITION(AudioCATSISOCATWorker::MsgPollTimerConnect, Message)
MESSAGE_CLASS_DEFINITION(AudioCATSISOCATWorker::MsgSetRxSampleRate, Message)
MESSAGE_CLASS_DEFINITION(AudioCATSISOCATWorker::MsgReportFrequency, Message)
AudioCATSISOCATWorker::AudioCATSISOCATWorker(QObject* parent) :
@ -33,6 +37,7 @@ AudioCATSISOCATWorker::AudioCATSISOCATWorker(QObject* parent) :
m_inputMessageQueueToSISO(nullptr),
m_running(false),
m_connected(false),
m_pollTimer(nullptr),
m_ptt(false),
m_frequency(0)
{
@ -42,6 +47,10 @@ AudioCATSISOCATWorker::AudioCATSISOCATWorker(QObject* parent) :
AudioCATSISOCATWorker::~AudioCATSISOCATWorker()
{
stopWork();
if (m_pollTimer) {
delete m_pollTimer;
}
}
void AudioCATSISOCATWorker::startWork()
@ -70,23 +79,46 @@ void AudioCATSISOCATWorker::applySettings(const AudioCATSISOSettings& settings,
<< " force:" << force
<< settings.getDebugString(settingsKeys, force);
if (settingsKeys.contains("rxCenterFrequency") || force)
qint64 rxXlatedDeviceCenterFrequency = settings.m_rxCenterFrequency;
rxXlatedDeviceCenterFrequency -= settings.m_transverterMode ? settings.m_transverterDeltaFrequency : 0;
rxXlatedDeviceCenterFrequency = rxXlatedDeviceCenterFrequency < 0 ? 0 : rxXlatedDeviceCenterFrequency;
qint64 txXlatedDeviceCenterFrequency = settings.m_txCenterFrequency;
txXlatedDeviceCenterFrequency -= settings.m_transverterMode ? settings.m_transverterDeltaFrequency : 0;
txXlatedDeviceCenterFrequency = txXlatedDeviceCenterFrequency < 0 ? 0 : txXlatedDeviceCenterFrequency;
if (settingsKeys.contains("rxCenterFrequency") ||
settingsKeys.contains("transverterMode") ||
settingsKeys.contains("transverterDeltaFrequency") || force)
{
if (!m_ptt) {
catSetFrequency(settings.m_rxCenterFrequency);
if (!m_ptt)
{
qint64 deviceCenterFrequency = DeviceSampleSource::calculateDeviceCenterFrequency(
rxXlatedDeviceCenterFrequency,
0,
settings.m_log2Decim,
(DeviceSampleSource::fcPos_t) settings.m_fcPosRx,
m_rxSampleRate,
DeviceSampleSource::FrequencyShiftScheme::FSHIFT_STD,
false);
catSetFrequency(deviceCenterFrequency);
}
}
if (settingsKeys.contains("txCenterFrequency") || force)
if (settingsKeys.contains("txCenterFrequency") ||
settingsKeys.contains("transverterMode") ||
settingsKeys.contains("transverterDeltaFrequency") || force)
{
if (m_ptt) {
catSetFrequency(settings.m_txCenterFrequency);
catSetFrequency(txXlatedDeviceCenterFrequency);
}
}
if (settingsKeys.contains("catPollingMs") || force)
{
m_pollTimer.setInterval(settings.m_catPollingMs);
if (m_pollTimer) {
m_pollTimer->setInterval(settings.m_catPollingMs);
}
}
if (force) {
@ -125,6 +157,39 @@ bool AudioCATSISOCATWorker::handleMessage(const Message& message)
return true;
}
else if (MsgPollTimerConnect::match(message))
{
qDebug("AudioCATSISOCATWorker::handleMessage: MsgPollTimerConnect");
m_pollTimer = new QTimer();
connect(m_pollTimer, SIGNAL(timeout()), this, SLOT(pollingTick()));
m_pollTimer->start(m_settings.m_catPollingMs);
return true;
}
else if (MsgSetRxSampleRate::match(message))
{
MsgSetRxSampleRate& cmd = (MsgSetRxSampleRate&) message;
m_rxSampleRate = cmd.getSampleRate();
qDebug("AudioCATSISOCATWorker::handleMessage: MsgSetRxSampleRate: %d", m_rxSampleRate);
if (m_settings.m_transverterMode && !m_ptt)
{
qint64 rxXlatedDeviceCenterFrequency = m_settings.m_rxCenterFrequency;
rxXlatedDeviceCenterFrequency -= m_settings.m_transverterMode ? m_settings.m_transverterDeltaFrequency : 0;
rxXlatedDeviceCenterFrequency = rxXlatedDeviceCenterFrequency < 0 ? 0 : rxXlatedDeviceCenterFrequency;
qint64 deviceCenterFrequency = DeviceSampleSource::calculateDeviceCenterFrequency(
rxXlatedDeviceCenterFrequency,
0,
m_settings.m_log2Decim,
(DeviceSampleSource::fcPos_t) m_settings.m_fcPosRx,
m_rxSampleRate,
DeviceSampleSource::FrequencyShiftScheme::FSHIFT_STD,
false);
catSetFrequency(deviceCenterFrequency);
}
return true;
}
return false;
}
@ -177,8 +242,6 @@ void AudioCATSISOCATWorker::catConnect()
if (retcode == RIG_OK)
{
m_connected = true;
connect(&m_pollTimer, SIGNAL(timeout()), this, SLOT(pollingTick()));
m_pollTimer.start(m_settings.m_catPollingMs);
msg = AudioCATSISOSettings::MsgCATReportStatus::create(AudioCATSISOSettings::MsgCATReportStatus::StatusConnected);
}
else
@ -196,8 +259,12 @@ void AudioCATSISOCATWorker::catConnect()
void AudioCATSISOCATWorker::catDisconnect()
{
disconnect(&m_pollTimer, SIGNAL(timeout()), this, SLOT(pollingTick()));
m_pollTimer.stop();
if (m_pollTimer)
{
disconnect(m_pollTimer, SIGNAL(timeout()), this, SLOT(pollingTick()));
m_pollTimer->stop();
}
m_connected = false;
rig_close(m_rig); /* close port */
rig_cleanup(m_rig); /* if you care about memory */
@ -276,6 +343,10 @@ void AudioCATSISOCATWorker::pollingTick()
freq_t freq; // double
int retcode = rig_get_freq(m_rig, RIG_VFO_CURR, &freq);
if (m_settings.m_transverterMode) {
freq += m_settings.m_transverterDeltaFrequency;
}
if (retcode == RIG_OK)
{
// qDebug("AudioCATSISOCATWorker::pollingTick: %f %lu", freq, m_frequency);

View File

@ -21,12 +21,13 @@
#include <hamlib/rig.h>
#include <QObject>
#include <QTimer>
#include "util/message.h"
#include "util/messagequeue.h"
#include "audiocatsisosettings.h"
class QTimer;
class AudioCATSISOCATWorker : public QObject {
Q_OBJECT
@ -56,6 +57,39 @@ public:
{ }
};
class MsgPollTimerConnect : public Message {
MESSAGE_CLASS_DECLARATION
public:
static MsgPollTimerConnect* create() {
return new MsgPollTimerConnect();
}
protected:
MsgPollTimerConnect() :
Message()
{ }
};
class MsgSetRxSampleRate : public Message {
MESSAGE_CLASS_DECLARATION
public:
int getSampleRate() const { return m_sampleRate; }
static MsgSetRxSampleRate* create(int sampleRate) {
return new MsgSetRxSampleRate(sampleRate);
}
protected:
int m_sampleRate;
MsgSetRxSampleRate(int sampleRate) :
Message(),
m_sampleRate(sampleRate)
{ }
};
class MsgReportFrequency : public Message {
MESSAGE_CLASS_DECLARATION
@ -99,9 +133,10 @@ private:
bool m_connected;
AudioCATSISOSettings m_settings;
RIG *m_rig;
QTimer m_pollTimer;
QTimer *m_pollTimer;
bool m_ptt;
uint64_t m_frequency;
int m_rxSampleRate;
private slots:
void handleInputMessages();

View File

@ -424,6 +424,9 @@ void AudioCATSISOGUI::displaySettings()
{
blockApplySettings(true);
ui->transverter->setDeltaFrequency(m_settings.m_transverterDeltaFrequency);
ui->transverter->setDeltaFrequencyActive(m_settings.m_transverterMode);
ui->transverter->setIQOrder(m_settings.m_iqOrder);
ui->rxDeviceLabel->setText(m_settings.m_rxDeviceName);
ui->txDeviceLabel->setText(m_settings.m_txDeviceName);
ui->dcBlock->setChecked(m_settings.m_dcBlock);

View File

@ -73,6 +73,8 @@ void AudioCATSISOSettings::resetToDefaults()
m_pttSpectrumLink = true;
m_rxCenterFrequency = 14200000;
m_txCenterFrequency = 14200000;
m_transverterMode = false;
m_transverterDeltaFrequency = 0;
m_rxDeviceName = "";
m_rxVolume = 1.0f;
m_log2Decim = 0;
@ -106,6 +108,8 @@ AudioCATSISOSettings::AudioCATSISOSettings(const AudioCATSISOSettings& other)
m_pttSpectrumLink = other.m_pttSpectrumLink;
m_rxCenterFrequency = other.m_rxCenterFrequency;
m_txCenterFrequency = other.m_txCenterFrequency;
m_transverterMode = other.m_transverterMode;
m_transverterDeltaFrequency = other.m_transverterDeltaFrequency;
m_rxDeviceName = other.m_rxDeviceName;
m_rxVolume = other.m_rxVolume;
m_log2Decim = other.m_log2Decim;
@ -144,6 +148,8 @@ QByteArray AudioCATSISOSettings::serialize() const
s.writeBool(6, m_dcBlock);
s.writeBool(7, m_iqCorrection);
s.writeS32(8, (int) m_fcPosRx);
s.writeBool(9, m_transverterMode);
s.writeS64(10, m_transverterDeltaFrequency);
s.writeString(21, m_txDeviceName);
s.writeU64(22, m_txCenterFrequency);
@ -195,6 +201,8 @@ bool AudioCATSISOSettings::deserialize(const QByteArray& data)
d.readBool(7, &m_iqCorrection, false);
d.readS32(8, &intval, 2);
m_fcPosRx = (fcPos_t) intval;
d.readBool(9, &m_transverterMode, false);
d.readS64(10, &m_transverterDeltaFrequency, 0);
d.readString(21, &m_txDeviceName, "");
d.readU64(22, &m_txCenterFrequency, 14200000);
@ -239,6 +247,13 @@ bool AudioCATSISOSettings::deserialize(const QByteArray& data)
void AudioCATSISOSettings::applySettings(const QStringList& settingsKeys, const AudioCATSISOSettings& settings)
{
if (settingsKeys.contains("transverterMode")) {
m_transverterMode = settings.m_transverterMode;
}
if (settingsKeys.contains("transverterDeltaFrequency")) {
m_transverterDeltaFrequency = settings.m_transverterDeltaFrequency;
}
if (settingsKeys.contains("rxDeviceName")) {
m_rxDeviceName = settings.m_rxDeviceName;
}
@ -332,6 +347,13 @@ QString AudioCATSISOSettings::getDebugString(const QStringList& settingsKeys, bo
{
std::ostringstream ostr;
if (settingsKeys.contains("transverterMode") || force) {
ostr << " m_transverterMode: " << m_transverterMode;
}
if (settingsKeys.contains("transverterDeltaFrequency") || force) {
ostr << " m_transverterDeltaFrequency: " << m_transverterDeltaFrequency;
}
if (settingsKeys.contains("rxDeviceName") || force) {
ostr << " m_rxDeviceName: " << m_rxDeviceName.toStdString();
}