Merge pull request #391 from shuchitak/bugfix/aud_to_host_buffer_underflow

fix for aud_to_host buffer underflow seen in 44_48 adat input tests
This commit is contained in:
danielpieczko
2024-05-13 13:05:20 +01:00
committed by GitHub
2 changed files with 25 additions and 4 deletions

View File

@@ -11,6 +11,8 @@ UNRELEASED
* FIXED: Incorrect internal input EP count for input only devices
* ADDED: MIDI unit and subsystem tests
* FIXED: ADAT Tx called too frequently
* CHANGED: aud_to_host buffer size and the condition to come out of underflow
in decoupler to fix buffer underflow seen in ADAT tests
* FIXED: Initialise SMUX based on DEFAULT_FREQ in clockgen
4.0.0

View File

@@ -1,4 +1,4 @@
// Copyright 2011-2023 XMOS LIMITED.
// Copyright 2011-2024 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
#include "xua.h"
@@ -42,8 +42,13 @@
#define MAX_DEVICE_AUD_PACKET_SIZE_OUT (MAX(MAX_DEVICE_AUD_PACKET_SIZE_OUT_FS, MAX_DEVICE_AUD_PACKET_SIZE_OUT_HS))
/*** BUFFER SIZES ***/
#define BUFFER_PACKET_COUNT (4) /* How many packets too allow for in buffer - minimum is 4 */
/* How many packets too allow for in buffer - minimum is 5.
2 for having in the aud_to_host buffer when it comes out of underflow, space available for 2 more for to accomodate cases when
2 pkts from audio hub get written into the aud_to_host buffer within 1 SOF period, and space for 1 extra packet to ensure that
when the 4th packet gets written to the buffer, there's space to accomodate the next packet, otherwise handle_audio_request() will
drop packets after writing the 4th packet in the buffer
*/
#define BUFFER_PACKET_COUNT (5)
#define BUFF_SIZE_OUT_HS MAX_DEVICE_AUD_PACKET_SIZE_OUT_HS * BUFFER_PACKET_COUNT
#define BUFF_SIZE_OUT_FS MAX_DEVICE_AUD_PACKET_SIZE_OUT_FS * BUFFER_PACKET_COUNT
@@ -1054,7 +1059,21 @@ void XUA_Buffer_Decouple(chanend c_mix_out
assert(fillLevel <= BUFF_SIZE_IN);
/* Check if we have come out of underflow */
if (fillLevel >= IN_BUFFER_PREFILL)
unsigned sampFreq;
GET_SHARED_GLOBAL(sampFreq, g_freqChange_sampFreq);
int min, mid, max;
GetADCCounts(sampFreq, min, mid, max);
const int min_pkt_size = ((min * g_curSubSlot_In * g_numUsbChan_In + 3) & ~0x3) + 4;
/*
Come out of underflow if there are exactly 2 packets in the buffer.
This ensures that handle_audio_request() does not drop packets when writing packets into the aud_to_host buffer
when aud_to_host buffer is not in underflow.
For example, coming out of underflow with 3 packets in the buffer would mean handle_audio_request()
drops packets if 2 pkts are received from audio hub in 1 SOF period. Coming out of underflow with 4
packets would mean handle_audio_request would drop packets after writing 1 packet to the aud_to_host buffer.
*/
if ((fillLevel >= (min_pkt_size*2)) && (fillLevel < (min_pkt_size*3)))
{
int aud_to_host_rdptr;
GET_SHARED_GLOBAL(aud_to_host_rdptr, g_aud_to_host_rdptr);