summaryrefslogtreecommitdiff
path: root/src/class
diff options
context:
space:
mode:
authorHiFiPHile <[email protected]>2026-08-25 09:27:35 +0200
committerHiFiPHile <[email protected]>2026-08-25 09:27:35 +0200
commit367693fe985ee64a6eb4c15828683befdc77ab95 (patch)
tree3d407e9741f8a8f8e0a56839ff6dceb59c3f596d /src/class
parent3db8be8ba1a79b7a38814237508108eff9bcd5d6 (diff)
fix(audio): distinguish data and feedback endpoints
Associate UAC1 AudioStreaming endpoints by their usage type. Keep data and implicit-feedback IN endpoints as streams while leaving explicit feedback endpoints unopened until feedback scheduling is supported. Signed-off-by: HiFiPHile <[email protected]>
Diffstat (limited to 'src/class')
-rw-r--r--src/class/audio/audio_host.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/class/audio/audio_host.c b/src/class/audio/audio_host.c
index f943a5b2f..e3e0afc22 100644
--- a/src/class/audio/audio_host.c
+++ b/src/class/audio/audio_host.c
@@ -619,7 +619,9 @@ static const uint8_t *audioh_parse_as(audioh_interface_t *p_audio, const tusb_de
uint8_t sam_freq_count = 0; // 1 for a continuous range
uint32_t sam_freq[CFG_TUH_AUDIO_MAX_SAM_FREQ] = {0};
- // An alternate setting can expose an endpoint in each direction
+ // An alternate setting can expose an endpoint in each direction. Explicit
+ // feedback endpoints are skipped; implicit-feedback data endpoints remain
+ // normal audio endpoints.
typedef struct {
uint8_t ep_addr;
uint16_t ep_size;
@@ -699,7 +701,24 @@ static const uint8_t *audioh_parse_as(audioh_interface_t *p_audio, const tusb_de
}
case TUSB_DESC_ENDPOINT: {
const tusb_desc_endpoint_t *desc_endpoint = (const tusb_desc_endpoint_t *)p_desc;
- if (desc_endpoint->bmAttributes.xfer == TUSB_XFER_ISOCHRONOUS && ep_count < 2) {
+ if (desc_endpoint->bmAttributes.xfer != TUSB_XFER_ISOCHRONOUS) {
+ break;
+ }
+
+ const uint8_t usage = desc_endpoint->bmAttributes.usage;
+ const bool implicit_feedback =
+ usage == (TUSB_ISO_EP_ATT_IMPLICIT_FB >> 4) && tu_edpt_dir(desc_endpoint->bEndpointAddress) == TUSB_DIR_IN;
+ const bool explicit_feedback =
+ usage == (TUSB_ISO_EP_ATT_EXPLICIT_FB >> 4) ||
+ (usage == (TUSB_ISO_EP_ATT_DATA >> 4) && desc_endpoint->bmAttributes.sync == TUSB_ISO_EP_ATT_NO_SYNC);
+
+ if (explicit_feedback) {
+ TU_LOG_DRV(" AUDIO AS itf %u alt %u: explicit feedback ep %02x ignored\r\n", itf_num, alt,
+ desc_endpoint->bEndpointAddress);
+ break;
+ }
+
+ if ((usage == (TUSB_ISO_EP_ATT_DATA >> 4) || implicit_feedback) && ep_count < 2) {
audioh_ep_info_t *ep = &ep_info[ep_count];
ep->ep_addr = desc_endpoint->bEndpointAddress;
ep->ep_size = tu_edpt_packet_size(desc_endpoint);