Make audio input buffer a qMap

merge-requests/4/head
Phil Taylor 2021-05-17 16:19:36 +01:00
rodzic 02b9311931
commit bada37acdf
6 zmienionych plików z 13 dodań i 19 usunięć

Wyświetl plik

@ -977,14 +977,14 @@ qint64 audioHandler::readData(char* data, qint64 maxlen)
// We must lock the mutex for the entire time that the buffer may be modified.
// Get next packet from buffer.
if (!audioBuffer.isEmpty())
if (!inputBuffer.isEmpty())
{
// Output buffer is ALWAYS 16 bit.
QMutexLocker locker(&mutex);
auto packet = audioBuffer.begin();
auto packet = inputBuffer.begin();
while (packet != audioBuffer.end() && sentlen < maxlen)
while (packet != inputBuffer.end() && sentlen < maxlen)
{
int timediff = packet->time.msecsTo(QTime::currentTime());
@ -992,12 +992,12 @@ qint64 audioHandler::readData(char* data, qint64 maxlen)
qInfo(logAudio()) << (isInput ? "Input" : "Output") << "Packet " << hex << packet->seq <<
" arrived too late (increase output latency!) " <<
dec << packet->time.msecsTo(QTime::currentTime()) << "ms";
while (packet !=audioBuffer.end() && timediff > (int)latency) {
while (packet !=inputBuffer.end() && timediff > (int)latency) {
timediff = packet->time.msecsTo(QTime::currentTime());
lastSeq=packet->seq;
packet = audioBuffer.erase(packet); // returns next packet
packet = inputBuffer.erase(packet); // returns next packet
}
if (packet == audioBuffer.end()) {
if (packet == inputBuffer.end()) {
break;
}
}
@ -1017,7 +1017,7 @@ qint64 audioHandler::readData(char* data, qint64 maxlen)
if (send == packet->dataout.length() - packet->sent)
{
//qInfo(logAudio()) << "Get next packet";
packet = audioBuffer.erase(packet); // returns next packet
packet = inputBuffer.erase(packet); // returns next packet
}
else
{
@ -1192,14 +1192,7 @@ void audioHandler::incomingAudio(audioPacket data)
data.dataout = data.datain;
}
audioBuffer.push_back(data);
// Sort the buffer by seq number. This is important and audio packets may have arrived out-of-order
std::sort(audioBuffer.begin(), audioBuffer.end(),
[](const audioPacket& a, const audioPacket& b) -> bool
{
return a.seq < b.seq;
});
inputBuffer.insert(data.seq, data);
// Restart playback
if (audioOutput->state() == QAudio::SuspendedState)

Wyświetl plik

@ -15,6 +15,7 @@
#include <QThread>
#include <QTimer>
#include <QTime>
#include <QMap>
#include "resampler/speex_resampler.h"
#include <QDebug>
@ -92,7 +93,8 @@ private:
quint16 radioSampleRate;
quint8 radioSampleBits;
quint8 radioChannels;
QVector<audioPacket> audioBuffer;
QVector <audioPacket> audioBuffer;
QMap<quint32, audioPacket>inputBuffer;
SpeexResamplerState* resampler;
unsigned int ratioNum;

Wyświetl plik

@ -716,7 +716,6 @@ udpAudio::udpAudio(QHostAddress local, QHostAddress ip, quint16 audioPort, quint
connect(this, SIGNAL(setupRxAudio(quint8, quint8, quint16, quint16, bool, bool, QString, quint8)), rxaudio, SLOT(init(quint8, quint8, quint16, quint16, bool, bool,QString, quint8)));
qRegisterMetaType<audioPacket>();
connect(this, SIGNAL(haveAudioData(audioPacket)), rxaudio, SLOT(incomingAudio(audioPacket)));
connect(this, SIGNAL(haveChangeLatency(quint16)), rxaudio, SLOT(changeLatency(quint16)));
connect(this, SIGNAL(haveSetVolume(unsigned char)), rxaudio, SLOT(setVolume(unsigned char)));

Wyświetl plik

@ -316,6 +316,4 @@ private:
};
Q_DECLARE_METATYPE(struct audioPacket)
#endif

Wyświetl plik

@ -374,6 +374,7 @@ wfmain::wfmain(const QString serialPortCL, const QString hostCL, QWidget *parent
qRegisterMetaType<meterKind>();
qRegisterMetaType<spectrumMode>();
qRegisterMetaType<freqt>();
qRegisterMetaType<audioPacket>();
connect(this, SIGNAL(sendPowerOn()), rig, SLOT(powerOn()));
connect(this, SIGNAL(sendPowerOff()), rig, SLOT(powerOff()));

Wyświetl plik

@ -706,6 +706,7 @@ Q_DECLARE_METATYPE(struct rigCapabilities)
Q_DECLARE_METATYPE(struct freqt)
Q_DECLARE_METATYPE(struct udpPreferences)
Q_DECLARE_METATYPE(struct rigStateStruct)
Q_DECLARE_METATYPE(struct audioPacket)
Q_DECLARE_METATYPE(enum rigInput)
Q_DECLARE_METATYPE(enum meterKind)
Q_DECLARE_METATYPE(enum spectrumMode)