diff --git a/audiohandler.cpp b/audiohandler.cpp index 80376cd..e9f2134 100644 --- a/audiohandler.cpp +++ b/audiohandler.cpp @@ -977,8 +977,12 @@ qint64 audioHandler::readData(char* data, qint64 maxlen) { int timediff = packet->time.msecsTo(QTime::currentTime()); if (timediff > (int)latency * 2) { - //qDebug(logAudio()) << "Packet " << hex << packet->seq << " arrived too late (increase rx buffer size!) " << dec << packet->time.msecsTo(QTime::currentTime()) << "ms"; - packet = audioBuffer.erase(packet); // returns next packet + qDebug(logAudio()) << "Packet " << hex << packet->seq << + " arrived too late (increase rx latency!) " << + dec << packet->time.msecsTo(QTime::currentTime()) << "ms"; + while (packet !=audioBuffer.end() && timediff > (int)latency) { + packet = audioBuffer.erase(packet); // returns next packet + } } else if (packet->seq == lastSeq+1 || packet->seq <= lastSeq) { diff --git a/audiohandler.h b/audiohandler.h index 47e436f..0231ab8 100644 --- a/audiohandler.h +++ b/audiohandler.h @@ -24,7 +24,7 @@ #define INTERNAL_SAMPLE_RATE 48000 struct audioPacket { - quint16 seq; + quint32 seq; QTime time; quint16 sent; QByteArray datain; @@ -85,7 +85,7 @@ private: int chunkSize; bool chunkAvailable; - quint16 lastSeq; + quint32 lastSeq; QAudioFormat format; QAudioDeviceInfo deviceInfo; diff --git a/udphandler.cpp b/udphandler.cpp index 5a9a283..a4d8665 100644 --- a/udphandler.cpp +++ b/udphandler.cpp @@ -846,11 +846,19 @@ void udpAudio::dataReceived() */ control_packet_t in = (control_packet_t)r.constData(); + + if (in->type != 0x01 && in->len >= 0xAC) { + if (in->seq == 0) + { + // Seq number has rolled over. + seqPrefix++; + } + // 0xac is the smallest possible audio packet. lastReceived = QTime::currentTime(); audioPacket tempAudio; - tempAudio.seq = in->seq; + tempAudio.seq = (quint32)seqPrefix << 16 | in->seq; tempAudio.time = lastReceived; tempAudio.sent = 0; tempAudio.datain = r.mid(0x18); @@ -1067,8 +1075,8 @@ void udpBase::dataReceived(QByteArray r) std::sort(rxSeqBuf.begin(), rxSeqBuf.end()); if (in->seq < rxSeqBuf.front()) { - qDebug(logUdp()) << this->metaObject()->className() << ": ******* seq number may have rolled over ****** previous highest: " << hex << rxSeqBuf.back() << " current: " << hex << in->seq; - + qDebug(logUdp()) << this->metaObject()->className() << ": ******* seq number has rolled over ****** previous highest: " << hex << rxSeqBuf.back() << " current: " << hex << in->seq; + //seqPrefix++; // Looks like it has rolled over so clear buffer and start again. rxSeqBuf.clear(); return; diff --git a/udphandler.h b/udphandler.h index a511b25..9bc6738 100644 --- a/udphandler.h +++ b/udphandler.h @@ -129,6 +129,8 @@ public: quint32 packetsSent=0; quint32 packetsLost=0; + quint16 seqPrefix=0; + private: void sendRetransmitRequest(); diff --git a/udpserver.cpp b/udpserver.cpp index c7e55ce..7b65f2f 100644 --- a/udpserver.cpp +++ b/udpserver.cpp @@ -620,7 +620,7 @@ void udpServer::commonReceived(QList* l,CLIENT* current, QByteArray r) // Found matching entry? // Send "untracked" as it has already been sent once. QMutexLocker locker(&mutex); - qDebug(logUdpServer()) << current->ipAddress.toString() << ":" << current->port << ": Sending retransmit of " << Qt::hex << match->seqNum; + qDebug(logUdpServer()) << current->ipAddress.toString() << ":" << current->port << ": Sending retransmit of " << hex << match->seqNum; match->retransmitCount++; current->socket->writeDatagram(match->data, current->ipAddress, current->port); match++;