Initial commit of monitoring feature. Doesn't quite work due to not

understanding how to size Eigen vectors properly.
monitor
Elliott Liggett 2022-08-26 18:28:30 -07:00
rodzic b91c033ef6
commit 91b739bf68
12 zmienionych plików z 95 dodań i 8 usunięć

Wyświetl plik

@ -2,8 +2,15 @@
#include "logcategories.h" #include "logcategories.h"
#include "ulaw.h" #include "ulaw.h"
audioConverter::audioConverter(QObject* parent) : QObject(parent) audioConverter::audioConverter(sharedAudioType *m, bool isInputAudio, QObject* parent) : QObject(parent)
{ {
this->monitor = m;
this->isInputAudio = isInputAudio;
qDebug(logAudioConverter()) << "AudioConverter Monitor test: isInput: " << isInputAudio << ", monitor number: " << m->testNumber;
if(isInputAudio)
m->testNumber = 10;
else
m->testNumber = 9;
} }
bool audioConverter::init(QAudioFormat inFormat, QAudioFormat outFormat, quint8 opusComplexity, quint8 resampleQuality) bool audioConverter::init(QAudioFormat inFormat, QAudioFormat outFormat, quint8 opusComplexity, quint8 resampleQuality)
@ -54,6 +61,16 @@ bool audioConverter::init(QAudioFormat inFormat, QAudioFormat outFormat, quint8
resampleRatio = static_cast<double>(ratioDen) / ratioNum; resampleRatio = static_cast<double>(ratioDen) / ratioNum;
qInfo(logAudioConverter()) << "wf_resampler_init() returned: " << resampleError << " resampleRatio: " << resampleRatio; qInfo(logAudioConverter()) << "wf_resampler_init() returned: " << resampleError << " resampleRatio: " << resampleRatio;
} }
if((!this->isInputAudio) && (monitor != Q_NULLPTR) && (!monitor->allocated))
{
//monitor->audioData[0] = new Eigen::VectorXf;
//monitor->audioData[1] = new Eigen::VectorXf;
monitor->audioData[0].resize(320,1);
monitor->audioData[1].resize(320,1);
monitor->allocated = true;
}
return true; return true;
} }
@ -77,7 +94,7 @@ audioConverter::~audioConverter()
speex_resampler_destroy(resampler); speex_resampler_destroy(resampler);
qDebug(logAudioConverter()) << "Resampler closed"; qDebug(logAudioConverter()) << "Resampler closed";
} }
qDebug(logAudioConverter()) << "test number: " << monitor->testNumber;
} }
bool audioConverter::convert(audioPacket audio) bool audioConverter::convert(audioPacket audio)
@ -165,9 +182,21 @@ bool audioConverter::convert(audioPacket audio)
//audio.amplitudeRMS = samplesF.blueNorm(); // scale same as norm, too small. //audio.amplitudeRMS = samplesF.blueNorm(); // scale same as norm, too small.
if(isInputAudio && monitor && monitor->allocated)
{
monitor->audioData[(monitor->bufferWritePosition) %audioMonitorBufferSize] = samplesF;
monitor->bufferReadPosition = (monitor->bufferWritePosition) %audioMonitorBufferSize;
monitor->bufferWritePosition++;
}
// Set the volume // Set the volume
samplesF *= audio.volume; samplesF *= audio.volume;
if( (!isInputAudio) && monitor && monitor->allocated && monitor->monitorFeatureOn)
{
samplesF += (monitor->monitorVolume*monitor->audioData[monitor->bufferReadPosition]);
}
/* /*
samplesF is now an Eigen Vector of the current samples in float format samplesF is now an Eigen Vector of the current samples in float format
The next step is to convert to the correct number of channels in outFormat.channelCount() The next step is to convert to the correct number of channels in outFormat.channelCount()

Wyświetl plik

@ -21,6 +21,8 @@ enum audioType {qtAudio,portAudio,rtAudio};
#include "resampler/speex_resampler.h" #include "resampler/speex_resampler.h"
#include "audiomonitor.h"
#include "packettypes.h" #include "packettypes.h"
struct audioPacket { struct audioPacket {
@ -55,7 +57,7 @@ class audioConverter : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit audioConverter(QObject* parent = nullptr);; explicit audioConverter(sharedAudioType *m, bool isInputAudio, QObject* parent = nullptr);
~audioConverter(); ~audioConverter();
public slots: public slots:
@ -75,6 +77,8 @@ protected:
quint8 resampleQuality = 4; quint8 resampleQuality = 4;
double resampleRatio=1.0; // Default resample ratio is 1:1 double resampleRatio=1.0; // Default resample ratio is 1:1
quint32 lastAudioSequence; quint32 lastAudioSequence;
sharedAudioType *monitor;
bool isInputAudio = false;
}; };

Wyświetl plik

@ -35,8 +35,16 @@ audioHandler::~audioHandler()
delete audioOutput; delete audioOutput;
audioOutput = Q_NULLPTR; audioOutput = Q_NULLPTR;
} }
}
}bool audioHandler::init(audioSetup setup) void audioHandler::setSharedAudioData(sharedAudioType *m)
{
// no allocation is handled here, we merely point to the new
// item.
monitorAudio = m;
}
bool audioHandler::init(audioSetup setup)
{ {
if (isInitialized) { if (isInitialized) {
return false; return false;
@ -132,7 +140,7 @@ audioHandler::~audioHandler()
// We "hopefully" now have a valid format that is supported so try connecting // We "hopefully" now have a valid format that is supported so try connecting
converter = new audioConverter(); converter = new audioConverter(monitorAudio, setup.isinput);
converterThread = new QThread(this); converterThread = new QThread(this);
if (setup.isinput) { if (setup.isinput) {
converterThread->setObjectName("audioConvIn()"); converterThread->setObjectName("audioConvIn()");
@ -230,7 +238,7 @@ void audioHandler::stop()
void audioHandler::setVolume(unsigned char volume) void audioHandler::setVolume(unsigned char volume)
{ {
this->volume = audiopot[volume]; this->volume = audiopot[volume];
qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << "setVolume: " << volume << "(" << this->volume << ")"; //qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << "setVolume: " << volume << "(" << this->volume << ")";
} }

Wyświetl plik

@ -31,6 +31,7 @@
/* Audio converter class*/ /* Audio converter class*/
#include "audioconverter.h" #include "audioconverter.h"
#include "audiomonitor.h"
#define MULAW_BIAS 33 #define MULAW_BIAS 33
#define MULAW_MAX 0x1fff #define MULAW_MAX 0x1fff
@ -50,8 +51,11 @@ public:
virtual void start(); virtual void start();
virtual void stop(); virtual void stop();
virtual void setSharedAudioData(sharedAudioType *m);
virtual quint16 getAmplitude(); virtual quint16 getAmplitude();
sharedAudioType *monitorAudio = Q_NULLPTR;
public slots: public slots:
virtual bool init(audioSetup setup); virtual bool init(audioSetup setup);
@ -121,6 +125,7 @@ private:
OpusEncoder* encoder = Q_NULLPTR; OpusEncoder* encoder = Q_NULLPTR;
OpusDecoder* decoder = Q_NULLPTR; OpusDecoder* decoder = Q_NULLPTR;
QTimer* underTimer; QTimer* underTimer;
}; };

