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
46class Emulated_TinyUSB;
47
49 friend class Emulated_TinyUSB;
50 public:
53
54 // ── ESP32 descriptor callback
55 // ───────────────────────────────────────────────
56 // Called by the arduino-esp32 framework when it builds the configuration
57 // descriptor. The callback reads the current descriptor at call time, so any
58 // format change callback reads the current descriptor at call time, so any
59 // format change made via setConfig() before re-enumeration is picked up
60 // automatically without re-registering the interface.
61
63 auto& dev = getActualInstance();
64 // *itf carries the running interface index: set our base from it so that
65 // composite configurations (e.g. CDC + Audio) get non-overlapping
66 // numbers.
67 if (itf) dev.config_.itf_num_ac = *itf;
68 uint16_t len = dev.getDescriptor(dst);
69 if (itf) *itf += dev.numInterfaces();
70 return len;
71 }
72
77
78 bool setupUSB() {
79 if (setup_called) return true;
80 setup_called = true;
81 USB.VID(config_.vid);
82 USB.PID(config_.pid);
83 USB.productName(config_.product);
84 USB.manufacturerName(config_.manufacturer);
85 USB.serialNumber(config_.serial);
86 USB.usbClass(TUSB_CLASS_MISC);
87 USB.usbSubClass(MISC_SUBCLASS_COMMON);
88 USB.usbProtocol(MISC_PROTOCOL_IAD);
89 USB.usbAttributes(
90 (uint8_t)(0x80u | (config_.self_powered ? 0x40u : 0x00u)));
91 USB.usbPower(config_.max_power_ma);
97 return true;
98 }
99
100 protected:
103
106
115
123 bool beginUSB() override {
124 if (begin_called) return true;
125 setupUSB();
126 bool rc = true;
127 if (config_.begin_usb) {
128 begin_called = true;
129 rc = USB.begin();
130 }
131 return rc;
132 }
133
134 bool begin_called = false;
135 bool setup_called = false;
136 // Block-pool buffers with FreeRTOS queues for cross-core safety.
137 // TX: writeMaxWait=5ms (copier blocks briefly for free block),
138 // readMaxWait=0 (xfer_cb never blocks).
139 // RX: writeMaxWait=0 (xfer_cb never blocks),
140 // readMaxWait=0 (sketch polls via copier, never blocks).
141 // SynchronizedNBufferRTOS buffer_tx_{0, 0, 5, 0};
142 // SynchronizedNBufferRTOS buffer_rx_{0, 0, 0, 0};
143
144 // size_t streamBufferSize, size_t xTriggerLevel = 1 TickType_t writeMaxWait
145 // = portMAX_DELAY, TickType_t readMaxWait = portMAX_DELAY,
148};
149
157 public:
158 bool isInitialized() { return tud_inited(); }
159 bool begin(int) { return true; }
160 bool mounted(void) {
161 if (!device().begin_called) return true;
162 return tud_mounted();
163 }
164 bool suspended(void) { return tud_suspended(); }
165 bool ready(void) { return tud_ready(); }
166 bool remoteWakeup(void) { return tud_remote_wakeup(); }
167 bool detach(void) {
168 if (!device().begin_called) return true;
169 return tud_disconnect();
170 }
171 bool attach(void) {
172 if (!device().begin_called) {
173 device().beginUSB();
174 return USB.begin();
175 }
176
177 return tud_connect();
178 }
179 // bool beginUSB() { return device().beginUSB(); }
184};
185
187
196
197} // namespace audio_tools
198
199#endif // ARDUINO_USB_CDC_ON_BOOT
200#endif // ESP32
#define USB_DESCR_MAX_LEN
Definition USBAudioDeviceBase.h:37
#define assert(T)
Definition avr.h:10
Shared functionality of all buffers.
Definition Buffers.h:22
Buffer implementation which is using a FreeRTOS StreamBuffer. The default allocator uses psram is ava...
Definition BufferRTOS.h:30
bool resize(size_t size)
Re-Allocats the memory and the queue.
Definition BufferRTOS.h:51
Minimal wrapper around the ESP32 TinyUSB API. We emulate the basic functionality so that we can use t...
Definition USBAudioDeviceESP32.h:156
bool isInitialized()
Definition USBAudioDeviceESP32.h:158
bool attach(void)
Definition USBAudioDeviceESP32.h:171
USBAudioDeviceESP32 & device()
Definition USBAudioDeviceESP32.h:180
bool suspended(void)
Definition USBAudioDeviceESP32.h:164
bool remoteWakeup(void)
Definition USBAudioDeviceESP32.h:166
bool ready(void)
Definition USBAudioDeviceESP32.h:165
bool mounted(void)
Definition USBAudioDeviceESP32.h:160
bool detach(void)
Definition USBAudioDeviceESP32.h:167
bool begin(int)
Definition USBAudioDeviceESP32.h:159
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:834
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:1082
bool isEpOutEnabled() const
Returns true if the OUT endpoint is enabled.
Definition USBAudioDeviceBase.h:378
Definition USBAudioDeviceESP32.h:48
bool setupUSB()
Definition USBAudioDeviceESP32.h:78
static USBAudioDeviceESP32 & getActualInstance()
Definition USBAudioDeviceESP32.h:73
BufferRTOS< uint8_t > buffer_rx_
Definition USBAudioDeviceESP32.h:147
BaseBuffer< uint8_t > & bufferTx() override
Returns cross-core safe TX buffer (FreeRTOS queue of blocks).
Definition USBAudioDeviceESP32.h:102
USBAudioDeviceESP32(USBAudioConfig cfg)
Definition USBAudioDeviceESP32.h:52
bool beginUSB() override
Configure and start the ESP32 USB stack.
Definition USBAudioDeviceESP32.h:123
static uint16_t descriptorCallback(uint8_t *dst, uint8_t *itf)
Definition USBAudioDeviceESP32.h:62
void resizeBuffers() override
Resize buffers as block pools: block size = one USB frame at the current sample rate,...
Definition USBAudioDeviceESP32.h:109
bool begin_called
Definition USBAudioDeviceESP32.h:134
BaseBuffer< uint8_t > & bufferRx() override
Returns cross-core safe RX buffer (FreeRTOS queue of blocks).
Definition USBAudioDeviceESP32.h:105
BufferRTOS< uint8_t > buffer_tx_
Definition USBAudioDeviceESP32.h:146
bool setup_called
Definition USBAudioDeviceESP32.h:135
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
static Emulated_TinyUSB TinyUSBDevice
Definition USBAudioDeviceESP32.h:186
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:512
Configuration for USB Audio (inherits sample_rate / channels / bits_per_sample from AudioInfo).
Definition USBAudioConfig.h:27
bool self_powered
Definition USBAudioConfig.h:59
const char * serial
Definition USBAudioConfig.h:58
const char * product
Definition USBAudioConfig.h:57
uint8_t max_power_ma
Definition USBAudioConfig.h:60
const char * manufacturer
Definition USBAudioConfig.h:56
uint16_t pid
Definition USBAudioConfig.h:55
uint16_t vid
Definition USBAudioConfig.h:54
uint8_t fifo_packets
Definition USBAudioConfig.h:51
bool begin_usb
Definition USBAudioConfig.h:102