Fixed up signals and slots related to audio levels, removed extra junk

code, added preliminary RMS and Peak audio availablility.
monitor
Elliott Liggett 2022-08-24 15:02:00 -07:00
rodzic d90eb6f11f
commit 4ea7ec8090
10 zmienionych plików z 64 dodań i 54 usunięć

Wyświetl plik

@ -271,17 +271,10 @@ void audioHandler::convertedOutput(audioPacket packet) {
*/ */
lastSentSeq = packet.seq; lastSentSeq = packet.seq;
amplitude = packet.amplitudePeak; amplitude = packet.amplitudePeak;
computeLevels(); emit haveLevels(getAmplitude(), static_cast<quint16>(packet.amplitudeRMS * 255.0), setup.latency, currentLatency, isUnderrun, isOverrun);
emit haveLevels(getAmplitude(), setup.latency, currentLatency, isUnderrun, isOverrun);
} }
} }
void audioHandler::computeLevels()
{
if(levelMean)
levelMean[(levelPosition++)%levelSize] = amplitude * 255;
}
void audioHandler::getNextAudioChunk() void audioHandler::getNextAudioChunk()
{ {
if (audioDevice) { if (audioDevice) {
@ -319,7 +312,7 @@ void audioHandler::convertedInput(audioPacket audio)
} }
lastReceived = QTime::currentTime(); lastReceived = QTime::currentTime();
amplitude = audio.amplitudePeak; amplitude = audio.amplitudePeak;
emit haveLevels(getAmplitude(), setup.latency, currentLatency, isUnderrun, isOverrun); emit haveLevels(getAmplitude(), audio.amplitudeRMS, setup.latency, currentLatency, isUnderrun, isOverrun);
} }
} }

Wyświetl plik

@ -70,7 +70,7 @@ signals:
void audioMessage(QString message); void audioMessage(QString message);
void sendLatency(quint16 newSize); void sendLatency(quint16 newSize);
void haveAudioData(const audioPacket& data); void haveAudioData(const audioPacket& data);
void haveLevels(quint16 amplitude,quint16 latency,quint16 current,bool under,bool over); void haveLevels(quint16 amplitudePeak, quint16 amplitudeRMS, quint16 latency,quint16 current,bool under,bool over);
void setupConverter(QAudioFormat in, QAudioFormat out, quint8 opus, quint8 resamp); void setupConverter(QAudioFormat in, QAudioFormat out, quint8 opus, quint8 resamp);
void sendToConverter(audioPacket audio); void sendToConverter(audioPacket audio);
@ -116,12 +116,6 @@ private:
float amplitude=0.0; float amplitude=0.0;
qreal volume = 1.0; qreal volume = 1.0;
unsigned char *levelMean = Q_NULLPTR;
unsigned char *levelPeak = Q_NULLPTR;
unsigned char levelSize = 50;
unsigned char levelPosition = 0;
void computeLevels();
audioSetup setup; audioSetup setup;
OpusEncoder* encoder = Q_NULLPTR; OpusEncoder* encoder = Q_NULLPTR;

Wyświetl plik

@ -279,7 +279,7 @@ void paHandler::convertedOutput(audioPacket packet) {
} }
amplitude = packet.amplitudePeak; amplitude = packet.amplitudePeak;
emit haveLevels(getAmplitude(), setup.latency, currentLatency, isUnderrun, isOverrun); emit haveLevels(getAmplitude(), static_cast<quint16>(packet.amplitudeRMS * 255.0), setup.latency, currentLatency, isUnderrun, isOverrun);
} }
} }
@ -292,7 +292,7 @@ void paHandler::convertedInput(audioPacket packet)
amplitude = packet.amplitudePeak; amplitude = packet.amplitudePeak;
const PaStreamInfo* info = Pa_GetStreamInfo(audio); const PaStreamInfo* info = Pa_GetStreamInfo(audio);
currentLatency = packet.time.msecsTo(QTime::currentTime()) + (info->inputLatency * 1000); currentLatency = packet.time.msecsTo(QTime::currentTime()) + (info->inputLatency * 1000);
emit haveLevels(getAmplitude(), setup.latency, currentLatency, isUnderrun, isOverrun); emit haveLevels(getAmplitude(), packet.amplitudeRMS, setup.latency, currentLatency, isUnderrun, isOverrun);
} }
} }

