arduino-audio-tools
Loading...
Searching...
No Matches
src
AudioTools
Communication
USB
USBAudioBackend.h
Go to the documentation of this file.
1
#pragma once
2
#include <cstddef>
3
#include <cstdint>
4
5
namespace
audio_tools
{
6
8
enum class
UsbDir
:
uint8_t
{
Out
= 0,
In
= 1 };
9
11
enum class
UsbXferType
:
uint8_t
{
12
Control
= 0,
13
Isochronous
= 1,
14
Bulk
= 2,
15
Interrupt
= 3
16
};
17
19
enum class
UsbSpeed
:
uint8_t
{
Full
,
High
,
Low
,
Unknown
};
20
24
enum class
UsbXferResult
:
uint8_t
{
Success
,
Failed
,
Stalled
};
25
34
struct
UsbSetupPacket
{
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
56
enum class
UsbStdRequest
:
uint8_t
{
57
ClearFeature
= 1,
58
GetInterface
= 10,
59
SetInterface
= 11,
60
};
61
66
struct
UsbInterfaceDescriptorView
{
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
86
struct
UsbEndpointDescriptorView
{
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
105
inline
uint8_t
const
*
descNext
(
uint8_t
const
* p) {
return
p + p[0]; }
106
inline
uint8_t
descType
(
uint8_t
const
* p) {
return
p[1]; }
107
inline
uint8_t
descSubtype
(
uint8_t
const
* p) {
return
p[2]; }
108
109
inline
uint16_t
descU16
(
uint8_t
const
* p) {
110
return
(uint16_t)p[0] | ((uint16_t)p[1] << 8);
111
}
112
113
inline
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
121
inline
UsbEndpointDescriptorView
decodeEndpoint
(
uint8_t
const
* p) {
122
UsbEndpointDescriptorView
v;
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
136
inline
UsbInterfaceDescriptorView
decodeInterface
(
uint8_t
const
* p) {
137
UsbInterfaceDescriptorView
v;
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
160
class
USBAudioBackend
{
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
audio_tools::USBAudioBackend
Abstract seam for every raw USB-stack call the UAC2 driver (USBAudioDeviceBase) needs....
Definition
USBAudioBackend.h:160
audio_tools::USBAudioBackend::isoActivateEndpoint
virtual bool isoActivateEndpoint(uint8_t rhport, const UsbEndpointDescriptorView &ep)=0
audio_tools::USBAudioBackend::speed
virtual UsbSpeed speed() const =0
Current negotiated bus speed.
audio_tools::USBAudioBackend::controlTransfer
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.
audio_tools::USBAudioBackend::releaseEndpoint
virtual bool releaseEndpoint(uint8_t rhport, uint8_t ep_addr)=0
audio_tools::USBAudioBackend::isFullSpeed
bool isFullSpeed() const
Convenience: speed() == UsbSpeed::Full.
Definition
USBAudioBackend.h:218
audio_tools::USBAudioBackend::claimEndpoint
virtual bool claimEndpoint(uint8_t rhport, uint8_t ep_addr)=0
audio_tools::USBAudioBackend::closeEndpoint
virtual bool closeEndpoint(uint8_t rhport, uint8_t ep_addr)=0
audio_tools::USBAudioBackend::openEndpoint
virtual bool openEndpoint(uint8_t rhport, const UsbEndpointDescriptorView &ep)=0
audio_tools::USBAudioBackend::controlStatus
virtual bool controlStatus(uint8_t rhport, const UsbSetupPacket &request)=0
Send a zero-length-packet status acknowledgement.
audio_tools::USBAudioBackend::usesIsoAlloc
virtual bool usesIsoAlloc() const =0
audio_tools::USBAudioBackend::transfer
virtual bool transfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t length)=0
audio_tools::USBAudioBackend::isHighSpeed
bool isHighSpeed() const
Convenience: speed() == UsbSpeed::High.
Definition
USBAudioBackend.h:220
audio_tools::USBAudioBackend::clearStall
virtual bool clearStall(uint8_t rhport, uint8_t ep_addr)=0
Clear a halted/stalled condition on an endpoint.
audio_tools::USBAudioBackend::mounted
virtual bool mounted() const =0
True once the device has completed USB enumeration.
audio_tools::USBAudioBackend::enableSof
virtual void enableSof(uint8_t rhport, bool enable)=0
audio_tools::USBAudioBackend::isoAllocEndpoint
virtual bool isoAllocEndpoint(uint8_t rhport, uint8_t ep_addr, uint16_t max_packet_size)=0
audio_tools::USBAudioBackend::~USBAudioBackend
virtual ~USBAudioBackend()=default
uint32_t
uint8_t
audio_tools::TrackKind::Unknown
@ Unknown
audio_tools
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition
LMSEchoCancellationStream.h:6
audio_tools::descSubtype
uint8_t descSubtype(uint8_t const *p)
Definition
USBAudioBackend.h:107
audio_tools::descU32
uint32_t descU32(uint8_t const *p)
Definition
USBAudioBackend.h:113
audio_tools::UsbDir
UsbDir
USB transfer direction, mirrors TinyUSB's TUSB_DIR_OUT/TUSB_DIR_IN (0/1).
Definition
USBAudioBackend.h:8
audio_tools::UsbDir::Out
@ Out
audio_tools::UsbDir::In
@ In
audio_tools::decodeEndpoint
UsbEndpointDescriptorView decodeEndpoint(uint8_t const *p)
Definition
USBAudioBackend.h:121
audio_tools::decodeInterface
UsbInterfaceDescriptorView decodeInterface(uint8_t const *p)
Definition
USBAudioBackend.h:136
audio_tools::UsbXferResult
UsbXferResult
Definition
USBAudioBackend.h:24
audio_tools::UsbXferResult::Stalled
@ Stalled
audio_tools::UsbXferResult::Success
@ Success
audio_tools::UsbXferResult::Failed
@ Failed
audio_tools::descU16
uint16_t descU16(uint8_t const *p)
Definition
USBAudioBackend.h:109
audio_tools::descType
uint8_t descType(uint8_t const *p)
Definition
USBAudioBackend.h:106
audio_tools::descNext
uint8_t const * descNext(uint8_t const *p)
Definition
USBAudioBackend.h:105
audio_tools::UsbStdRequest
UsbStdRequest
Definition
USBAudioBackend.h:56
audio_tools::UsbStdRequest::ClearFeature
@ ClearFeature
audio_tools::UsbStdRequest::GetInterface
@ GetInterface
audio_tools::UsbStdRequest::SetInterface
@ SetInterface
audio_tools::UsbXferType
UsbXferType
USB endpoint transfer type, mirrors tusb_xfer_type_t.
Definition
USBAudioBackend.h:11
audio_tools::UsbXferType::Interrupt
@ Interrupt
audio_tools::UsbXferType::Bulk
@ Bulk
audio_tools::UsbXferType::Isochronous
@ Isochronous
audio_tools::UsbXferType::Control
@ Control
audio_tools::UsbSpeed
UsbSpeed
Device enumerated bus speed, mirrors tusb_speed_t's relevant values.
Definition
USBAudioBackend.h:19
audio_tools::UsbSpeed::Low
@ Low
audio_tools::UsbSpeed::High
@ High
audio_tools::UsbSpeed::Full
@ Full
audio_tools::UsbEndpointDescriptorView
Backend-agnostic mirror of tusb_desc_endpoint_t (USB 2.0 spec Table 9-13). wMaxPacketSize is kept in ...
Definition
USBAudioBackend.h:86
audio_tools::UsbEndpointDescriptorView::bEndpointAddress
uint8_t bEndpointAddress
Definition
USBAudioBackend.h:87
audio_tools::UsbEndpointDescriptorView::xferType
UsbXferType xferType
Definition
USBAudioBackend.h:88
audio_tools::UsbEndpointDescriptorView::direction
UsbDir direction() const
Definition
USBAudioBackend.h:94
audio_tools::UsbEndpointDescriptorView::wMaxPacketSize
uint16_t wMaxPacketSize
Definition
USBAudioBackend.h:92
audio_tools::UsbEndpointDescriptorView::sync
uint8_t sync
Definition
USBAudioBackend.h:89
audio_tools::UsbEndpointDescriptorView::packetSize
uint16_t packetSize() const
Definition
USBAudioBackend.h:97
audio_tools::UsbEndpointDescriptorView::usage
uint8_t usage
Definition
USBAudioBackend.h:90
audio_tools::UsbEndpointDescriptorView::bInterval
uint8_t bInterval
Definition
USBAudioBackend.h:91
audio_tools::UsbInterfaceDescriptorView
Backend-agnostic mirror of tusb_desc_interface_t — only the fields the UAC2 driver reads (USB 2....
Definition
USBAudioBackend.h:66
audio_tools::UsbInterfaceDescriptorView::bInterfaceSubClass
uint8_t bInterfaceSubClass
Definition
USBAudioBackend.h:71
audio_tools::UsbInterfaceDescriptorView::bInterfaceNumber
uint8_t bInterfaceNumber
Definition
USBAudioBackend.h:67
audio_tools::UsbInterfaceDescriptorView::bAlternateSetting
uint8_t bAlternateSetting
Definition
USBAudioBackend.h:68
audio_tools::UsbInterfaceDescriptorView::bInterfaceProtocol
uint8_t bInterfaceProtocol
Definition
USBAudioBackend.h:72
audio_tools::UsbInterfaceDescriptorView::bNumEndpoints
uint8_t bNumEndpoints
Definition
USBAudioBackend.h:69
audio_tools::UsbInterfaceDescriptorView::bInterfaceClass
uint8_t bInterfaceClass
Definition
USBAudioBackend.h:70
audio_tools::UsbSetupPacket
Backend-agnostic mirror of the standard 8-byte USB SETUP packet (TinyUSB's tusb_control_request_t)....
Definition
USBAudioBackend.h:34
audio_tools::UsbSetupPacket::bRequest
uint8_t bRequest
Definition
USBAudioBackend.h:36
audio_tools::UsbSetupPacket::recipient
Recipient recipient() const
Definition
USBAudioBackend.h:51
audio_tools::UsbSetupPacket::wLength
uint16_t wLength
Definition
USBAudioBackend.h:39
audio_tools::UsbSetupPacket::Type
Type
Definition
USBAudioBackend.h:41
audio_tools::UsbSetupPacket::Type::Class
@ Class
audio_tools::UsbSetupPacket::Type::Standard
@ Standard
audio_tools::UsbSetupPacket::Type::Vendor
@ Vendor
audio_tools::UsbSetupPacket::wValue
uint16_t wValue
Definition
USBAudioBackend.h:37
audio_tools::UsbSetupPacket::direction
UsbDir direction() const
Definition
USBAudioBackend.h:50
audio_tools::UsbSetupPacket::bmRequestType
uint8_t bmRequestType
Definition
USBAudioBackend.h:35
audio_tools::UsbSetupPacket::wIndex
uint16_t wIndex
Definition
USBAudioBackend.h:38
audio_tools::UsbSetupPacket::type
Type type() const
Definition
USBAudioBackend.h:49
audio_tools::UsbSetupPacket::Recipient
Recipient
Definition
USBAudioBackend.h:42
audio_tools::UsbSetupPacket::Recipient::Endpoint
@ Endpoint
audio_tools::UsbSetupPacket::Recipient::Interface
@ Interface
audio_tools::UsbSetupPacket::Recipient::Other
@ Other
audio_tools::UsbSetupPacket::Recipient::Device
@ Device
Generated by
1.9.8