arduino-audio-tools
Loading...
Searching...
No Matches
USBAudioDeviceESP32.h
Go to the documentation of this file.
1#pragma once
2#include <Arduino.h>
3
4#ifdef ESP32
5
6#if ARDUINO_USB_CDC_ON_BOOT
7#error USB Audio is only available in OTG mode, not CDC-on-boot mode
8#else
9
10#include <USB.h>
11
12#include <cstring>
13
16#include "esp32-hal-tinyusb.h"
17
18namespace audio_tools {
19
20class Emulated_TinyUSB;
21
55 friend class Emulated_TinyUSB;
56
57 public:
60
61 // ── ESP32 descriptor callback
62 // ───────────────────────────────────────────────
63 // Called by the arduino-esp32 framework when it builds the configuration
64 // descriptor. The callback reads the current descriptor at call time, so any
65 // format change callback reads the current descriptor at call time, so any
66 // format change made via setConfig() before re-enumeration is picked up
67 // automatically without re-registering the interface.
68
69 static uint16_t descriptorCallback(uint8_t* dst, uint8_t* itf) {
70 auto& dev = getActualInstance();
71 // *itf carries the running interface index: set our base from it so that
72 // composite configurations (e.g. CDC + Audio) get non-overlapping
73 // numbers.
74 if (itf) dev.config_.itf_num_ac = *itf;
75 uint16_t len = dev.getDescriptor(dst);
76 if (itf) *itf += dev.numInterfaces();
77 return len;
78 }
79
84
85 bool setupUSB() {
86 if (setup_called) return true;
87 setup_called = true;
88 USB.VID(config_.vid);
89 USB.PID(config_.pid);
90 USB.productName(config_.product);
91 USB.manufacturerName(config_.manufacturer);
92 USB.serialNumber(config_.serial);
93 USB.usbClass(TUSB_CLASS_MISC);
94 USB.usbSubClass(MISC_SUBCLASS_COMMON);
95 USB.usbProtocol(MISC_PROTOCOL_IAD);
96 USB.usbAttributes(
97 (uint8_t)(0x80u | (config_.self_powered ? 0x40u : 0x00u)));
98 USB.usbPower(config_.max_power_ma);
99 static uint8_t desc[USB_DESCR_MAX_LEN];
100 uint16_t audio_len = getDescriptor(desc);
101 assert(audio_len <= USB_DESCR_MAX_LEN);
102 tinyusb_enable_interface(USB_INTERFACE_AUDIO, audio_len,
104 return true;
105 }
106
107 protected:
110
113
116 void resizeBuffers() override {
117 uint16_t block_sz = packetSize();
118 uint8_t block_cnt = config_.fifo_packets;
119 if (isEpInEnabled()) buffer_tx_.resize(block_sz * block_cnt);
120 if (isEpOutEnabled()) buffer_rx_.resize(block_sz * block_cnt);
121 }
122
126 void serviceTinyUSB() override {}
127
135 bool beginUSB() override {
136 if (begin_called) return true;
137 setupUSB();
138 bool rc = true;
139 if (config_.begin_usb) {
140 begin_called = true;
141 rc = USB.begin();
142 }
143 return rc;
144 }
145
146 bool begin_called = false;
147 bool setup_called = false;
148 // Block-pool buffers with FreeRTOS queues for cross-core safety.
149 // TX: writeMaxWait=5ms (copier blocks briefly for free block),
150 // readMaxWait=0 (xfer_cb never blocks).
151 // RX: writeMaxWait=0 (xfer_cb never blocks),
152 // readMaxWait=0 (sketch polls via copier, never blocks).
153 // SynchronizedNBufferRTOS buffer_tx_{0, 0, 5, 0};
154 // SynchronizedNBufferRTOS buffer_rx_{0, 0, 0, 0};
155
156 // size_t streamBufferSize, size_t xTriggerLevel = 1 TickType_t writeMaxWait
157 // = portMAX_DELAY, TickType_t readMaxWait = portMAX_DELAY,
160};
161
169 public:
170 bool isInitialized() { return tud_inited(); }
171 bool begin(int) { return true; }
172 bool mounted(void) {
173 if (!device().begin_called) return true;
174 return tud_mounted();
175 }
176 bool suspended(void) { return tud_suspended(); }
177 bool ready(void) { return tud_ready(); }
178 bool remoteWakeup(void) { return tud_remote_wakeup(); }
179 bool detach(void) {
180 if (!device().begin_called) return true;
181 return tud_disconnect();
182 }
183 bool attach(void) {
184 if (!device().begin_called) {
185 device().beginUSB();
186 return USB.begin();
187 }
188
189 return tud_connect();
190 }
191 // bool beginUSB() { return device().beginUSB(); }
196};
197
199
208
209} // namespace audio_tools
210
211#endif // ARDUINO_USB_CDC_ON_BOOT
212#endif // ESP32
If you want to use the framework w/o Arduino you need to provide the implementation of a couple of cl...
#define USB_DESCR_MAX_LEN
Definition USBAudioDeviceBase.h:37
#define assert(T)
Definition avr.h:10
Shared functionality of all buffers.
Definition Buffers.h:23
Buffer implementation which is using a FreeRTOS StreamBuffer. The default allocator uses psram is ava...
Definition BufferRTOS.h:33
bool resize(size_t size)
Re-Allocats the memory and the queue.
Definition BufferRTOS.h:54
Minimal wrapper around the ESP32 TinyUSB API. We emulate the basic functionality so that we can use t...
Definition USBAudioDeviceESP32.h:168
bool isInitialized()
Definition USBAudioDeviceESP32.h:170
bool attach(void)
Definition USBAudioDeviceESP32.h:183
USBAudioDeviceESP32 & device()
Definition USBAudioDeviceESP32.h:192
bool suspended(void)
Definition USBAudioDeviceESP32.h:176
bool remoteWakeup(void)
Definition USBAudioDeviceESP32.h:178
bool ready(void)
Definition USBAudioDeviceESP32.h:177
bool mounted(void)
Definition USBAudioDeviceESP32.h:172
bool detach(void)
Definition USBAudioDeviceESP32.h:179
bool begin(int)
Definition USBAudioDeviceESP32.h:171
USB Audio Device class for audio streaming over USB.
Definition USBAudioDeviceBase.h:111
bool isEpInEnabled() const
Returns true if the IN endpoint is enabled.
Definition USBAudioDeviceBase.h:375
USBAudioConfig config_
Definition USBAudioDeviceBase.h:835
uint16_t getDescriptor(uint8_t *desc)
Returns the audio-function descriptor block for use in tud_descriptor_configuration_cb().
Definition USBAudioDeviceBase.h:727
static USBAudioDeviceBase & activeInstance()
Returns the most-recently-constructed instance (base or subclass).
Definition USBAudioDeviceBase.h:372
uint16_t packetSize() const
Definition USBAudioDeviceBase.h:1088
bool isEpOutEnabled() const
Returns true if the OUT endpoint is enabled.
Definition USBAudioDeviceBase.h:378
USBAudioDeviceBase subclass for ESP32-S2/S3 using the arduino-esp32 stack.
Definition USBAudioDeviceESP32.h:54
bool setupUSB()
Definition USBAudioDeviceESP32.h:85
static USBAudioDeviceESP32 & getActualInstance()
Definition USBAudioDeviceESP32.h:80
BufferRTOS< uint8_t > buffer_rx_
Definition USBAudioDeviceESP32.h:159
BaseBuffer< uint8_t > & bufferTx() override
Returns cross-core safe TX buffer (FreeRTOS queue of blocks).
Definition USBAudioDeviceESP32.h:109
void serviceTinyUSB() override
No-op: the arduino-esp32 framework already runs a dedicated FreeRTOS task that calls tud_task() conti...
Definition USBAudioDeviceESP32.h:126
USBAudioDeviceESP32(USBAudioConfig cfg)
Definition USBAudioDeviceESP32.h:59
bool beginUSB() override
Configure and start the ESP32 USB stack.
Definition USBAudioDeviceESP32.h:135
static uint16_t descriptorCallback(uint8_t *dst, uint8_t *itf)
Definition USBAudioDeviceESP32.h:69
void resizeBuffers() override
Resize buffers as block pools: block size = one USB frame at the current sample rate,...
Definition USBAudioDeviceESP32.h:116
bool begin_called
Definition USBAudioDeviceESP32.h:146
BaseBuffer< uint8_t > & bufferRx() override
Returns cross-core safe RX buffer (FreeRTOS queue of blocks).
Definition USBAudioDeviceESP32.h:112
BufferRTOS< uint8_t > buffer_tx_
Definition USBAudioDeviceESP32.h:158
bool setup_called
Definition USBAudioDeviceESP32.h:147
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6
static Emulated_TinyUSB TinyUSBDevice
Definition USBAudioDeviceESP32.h:198
Configuration for USB Audio (inherits sample_rate / channels / bits_per_sample from AudioInfo).
Definition USBAudioConfig.h:89
bool self_powered
Definition USBAudioConfig.h:128
const char * serial
Definition USBAudioConfig.h:127
const char * product
Definition USBAudioConfig.h:126
uint8_t max_power_ma
Definition USBAudioConfig.h:129
const char * manufacturer
Definition USBAudioConfig.h:125
uint16_t pid
Definition USBAudioConfig.h:124
uint16_t vid
Definition USBAudioConfig.h:123
uint8_t fifo_packets
Definition USBAudioConfig.h:120
bool begin_usb
Definition USBAudioConfig.h:192