arduino-audio-tools
Loading...
Searching...
No Matches
USBAudioBackend.h
Go to the documentation of this file.
1#pragma once
2#include <cstddef>
3#include <cstdint>
4
5namespace audio_tools {
6
8enum class UsbDir : uint8_t { Out = 0, In = 1 };
9
11enum class UsbXferType : uint8_t {
12 Control = 0,
13 Isochronous = 1,
14 Bulk = 2,
15 Interrupt = 3
16};
17
19enum class UsbSpeed : uint8_t { Full, High, Low, Unknown };
20
24enum class UsbXferResult : uint8_t { Success, Failed, Stalled };
25
35 uint8_t bmRequestType = 0;
36 uint8_t bRequest = 0;
37 uint16_t wValue = 0;
38 uint16_t wIndex = 0;
39 uint16_t wLength = 0;
40
41 enum class Type : uint8_t { Standard = 0, Class = 1, Vendor = 2 };
42 enum class Recipient : uint8_t {
43 Device = 0,
44 Interface = 1,
45 Endpoint = 2,
46 Other = 3
47 };
48
49 Type type() const { return (Type)((bmRequestType >> 5) & 0x03); }
50 UsbDir direction() const { return (UsbDir)((bmRequestType >> 7) & 0x01); }
51 Recipient recipient() const { return (Recipient)(bmRequestType & 0x1F); }
52};
53
56enum class UsbStdRequest : uint8_t {
57 ClearFeature = 1,
58 GetInterface = 10,
59 SetInterface = 11,
60};
61
67 uint8_t bInterfaceNumber = 0;
68 uint8_t bAlternateSetting = 0;
69 uint8_t bNumEndpoints = 0;
70 uint8_t bInterfaceClass = 0;
71 uint8_t bInterfaceSubClass = 0;
72 uint8_t bInterfaceProtocol = 0;
73};
74
87 uint8_t bEndpointAddress = 0;
88 UsbXferType xferType = UsbXferType::Control; // bmAttributes bits[1:0]
89 uint8_t sync = 0; // bmAttributes bits[3:2]: none/async/adaptive/sync
90 uint8_t usage = 0; // bmAttributes bits[5:4]: 0=data,1=feedback,2=implicit
91 uint8_t bInterval = 0;
92 uint16_t wMaxPacketSize = 0;
93
94 UsbDir direction() const {
95 return (bEndpointAddress & 0x80) ? UsbDir::In : UsbDir::Out;
96 }
97 uint16_t packetSize() const { return wMaxPacketSize & 0x7FF; }
98};
99
100// ── Descriptor byte-walking helpers ───────────────────────────────────────
101// Pure byte arithmetic — works identically against any USB stack's raw
102// descriptor buffer. Replace TinyUSB's tu_desc_next/_type/_subtype and
103// tu_unaligned_read16/32.
104
105inline uint8_t const* descNext(uint8_t const* p) { return p + p[0]; }
106inline uint8_t descType(uint8_t const* p) { return p[1]; }
107inline uint8_t descSubtype(uint8_t const* p) { return p[2]; }
108
109inline uint16_t descU16(uint8_t const* p) {
110 return (uint16_t)p[0] | ((uint16_t)p[1] << 8);
111}
112
113inline uint32_t descU32(uint8_t const* p) {
114 return (uint32_t)p[0] | ((uint32_t)p[1] << 8) | ((uint32_t)p[2] << 16) |
115 ((uint32_t)p[3] << 24);
116}
117
123 v.bEndpointAddress = p[2];
124 uint8_t attr = p[3];
125 v.xferType = (UsbXferType)(attr & 0x03);
126 v.sync = (attr >> 2) & 0x03;
127 v.usage = (attr >> 4) & 0x03;
128 v.wMaxPacketSize = descU16(p + 4);
129 v.bInterval = p[6];
130 return v;
131}
132
138 v.bInterfaceNumber = p[2];
139 v.bAlternateSetting = p[3];
140 v.bNumEndpoints = p[4];
141 v.bInterfaceClass = p[5];
142 v.bInterfaceSubClass = p[6];
143 v.bInterfaceProtocol = p[7];
144 return v;
145}
146
161 public:
162 virtual ~USBAudioBackend() = default;
163
164 // ── Endpoint lifecycle ──────────────────────────────────────────────────
167 virtual bool openEndpoint(uint8_t rhport,
168 const UsbEndpointDescriptorView& ep) = 0;
172 virtual bool closeEndpoint(uint8_t rhport, uint8_t ep_addr) = 0;
174 virtual bool clearStall(uint8_t rhport, uint8_t ep_addr) = 0;
175
176 // ── Isochronous endpoint reservation ────────────────────────────────────
182 virtual bool usesIsoAlloc() const = 0;
185 virtual bool isoAllocEndpoint(uint8_t rhport, uint8_t ep_addr,
186 uint16_t max_packet_size) = 0;
189 virtual bool isoActivateEndpoint(uint8_t rhport,
190 const UsbEndpointDescriptorView& ep) = 0;
194 virtual bool releaseEndpoint(uint8_t rhport, uint8_t ep_addr) = 0;
197 virtual bool claimEndpoint(uint8_t rhport, uint8_t ep_addr) = 0;
198
199 // ── Linear-buffer data transfer ─────────────────────────────────────────
203 virtual bool transfer(uint8_t rhport, uint8_t ep_addr, uint8_t* buffer,
204 uint16_t length) = 0;
205
206 // ── Control endpoint (EP0) ──────────────────────────────────────────────
208 virtual bool controlTransfer(uint8_t rhport, const UsbSetupPacket& request,
209 uint8_t* buffer, uint16_t length) = 0;
211 virtual bool controlStatus(uint8_t rhport,
212 const UsbSetupPacket& request) = 0;
213
214 // ── Device / SOF state ───────────────────────────────────────────────────
216 virtual UsbSpeed speed() const = 0;
218 bool isFullSpeed() const { return speed() == UsbSpeed::Full; }
220 bool isHighSpeed() const { return speed() == UsbSpeed::High; }
222 virtual bool mounted() const = 0;
228 virtual void enableSof(uint8_t rhport, bool enable) = 0;
229};
230
231} // namespace audio_tools
Abstract seam for every raw USB-stack call the UAC2 driver (USBAudioDeviceBase) needs....
Definition USBAudioBackend.h:160
virtual bool isoActivateEndpoint(uint8_t rhport, const UsbEndpointDescriptorView &ep)=0
virtual UsbSpeed speed() const =0
Current negotiated bus speed.
virtual bool controlTransfer(uint8_t rhport, const UsbSetupPacket &request, uint8_t *buffer, uint16_t length)=0
Complete a GET/SET control transfer's data stage with buffer.
virtual bool releaseEndpoint(uint8_t rhport, uint8_t ep_addr)=0
bool isFullSpeed() const
Convenience: speed() == UsbSpeed::Full.
Definition USBAudioBackend.h:218
virtual bool claimEndpoint(uint8_t rhport, uint8_t ep_addr)=0
virtual bool closeEndpoint(uint8_t rhport, uint8_t ep_addr)=0
virtual bool openEndpoint(uint8_t rhport, const UsbEndpointDescriptorView &ep)=0
virtual bool controlStatus(uint8_t rhport, const UsbSetupPacket &request)=0
Send a zero-length-packet status acknowledgement.
virtual bool usesIsoAlloc() const =0
virtual bool transfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t length)=0
bool isHighSpeed() const
Convenience: speed() == UsbSpeed::High.
Definition USBAudioBackend.h:220
virtual bool clearStall(uint8_t rhport, uint8_t ep_addr)=0
Clear a halted/stalled condition on an endpoint.
virtual bool mounted() const =0
True once the device has completed USB enumeration.
virtual void enableSof(uint8_t rhport, bool enable)=0
virtual bool isoAllocEndpoint(uint8_t rhport, uint8_t ep_addr, uint16_t max_packet_size)=0
virtual ~USBAudioBackend()=default
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6
uint8_t descSubtype(uint8_t const *p)
Definition USBAudioBackend.h:107
uint32_t descU32(uint8_t const *p)
Definition USBAudioBackend.h:113
UsbDir
USB transfer direction, mirrors TinyUSB's TUSB_DIR_OUT/TUSB_DIR_IN (0/1).
Definition USBAudioBackend.h:8
UsbEndpointDescriptorView decodeEndpoint(uint8_t const *p)
Definition USBAudioBackend.h:121
UsbInterfaceDescriptorView decodeInterface(uint8_t const *p)
Definition USBAudioBackend.h:136
UsbXferResult
Definition USBAudioBackend.h:24
uint16_t descU16(uint8_t const *p)
Definition USBAudioBackend.h:109
uint8_t descType(uint8_t const *p)
Definition USBAudioBackend.h:106
uint8_t const * descNext(uint8_t const *p)
Definition USBAudioBackend.h:105
UsbStdRequest
Definition USBAudioBackend.h:56
UsbXferType
USB endpoint transfer type, mirrors tusb_xfer_type_t.
Definition USBAudioBackend.h:11
UsbSpeed
Device enumerated bus speed, mirrors tusb_speed_t's relevant values.
Definition USBAudioBackend.h:19
Backend-agnostic mirror of tusb_desc_endpoint_t (USB 2.0 spec Table 9-13). wMaxPacketSize is kept in ...
Definition USBAudioBackend.h:86
uint8_t bEndpointAddress
Definition USBAudioBackend.h:87
UsbXferType xferType
Definition USBAudioBackend.h:88
UsbDir direction() const
Definition USBAudioBackend.h:94
uint16_t wMaxPacketSize
Definition USBAudioBackend.h:92
uint8_t sync
Definition USBAudioBackend.h:89
uint16_t packetSize() const
Definition USBAudioBackend.h:97
uint8_t usage
Definition USBAudioBackend.h:90
uint8_t bInterval
Definition USBAudioBackend.h:91
Backend-agnostic mirror of tusb_desc_interface_t — only the fields the UAC2 driver reads (USB 2....
Definition USBAudioBackend.h:66
uint8_t bInterfaceSubClass
Definition USBAudioBackend.h:71
uint8_t bInterfaceNumber
Definition USBAudioBackend.h:67
uint8_t bAlternateSetting
Definition USBAudioBackend.h:68
uint8_t bInterfaceProtocol
Definition USBAudioBackend.h:72
uint8_t bNumEndpoints
Definition USBAudioBackend.h:69
uint8_t bInterfaceClass
Definition USBAudioBackend.h:70
Backend-agnostic mirror of the standard 8-byte USB SETUP packet (TinyUSB's tusb_control_request_t)....
Definition USBAudioBackend.h:34
uint8_t bRequest
Definition USBAudioBackend.h:36
Recipient recipient() const
Definition USBAudioBackend.h:51
uint16_t wLength
Definition USBAudioBackend.h:39
Type
Definition USBAudioBackend.h:41
uint16_t wValue
Definition USBAudioBackend.h:37
UsbDir direction() const
Definition USBAudioBackend.h:50
uint8_t bmRequestType
Definition USBAudioBackend.h:35
uint16_t wIndex
Definition USBAudioBackend.h:38
Type type() const
Definition USBAudioBackend.h:49
Recipient
Definition USBAudioBackend.h:42