Wyświetl plik

@ -55,7 +55,7 @@ signals:
void audioMessage(QString message); void audioMessage(QString message);
void sendLatency(quint16 newSize); void sendLatency(quint16 newSize);
void haveAudioData(const audioPacket& data); void haveAudioData(const audioPacket& data);
void haveLevels(quint16 amplitude, quint16 latency, quint16 current, bool under, bool over); void haveLevels(quint16 amplitudePeak, quint16 amplitudeRMS, quint16 latency, quint16 current, bool under, bool over);
void setupConverter(QAudioFormat in, QAudioFormat out, quint8 opus, quint8 resamp); void setupConverter(QAudioFormat in, QAudioFormat out, quint8 opus, quint8 resamp);
void sendToConverter(audioPacket audio); void sendToConverter(audioPacket audio);

Wyświetl plik

@ -333,7 +333,7 @@ void rtHandler::convertedOutput(audioPacket packet)
audioMutex.unlock(); audioMutex.unlock();
amplitude = packet.amplitudePeak; amplitude = packet.amplitudePeak;
currentLatency = packet.time.msecsTo(QTime::currentTime()) + (outFormat.durationForBytes(audio->getStreamLatency() * (outFormat.sampleSize() / 8) * outFormat.channelCount())/1000); currentLatency = packet.time.msecsTo(QTime::currentTime()) + (outFormat.durationForBytes(audio->getStreamLatency() * (outFormat.sampleSize() / 8) * outFormat.channelCount())/1000);
emit haveLevels(getAmplitude(), setup.latency, currentLatency, isUnderrun, isOverrun); emit haveLevels(getAmplitude(), packet.amplitudeRMS, setup.latency, currentLatency, isUnderrun, isOverrun);
} }
@ -344,7 +344,7 @@ void rtHandler::convertedInput(audioPacket packet)
emit haveAudioData(packet); emit haveAudioData(packet);
amplitude = packet.amplitudePeak; amplitude = packet.amplitudePeak;
currentLatency = packet.time.msecsTo(QTime::currentTime()) + (outFormat.durationForBytes(audio->getStreamLatency() * (outFormat.sampleSize() / 8) * outFormat.channelCount())/1000); currentLatency = packet.time.msecsTo(QTime::currentTime()) + (outFormat.durationForBytes(audio->getStreamLatency() * (outFormat.sampleSize() / 8) * outFormat.channelCount())/1000);
emit haveLevels(getAmplitude(), setup.latency, currentLatency, isUnderrun, isOverrun); emit haveLevels(getAmplitude(), static_cast<quint16>(packet.amplitudeRMS * 255.0), setup.latency, currentLatency, isUnderrun, isOverrun);
} }
} }

Wyświetl plik

@ -61,7 +61,7 @@ signals:
void audioMessage(QString message); void audioMessage(QString message);
void sendLatency(quint16 newSize); void sendLatency(quint16 newSize);
void haveAudioData(const audioPacket& data); void haveAudioData(const audioPacket& data);
void haveLevels(quint16 amplitude, quint16 latency, quint16 current, bool under, bool over); void haveLevels(quint16 amplitudePeak, quint16 amplitudeRMS, quint16 latency, quint16 current, bool under, bool over);
void setupConverter(QAudioFormat in, QAudioFormat out, quint8 opus, quint8 resamp); void setupConverter(QAudioFormat in, QAudioFormat out, quint8 opus, quint8 resamp);
void sendToConverter(audioPacket audio); void sendToConverter(audioPacket audio);

Wyświetl plik

