kopia lustrzana https://gitlab.com/eliggett/wfview
Initial commit of monitoring feature. Doesn't quite work due to not
understanding how to size Eigen vectors properly.monitor
rodzic
b91c033ef6
commit
91b739bf68
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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 << ")";
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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()");
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
|
||||
/* Audio converter class*/
|
||||
#include "audioconverter.h"
|
||||
#include "audiomonitor.h"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
|
|
|
@ -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()");
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include "audiohandler.h"
|
||||
/* Audio converter class*/
|
||||
#include "audioconverter.h"
|
||||
#include "audiomonitor.h"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
|
|
|
@ -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()");
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -176,6 +176,7 @@ SOURCES += main.cpp\
|
|||
aboutbox.cpp
|
||||
|
||||
HEADERS += wfmain.h \
|
||||
audiomonitor.h \
|
||||
colorprefs.h \
|
||||
commhandler.h \
|
||||
rigcommander.h \
|
||||
|
|
Ładowanie…
Reference in New Issue