diff --git a/audioconverter.cpp b/audioconverter.cpp index 58fd58f..d5131ca 100644 --- a/audioconverter.cpp +++ b/audioconverter.cpp @@ -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(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() diff --git a/audioconverter.h b/audioconverter.h index b3a1492..3a3cdb5 100644 --- a/audioconverter.h +++ b/audioconverter.h @@ -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; }; diff --git a/audiohandler.cpp b/audiohandler.cpp index 3f68bd8..ec9d224 100644 --- a/audiohandler.cpp +++ b/audiohandler.cpp @@ -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 << ")"; } diff --git a/audiohandler.h b/audiohandler.h index 760b215..ba99b38 100644 --- a/audiohandler.h +++ b/audiohandler.h @@ -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; + }; diff --git a/audiomonitor.h b/audiomonitor.h new file mode 100644 index 0000000..b66d696 --- /dev/null +++ b/audiomonitor.h @@ -0,0 +1,27 @@ +#ifndef AUDIOMONITOR_H +#define AUDIOMONITOR_H + +#define audioMonitorBufferSize (2) + +/* Opus and Eigen */ +#ifdef Q_OS_WIN +#include "opus.h" +#include +#else +#include "opus/opus.h" +#include +#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 diff --git a/pahandler.cpp b/pahandler.cpp index d27886c..fd9f3c6 100644 --- a/pahandler.cpp +++ b/pahandler.cpp @@ -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()"); diff --git a/pahandler.h b/pahandler.h index c9bd474..e3248ff 100644 --- a/pahandler.h +++ b/pahandler.h @@ -22,6 +22,7 @@ /* Audio converter class*/ #include "audioconverter.h" +#include "audiomonitor.h" #include diff --git a/rthandler.cpp b/rthandler.cpp index b203402..90867d5 100644 --- a/rthandler.cpp +++ b/rthandler.cpp @@ -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()"); diff --git a/rthandler.h b/rthandler.h index 2b73b12..07749ec 100644 --- a/rthandler.h +++ b/rthandler.h @@ -28,6 +28,7 @@ #include "audiohandler.h" /* Audio converter class*/ #include "audioconverter.h" +#include "audiomonitor.h" #include diff --git a/udpaudio.cpp b/udpaudio.cpp index 1326a67..67d4695 100644 --- a/udpaudio.cpp +++ b/udpaudio.cpp @@ -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()"); diff --git a/udpaudio.h b/udpaudio.h index 3ab6d42..044972d 100644 --- a/udpaudio.h +++ b/udpaudio.h @@ -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; diff --git a/wfview.pro b/wfview.pro index 1e9d2b3..69d500c 100644 --- a/wfview.pro +++ b/wfview.pro @@ -176,6 +176,7 @@ SOURCES += main.cpp\ aboutbox.cpp HEADERS += wfmain.h \ + audiomonitor.h \ colorprefs.h \ commhandler.h \ rigcommander.h \