@ -159,13 +159,13 @@ void udpAudio::setVolume(unsigned char value)
emit haveSetVolume(value); emit haveSetVolume(value);
} }
void udpAudio::getRxLevels(quint16 amplitude, quint16 latency, quint16 current, bool under, bool over) { void udpAudio::getRxLevels(quint16 amplitudePeak, quint16 amplitudeRMS, quint16 latency, quint16 current, bool under, bool over) {
emit haveRxLevels(amplitude, latency, current, under, over); emit haveRxLevels(amplitudePeak, amplitudeRMS, latency, current, under, over);
} }
void udpAudio::getTxLevels(quint16 amplitude, quint16 latency, quint16 current, bool under, bool over) { void udpAudio::getTxLevels(quint16 amplitudePeak, quint16 amplitudeRMS, quint16 latency, quint16 current, bool under, bool over) {
emit haveTxLevels(amplitude, latency, current, under, over); emit haveTxLevels(amplitudePeak, amplitudeRMS, latency, current, under, over);
} }
void udpAudio::dataReceived() void udpAudio::dataReceived()
@ -256,7 +256,7 @@ void udpAudio::startAudio() {
connect(this, SIGNAL(haveAudioData(audioPacket)), rxaudio, SLOT(incomingAudio(audioPacket))); connect(this, SIGNAL(haveAudioData(audioPacket)), rxaudio, SLOT(incomingAudio(audioPacket)));
connect(this, SIGNAL(haveChangeLatency(quint16)), rxaudio, SLOT(changeLatency(quint16))); connect(this, SIGNAL(haveChangeLatency(quint16)), rxaudio, SLOT(changeLatency(quint16)));
connect(this, SIGNAL(haveSetVolume(unsigned char)), rxaudio, SLOT(setVolume(unsigned char))); connect(this, SIGNAL(haveSetVolume(unsigned char)), rxaudio, SLOT(setVolume(unsigned char)));
connect(rxaudio, SIGNAL(haveLevels(quint16, quint16, quint16, bool, bool)), this, SLOT(getRxLevels(quint16, quint16, quint16, bool, bool))); connect(rxaudio, SIGNAL(haveLevels(quint16, quint16, quint16, quint16, bool, bool)), this, SLOT(getRxLevels(quint16, quint16, quint16, quint16, bool, bool)));
connect(rxAudioThread, SIGNAL(finished()), rxaudio, SLOT(deleteLater())); connect(rxAudioThread, SIGNAL(finished()), rxaudio, SLOT(deleteLater()));
@ -290,7 +290,7 @@ void udpAudio::startAudio() {
connect(this, SIGNAL(setupTxAudio(audioSetup)), txaudio, SLOT(init(audioSetup))); connect(this, SIGNAL(setupTxAudio(audioSetup)), txaudio, SLOT(init(audioSetup)));
connect(txaudio, SIGNAL(haveAudioData(audioPacket)), this, SLOT(receiveAudioData(audioPacket))); connect(txaudio, SIGNAL(haveAudioData(audioPacket)), this, SLOT(receiveAudioData(audioPacket)));
connect(txaudio, SIGNAL(haveLevels(quint16, quint16, quint16, bool, bool)), this, SLOT(getTxLevels(quint16, quint16, quint16, bool, bool))); connect(txaudio, SIGNAL(haveLevels(quint16, quint16, quint16, quint16, bool, bool)), this, SLOT(getTxLevels(quint16, quint16, quint16, quint16, bool, bool)));
connect(txAudioThread, SIGNAL(finished()), txaudio, SLOT(deleteLater())); connect(txAudioThread, SIGNAL(finished()), txaudio, SLOT(deleteLater()));
emit setupTxAudio(txSetup); emit setupTxAudio(txSetup);

Wyświetl plik

@ -51,14 +51,14 @@ signals:
void haveChangeLatency(quint16 value); void haveChangeLatency(quint16 value);
void haveSetVolume(unsigned char value); void haveSetVolume(unsigned char value);
void haveRxLevels(quint16 amplitude, quint16 latency, quint16 current, bool under, bool over); void haveRxLevels(quint16 amplitudePeak, quint16 amplitudeRMS, quint16 latency, quint16 current, bool under, bool over);
void haveTxLevels(quint16 amplitude, quint16 latency, quint16 current, bool under, bool over); void haveTxLevels(quint16 amplitudePeak, quint16 amplitudeRMS, quint16 latency, quint16 current, bool under, bool over);
public slots: public slots:
void changeLatency(quint16 value); void changeLatency(quint16 value);
void setVolume(unsigned char value); void setVolume(unsigned char value);
void getRxLevels(quint16 amplitude, quint16 latency, quint16 current, bool under, bool over); void getRxLevels(quint16 amplitude, quint16 amplitudeRMS, quint16 latency, quint16 current, bool under, bool over);
void getTxLevels(quint16 amplitude, quint16 latency, quint16 current, bool under, bool over); void getTxLevels(quint16 amplitude, quint16 amplitudeRMS, quint16 latency, quint16 current, bool under, bool over);
void receiveAudioData(audioPacket audio); void receiveAudioData(audioPacket audio);
private: private:
@ -85,4 +85,4 @@ private:
}; };
#endif #endif

