Skip to content

Commit 0521395

Browse files
committed
USB non working DRAFT
1 parent cb57faf commit 0521395

File tree

7 files changed

+3718
-711
lines changed

7 files changed

+3718
-711
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include "AudioTools.h"
2+
#include "AudioTools/Sandbox/USB/USBDeviceAudioAdafruit.h"
3+
4+
size_t sample_count_mic = 0;
5+
size_t sample_count_spk = 0;
6+
7+
// Microphone: generate data for USB
8+
size_t readCB(uint8_t* data, size_t len, USBDeviceAudio& ref) {
9+
int16_t* data16 = (int16_t*)data;
10+
size_t samples = len / sizeof(int16_t);
11+
size_t result = 0;
12+
// generate random stereo data
13+
for (int j = 0; j < samples; j+=2) {
14+
data16[j] = random(-32000, 32000);
15+
data16[j+1] = random(-32000, 32000);;
16+
result += sizeof(int16_t)*2;
17+
sample_count_mic += 2;
18+
}
19+
return result;
20+
}
21+
22+
// Speaker: receive data from USB and write them to the final destination
23+
size_t writeCB(const uint8_t* data, size_t len, USBDeviceAudio & ref) {
24+
int16_t* data16 = (int16_t*)data;
25+
size_t samples = len / sizeof(int16_t);
26+
sample_count_spk += samples;
27+
return len;
28+
}
29+
30+
auto config() {
31+
USBAudioConfig result;
32+
result.p_read_callback = readCB;
33+
result.p_write_callback = writeCB;
34+
return result;
35+
}
36+
37+
USBDeviceAudioAdafruit usb{config()};
38+
39+
void setup() {
40+
// Manual begin() is required on core without built-in support e.g. mbed rp2040
41+
if (!TinyUSBDevice.isInitialized()) {
42+
TinyUSBDevice.begin(0);
43+
}
44+
45+
Serial.begin(115200);
46+
47+
// If already enumerated, additional class driver begin() e.g msc, hid, midi won't take effect until re-enumeration
48+
if (TinyUSBDevice.mounted()) {
49+
TinyUSBDevice.detach();
50+
delay(10);
51+
TinyUSBDevice.attach();
52+
}
53+
}
54+
55+
void loop() {
56+
#ifdef TINYUSB_NEED_POLLING_TASK
57+
// Manual call tud_task since it isn't called by Core's background
58+
TinyUSBDevice.task();
59+
#endif
60+
// use LED do display status
61+
if (usb.updateLED(LED_BUILTIN)){
62+
Serial.print("Total Microphone samples: ");
63+
Serial.print(sample_count_mic);
64+
Serial.print(" / Speaker samples: ");
65+
Serial.print(sample_count_spk);
66+
Serial.print(" / Sample rate: ");
67+
Serial.println(usb.rate());
68+
}
69+
}

src/AudioTools/CoreAudio/AudioI2S/I2SESP32V1.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,11 @@ class I2SDriverESP32V1 {
151151
i2s_chan_handle_t &rx_chan) {
152152
return false;
153153
}
154+
155+
protected:
156+
/// 24 bits are stored in a 32 bit integer
157+
int get_bits_eff(int bits) { return ( bits == 24 )? 32 : bits; }
158+
154159
};
155160

156161
struct DriverI2S : public DriverCommon {
@@ -251,7 +256,7 @@ class I2SDriverESP32V1 {
251256
cfg.is_master ? I2S_ROLE_MASTER : I2S_ROLE_SLAVE);
252257
// use the legicy size parameters for frame num
253258
int size = cfg.buffer_size * cfg.buffer_count;
254-
int frame_size = cfg.bits_per_sample * cfg.channels / 8;
259+
int frame_size = get_bits_eff(cfg.bits_per_sample) * cfg.channels / 8;
255260
if (size > 0) result.dma_frame_num = size / frame_size;
256261
LOGI("dma_frame_num: %d", (int)result.dma_frame_num);
257262
result.auto_clear = cfg.auto_clear;

0 commit comments

Comments
 (0)