Fix queued packet leak when audio packet queue overflows

This commit is contained in:
Cameron Gutman 2021-06-02 22:05:45 -05:00
parent e9fd544ff4
commit ef33aaa3c8

View File

@ -135,6 +135,7 @@ void destroyAudioStream(void) {
static bool queuePacketToLbq(PQUEUED_AUDIO_PACKET* packet) { static bool queuePacketToLbq(PQUEUED_AUDIO_PACKET* packet) {
int err; int err;
do {
err = LbqOfferQueueItem(&packetQueue, *packet, &(*packet)->header.lentry); err = LbqOfferQueueItem(&packetQueue, *packet, &(*packet)->header.lentry);
if (err == LBQ_SUCCESS) { if (err == LBQ_SUCCESS) {
// The LBQ owns the buffer now // The LBQ owns the buffer now
@ -142,13 +143,13 @@ static bool queuePacketToLbq(PQUEUED_AUDIO_PACKET* packet) {
} }
else if (err == LBQ_BOUND_EXCEEDED) { else if (err == LBQ_BOUND_EXCEEDED) {
Limelog("Audio packet queue overflow\n"); Limelog("Audio packet queue overflow\n");
// The audio queue is full, so free all existing items and try again
freePacketList(LbqFlushQueueItems(&packetQueue)); freePacketList(LbqFlushQueueItems(&packetQueue));
} }
else if (err == LBQ_INTERRUPTED) { } while (err == LBQ_BOUND_EXCEEDED);
return false;
}
return true; return err == LBQ_SUCCESS;
} }
static void decodeInputData(PQUEUED_AUDIO_PACKET packet) { static void decodeInputData(PQUEUED_AUDIO_PACKET packet) {
@ -309,6 +310,10 @@ static void ReceiveThreadProc(void* context) {
// An exit signal was received // An exit signal was received
break; break;
} }
else {
// Ownership should have been taken by the LBQ
LC_ASSERT(packet == NULL);
}
} }
else { else {
decodeInputData(packet); decodeInputData(packet);
@ -331,8 +336,13 @@ static void ReceiveThreadProc(void* context) {
if ((AudioCallbacks.capabilities & CAPABILITY_DIRECT_SUBMIT) == 0) { if ((AudioCallbacks.capabilities & CAPABILITY_DIRECT_SUBMIT) == 0) {
if (!queuePacketToLbq(&queuedPacket)) { if (!queuePacketToLbq(&queuedPacket)) {
// An exit signal was received // An exit signal was received
free(queuedPacket);
break; break;
} }
else {
// Ownership should have been taken by the LBQ
LC_ASSERT(queuedPacket == NULL);
}
} }
else { else {
decodeInputData(queuedPacket); decodeInputData(queuedPacket);