Wyświetl plik

@ -143,41 +143,50 @@ void udpHandler::receiveDataFromUserToRig(QByteArray data)
} }
} }
void udpHandler::getRxLevels(quint16 amplitude,quint16 latency,quint16 current, bool under, bool over) { void udpHandler::getRxLevels(quint16 amplitudePeak, quint16 amplitudeRMS,quint16 latency,quint16 current, bool under, bool over) {
status.rxAudioLevel = amplitude; status.rxAudioLevel = amplitudePeak;
status.rxLatency = latency; status.rxLatency = latency;
status.rxCurrentLatency = current; status.rxCurrentLatency = current;
status.rxUnderrun = under; status.rxUnderrun = under;
status.rxOverrun = over; status.rxOverrun = over;
audioLevelsRxPeak[(audioLevelsRxPeakPosition++)%audioLevelBufferSize] = amplitude; audioLevelsRxPeak[(audioLevelsRxPosition)%audioLevelBufferSize] = amplitudePeak;
if((audioLevelsRxPeakPosition++)%3 == 0) audioLevelsRxRMS[(audioLevelsRxPosition)%audioLevelBufferSize] = amplitudeRMS;
if((audioLevelsRxPosition)%3 == 0)
{ {
// calculate mean and emit signal // calculate mean and emit signal
unsigned char mean = findMean(audioLevelsRxPeak); unsigned char meanPeak = findMax(audioLevelsRxPeak);
unsigned char meanRMS = findMean(audioLevelsRxRMS);
networkAudioLevels l; networkAudioLevels l;
l.haveRxLevels = true; l.haveRxLevels = true;
l.rxAudioPeak = mean; l.rxAudioPeak = meanPeak;
//qDebug(logSystem()) << "audio level meter being emitted from udpHandler"; l.rxAudioRMS = meanRMS;
emit haveNetworkAudioLevels(l); emit haveNetworkAudioLevels(l);
} }
audioLevelsRxPosition++;
} }
void udpHandler::getTxLevels(quint16 amplitude,quint16 latency, quint16 current, bool under, bool over) { void udpHandler::getTxLevels(quint16 amplitudePeak, quint16 amplitudeRMS ,quint16 latency, quint16 current, bool under, bool over) {
status.txAudioLevel = amplitude; status.txAudioLevel = amplitudePeak;
status.txLatency = latency; status.txLatency = latency;
status.txCurrentLatency = current; status.txCurrentLatency = current;
status.txUnderrun = under; status.txUnderrun = under;
status.txOverrun = over; status.txOverrun = over;
audioLevelsTxPeak[(audioLevelsTxPeakPosition++)%audioLevelBufferSize] = amplitude; audioLevelsTxPeak[(audioLevelsTxPosition)%audioLevelBufferSize] = amplitudePeak;
if((audioLevelsTxPeakPosition++)%3 == 0) audioLevelsTxRMS[(audioLevelsTxPosition)%audioLevelBufferSize] = amplitudeRMS;
if((audioLevelsTxPosition)%3 == 0)
{ {
// calculate mean and emit signal // calculate mean and emit signal
unsigned char mean = findMean(audioLevelsTxPeak); unsigned char meanPeak = findMax(audioLevelsTxPeak);
unsigned char meanRMS = findMean(audioLevelsTxRMS);
networkAudioLevels l; networkAudioLevels l;
l.haveTxLevels = true; l.haveTxLevels = true;
l.txAudioPeak = mean; l.txAudioPeak = meanPeak;
l.txAudioRMS = meanRMS;
emit haveNetworkAudioLevels(l); emit haveNetworkAudioLevels(l);
} }
audioLevelsTxPosition++;
} }
unsigned char udpHandler::findMean(unsigned char *data) unsigned char udpHandler::findMean(unsigned char *data)
@ -190,6 +199,17 @@ unsigned char udpHandler::findMean(unsigned char *data)
return sum / audioLevelBufferSize; return sum / audioLevelBufferSize;
} }
unsigned char udpHandler::findMax(unsigned char *data)
{
unsigned int max=0;
for(int p=0; p < audioLevelBufferSize; p++)
{
if(data[p] > max)
max = data[p];
}
return max;
}
void udpHandler::dataReceived() void udpHandler::dataReceived()
{ {
while (udp->hasPendingDatagrams()) { while (udp->hasPendingDatagrams()) {
@ -348,8 +368,8 @@ void udpHandler::dataReceived()
QObject::connect(audio, SIGNAL(haveAudioData(audioPacket)), this, SLOT(receiveAudioData(audioPacket))); QObject::connect(audio, SIGNAL(haveAudioData(audioPacket)), this, SLOT(receiveAudioData(audioPacket)));
QObject::connect(this, SIGNAL(haveChangeLatency(quint16)), audio, SLOT(changeLatency(quint16))); QObject::connect(this, SIGNAL(haveChangeLatency(quint16)), audio, SLOT(changeLatency(quint16)));
QObject::connect(this, SIGNAL(haveSetVolume(unsigned char)), audio, SLOT(setVolume(unsigned char))); QObject::connect(this, SIGNAL(haveSetVolume(unsigned char)), audio, SLOT(setVolume(unsigned char)));
QObject::connect(audio, SIGNAL(haveRxLevels(quint16, quint16, quint16, bool, bool)), this, SLOT(getRxLevels(quint16, quint16, quint16, bool, bool))); QObject::connect(audio, SIGNAL(haveRxLevels(quint16, quint16, quint16, quint16, bool, bool)), this, SLOT(getRxLevels(quint16, quint16, quint16, quint16, bool, bool)));
QObject::connect(audio, SIGNAL(haveTxLevels(quint16, quint16, quint16, bool, bool)), this, SLOT(getTxLevels(quint16, quint16, quint16, bool, bool))); QObject::connect(audio, SIGNAL(haveTxLevels(quint16, quint16, quint16, quint16, bool, bool)), this, SLOT(getTxLevels(quint16, quint16, quint16, quint16, bool, bool)));
} }
qInfo(logUdp()) << this->metaObject()->className() << "Got serial and audio request success, device name: " << devName; qInfo(logUdp()) << this->metaObject()->className() << "Got serial and audio request success, device name: " << devName;

Wyświetl plik

@ -56,10 +56,8 @@ public slots:
void setVolume(unsigned char value); void setVolume(unsigned char value);
void init(); void init();
void setCurrentRadio(quint8 radio); void setCurrentRadio(quint8 radio);
void getRxLevels(quint16 amplitude, quint16 latency, quint16 current, bool under, bool over); void getRxLevels(quint16 amplitudePeak, quint16 amplitudeRMS, quint16 latency, quint16 current, bool under, bool over);
void getTxLevels(quint16 amplitude, quint16 latency, quint16 current, bool under, bool over); void getTxLevels(quint16 amplitudePeak, quint16 amplitudeRMS, quint16 latency, quint16 current, bool under, bool over);
//void handleRxLevels(networkAudioLevels);
//void handleTxLevels(networkAudioLevels);
signals: signals:
void haveDataFromPort(QByteArray data); // emit this when we have data, connect to rigcommander void haveDataFromPort(QByteArray data); // emit this when we have data, connect to rigcommander
@ -127,9 +125,14 @@ private:
unsigned char audioLevelsTxPeak[audioLevelBufferSize]; unsigned char audioLevelsTxPeak[audioLevelBufferSize];
unsigned char audioLevelsRxPeak[audioLevelBufferSize]; unsigned char audioLevelsRxPeak[audioLevelBufferSize];
unsigned char audioLevelsTxPeakPosition = 0;
unsigned char audioLevelsRxPeakPosition = 0; unsigned char audioLevelsTxRMS[audioLevelBufferSize];
unsigned char audioLevelsRxRMS[audioLevelBufferSize];
unsigned char audioLevelsTxPosition = 0;
unsigned char audioLevelsRxPosition = 0;
unsigned char findMean(unsigned char *d); unsigned char findMean(unsigned char *d);
unsigned char findMax(unsigned char *d);
}; };