27
audiomonitor.h 100644
Wyświetl plik

@ -0,0 +1,27 @@
#ifndef AUDIOMONITOR_H
#define AUDIOMONITOR_H
#define audioMonitorBufferSize (2)
/* Opus and Eigen */
#ifdef Q_OS_WIN
#include "opus.h"
#include <Eigen/Eigen>
#else
#include "opus/opus.h"
#include <eigen3/Eigen/Eigen>
#endif
struct sharedAudioType
{
bool monitorFeatureOn = false;
bool allocated = false;
float monitorVolume = 1.0;
int testNumber = 0; // TODO: Remove test variable
int bufferWritePosition = 0;
int bufferReadPosition = 0;
Eigen::VectorXf audioData[audioMonitorBufferSize];// = {Q_NULLPTR};
void *data = Q_NULLPTR;
};
#endif // AUDIOMONITOR_H

Wyświetl plik

@ -114,7 +114,7 @@ bool paHandler::init(audioSetup setup)
// We "hopefully" now have a valid format that is supported so try connecting // We "hopefully" now have a valid format that is supported so try connecting
converter = new audioConverter(); converter = new audioConverter(monitorAudio, setup.isinput);
converterThread = new QThread(this); converterThread = new QThread(this);
if (setup.isinput) { if (setup.isinput) {
converterThread->setObjectName("audioConvIn()"); converterThread->setObjectName("audioConvIn()");

Wyświetl plik

@ -22,6 +22,7 @@
/* Audio converter class*/ /* Audio converter class*/
#include "audioconverter.h" #include "audioconverter.h"
#include "audiomonitor.h"
#include <QDebug> #include <QDebug>

Wyświetl plik

@ -180,7 +180,7 @@ bool rtHandler::init(audioSetup setup)
"Sample Rate" << outFormat.sampleRate() << "Codec" << outFormat.codec() << "Sample Type" << outFormat.sampleType(); "Sample Rate" << outFormat.sampleRate() << "Codec" << outFormat.codec() << "Sample Type" << outFormat.sampleType();
// We "hopefully" now have a valid format that is supported so try connecting // We "hopefully" now have a valid format that is supported so try connecting
converter = new audioConverter(); converter = new audioConverter(monitorAudio, setup.isinput);
converterThread = new QThread(this); converterThread = new QThread(this);
if (setup.isinput) { if (setup.isinput) {
converterThread->setObjectName("audioConvIn()"); converterThread->setObjectName("audioConvIn()");

Wyświetl plik

@ -28,6 +28,7 @@
#include "audiohandler.h" #include "audiohandler.h"
/* Audio converter class*/ /* Audio converter class*/
#include "audioconverter.h" #include "audioconverter.h"
#include "audiomonitor.h"
#include <QDebug> #include <QDebug>

Wyświetl plik

@ -19,6 +19,10 @@ udpAudio::udpAudio(QHostAddress local, QHostAddress ip, quint16 audioPort, quint
QUdpSocket::connect(udp, &QUdpSocket::readyRead, this, &udpAudio::dataReceived); QUdpSocket::connect(udp, &QUdpSocket::readyRead, this, &udpAudio::dataReceived);
monitorAudio.monitorFeatureOn = false;
monitorAudio.testNumber = 17; // TODO remove
monitorAudio.monitorVolume = 0.5;
monitorAudio.monitorFeatureOn = true;
startAudio(); startAudio();
watchdogTimer = new QTimer(); watchdogTimer = new QTimer();
@ -243,6 +247,9 @@ void udpAudio::startAudio() {
qCritical(logAudio()) << "Unsupported Receive Audio Handler selected!"; qCritical(logAudio()) << "Unsupported Receive Audio Handler selected!";
} }
rxaudio->setSharedAudioData(&monitorAudio);
rxAudioThread = new QThread(this); rxAudioThread = new QThread(this);
rxAudioThread->setObjectName("rxAudio()"); rxAudioThread->setObjectName("rxAudio()");
@ -280,6 +287,7 @@ void udpAudio::startAudio() {
{ {
qCritical(logAudio()) << "Unsupported Transmit Audio Handler selected!"; qCritical(logAudio()) << "Unsupported Transmit Audio Handler selected!";
} }
txaudio->setSharedAudioData(&monitorAudio);
txAudioThread = new QThread(this); txAudioThread = new QThread(this);
rxAudioThread->setObjectName("txAudio()"); rxAudioThread->setObjectName("txAudio()");

Wyświetl plik

@ -31,6 +31,8 @@
#include "pahandler.h" #include "pahandler.h"
#include "rthandler.h" #include "rthandler.h"
#include "audiomonitor.h"
// Class for all audio communications. // Class for all audio communications.
class udpAudio : public udpBase class udpAudio : public udpBase
@ -69,6 +71,7 @@ private:
void startAudio(); void startAudio();
audioSetup rxSetup; audioSetup rxSetup;
audioSetup txSetup; audioSetup txSetup;
sharedAudioType monitorAudio;
uint16_t sendAudioSeq = 0; uint16_t sendAudioSeq = 0;

Wyświetl plik

@ -176,6 +176,7 @@ SOURCES += main.cpp\
aboutbox.cpp aboutbox.cpp
HEADERS += wfmain.h \ HEADERS += wfmain.h \
audiomonitor.h \
colorprefs.h \ colorprefs.h \
commhandler.h \ commhandler.h \
rigcommander.h \ rigcommander.h \