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 "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()
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
// 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()");
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
/* Audio converter class*/
|
/* Audio converter class*/
|
||||||
#include "audioconverter.h"
|
#include "audioconverter.h"
|
||||||
|
#include "audiomonitor.h"
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
|
|
|
@ -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()");
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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()");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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 \
|
||||||
|
|
Ładowanie…
Reference in New Issue