2#include <zephyr/device.h>
3#include <zephyr/kernel.h>
4#include <zephyr/logging/log.h>
5#include <zephyr/usb/class/usbd_uac2.h>
6#include <zephyr/usb/usbd.h>
63 block_sz_ = (
uint16_t)((frame + 3u) & ~3u);
66 slab_buf_.resize((
size_t)block_sz_ * count);
68 LOG_ERR(
"USBAudioDeviceZephyr: k_mem_slab_init failed");
75 LOG_ERR(
"USBAudioDeviceZephyr: UAC2 device not ready");
81 .terminal_update_cb = s_terminal_update,
82 .get_recv_buf = s_get_recv_buf,
83 .data_recv_cb = s_data_recv,
84 .buf_release_cb = s_buf_release,
85 .get_explicit_feedback = s_get_feedback,
90 LOG_INF(
"USBAudioDeviceZephyr: started (%u Hz, %u ch, %u bit)",
99 LOG_INF(
"USBAudioDeviceZephyr: stopped");
103 rx_cb_ = std::move(cb);
107 tx_cb_ = std::move(cb);
125 "USBAudioDeviceZephyr: audio format change ignored — "
126 "DTS descriptor is fixed at build time");
138 BaseBuffer<uint8_t>& bufferRx()
override {
return default_buffer_rx_; }
141 RingBuffer<uint8_t> default_buffer_tx_{1};
142 RingBuffer<uint8_t> default_buffer_rx_{1};
146 static void s_terminal_update(
const struct device* ,
150 self->streaming_ = enabled;
151 if (enabled && self->config_.enable_ep_in) {
152 self->primeTxPipeline();
154 LOG_INF(
"USBAudioDeviceZephyr: streaming %s",
155 enabled ?
"started" :
"stopped");
158 static void* s_get_recv_buf(
const struct device* ,
162 if (!self->is_active_ || !self->config_.enable_ep_out)
return nullptr;
165 LOG_WRN(
"USBAudioDeviceZephyr: slab alloc failed (overrun)");
171 static void s_data_recv(
const struct device* ,
uint8_t ,
174 if (!self->is_active_ || !
buf) {
179 self->rx_cb_(
static_cast<const uint8_t*
>(
buf), size);
184 static void s_buf_release(
const struct device* ,
uint8_t ,
190 if (!self->is_active_ || !self->streaming_ || !self->tx_cb_)
return;
192 void* next =
nullptr;
196 self->tx_cb_(
static_cast<uint8_t*
>(next), self->block_sz_);
199 (
size_t)(self->block_sz_ -
filled));
201 if (
usbd_uac2_send(self->uac2_dev_, self->config_.terminal_id, next,
202 self->block_sz_) != 0) {
207 static uint32_t s_get_feedback(
const struct device* ,
211 return (
spf << 14) & 0x00FFFFFFu;
216 void primeTxPipeline() {
218 for (
uint8_t i = 0; i < kPipelineDepth; ++i) {
224 (
size_t)(block_sz_ -
filled));
235 USBAudioConfig config_;
236 const struct device* uac2_dev_ =
nullptr;
238 std::vector<uint8_t> slab_buf_;
239 bool is_active_ =
false;
240 bool streaming_ =
false;
246 static constexpr uint8_t kPipelineDepth = 3;
LOG_MODULE_DECLARE(usb_audio_device_zephyr, LOG_LEVEL_INF)
RxTxMode
The Microcontroller is the Audio Source (TX_MODE) or Audio Sink (RX_MODE). RXTX_MODE is Source and Si...
Definition AudioTypes.h:26
@ RXTX_MODE
Definition AudioTypes.h:26
@ TX_MODE
Definition AudioTypes.h:26
@ RX_MODE
Definition AudioTypes.h:26
USBAudioDeviceESP32 USBAudioStream
USBAudioStream type alias for ESP32.
Definition USBAudioDeviceESP32.h:195