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 "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)
@ -54,6 +61,16 @@ bool audioConverter::init(QAudioFormat inFormat, QAudioFormat outFormat, quint8
resampleRatio = static_cast<double>(ratioDen) / ratioNum;
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;
}
@ -77,7 +94,7 @@ audioConverter::~audioConverter()
speex_resampler_destroy(resampler);
qDebug(logAudioConverter()) << "Resampler closed";
}
qDebug(logAudioConverter()) << "test number: " << monitor->testNumber;
}
bool audioConverter::convert(audioPacket audio)
@ -165,9 +182,21 @@ bool audioConverter::convert(audioPacket audio)
//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
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
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 "audiomonitor.h"
#include "packettypes.h"
struct audioPacket {
@ -55,7 +57,7 @@ class audioConverter : public QObject
Q_OBJECT
public:
explicit audioConverter(QObject* parent = nullptr);;
explicit audioConverter(sharedAudioType *m, bool isInputAudio, QObject* parent = nullptr);
~audioConverter();
public slots:
@ -75,6 +77,8 @@ protected:
quint8 resampleQuality = 4;
double resampleRatio=1.0; // Default resample ratio is 1:1
quint32 lastAudioSequence;
sharedAudioType *monitor;
bool isInputAudio = false;
};

Wyświetl plik

@ -35,8 +35,16 @@ audioHandler::~audioHandler()
delete audioOutput;
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) {
return false;
@ -132,7 +140,7 @@ audioHandler::~audioHandler()
// 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);
if (setup.isinput) {
converterThread->setObjectName("audioConvIn()");
@ -230,7 +238,7 @@ void audioHandler::stop()
void audioHandler::setVolume(unsigned char 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*/
#include "audioconverter.h"
#include "audiomonitor.h"
#define MULAW_BIAS 33
#define MULAW_MAX 0x1fff
@ -50,8 +51,11 @@ public:
virtual void start();
virtual void stop();
virtual void setSharedAudioData(sharedAudioType *m);
virtual quint16 getAmplitude();
sharedAudioType *monitorAudio = Q_NULLPTR;
public slots:
virtual bool init(audioSetup setup);
@ -121,6 +125,7 @@ private:
OpusEncoder* encoder = Q_NULLPTR;
OpusDecoder* decoder = Q_NULLPTR;
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
converter = new audioConverter();
converter = new audioConverter(monitorAudio, setup.isinput);
converterThread = new QThread(this);
if (setup.isinput) {
converterThread->setObjectName("audioConvIn()");

Wyświetl plik

@ -22,6 +22,7 @@
/* Audio converter class*/
#include "audioconverter.h"
#include "audiomonitor.h"
#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();
// 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);
if (setup.isinput) {
converterThread->setObjectName("audioConvIn()");

Wyświetl plik

@ -28,6 +28,7 @@
#include "audiohandler.h"
/* Audio converter class*/
#include "audioconverter.h"
#include "audiomonitor.h"
#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);
monitorAudio.monitorFeatureOn = false;
monitorAudio.testNumber = 17; // TODO remove
monitorAudio.monitorVolume = 0.5;
monitorAudio.monitorFeatureOn = true;
startAudio();
watchdogTimer = new QTimer();
@ -243,6 +247,9 @@ void udpAudio::startAudio() {
qCritical(logAudio()) << "Unsupported Receive Audio Handler selected!";
}
rxaudio->setSharedAudioData(&monitorAudio);
rxAudioThread = new QThread(this);
rxAudioThread->setObjectName("rxAudio()");
@ -280,6 +287,7 @@ void udpAudio::startAudio() {
{
qCritical(logAudio()) << "Unsupported Transmit Audio Handler selected!";
}
txaudio->setSharedAudioData(&monitorAudio);
txAudioThread = new QThread(this);
rxAudioThread->setObjectName("txAudio()");

Wyświetl plik

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

Wyświetl plik

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