#include <Arduino.h>
#include "USB_STREAM.h"
// Microphone callback function
static void onMicFrameCallback(mic_frame_t *frame, void *ptr) {
Serial.printf("Mic frame: bit_resolution=%u, samples_frequence=%u, data_bytes=%u\n",
frame->bit_resolution,
frame->samples_frequence,
frame->data_bytes);
// Process audio data
uint8_t *audio_data = (uint8_t *)frame->data;
// Add your audio processing logic here
}
void setup() {
Serial.begin(115200);
// Create USB_STREAM instance
USB_STREAM *usb = new USB_STREAM();
// Configure microphone (accept any format, 6400 byte buffer)
usb->uacConfiguration(
UAC_CH_ANY, // Accept any mic channels
UAC_BITS_ANY, // Accept any mic bit resolution
UAC_FREQUENCY_ANY, // Accept any mic frequency
6400, // 6400 byte mic buffer
UAC_CH_ANY, // No speaker
UAC_BITS_ANY,
UAC_FREQUENCY_ANY,
0 // No speaker buffer
);
// Register microphone callback
usb->uacMicRegisterCb(&onMicFrameCallback, NULL);
// Start USB streaming
usb->start();
// Wait for device connection
usb->connectWait(1000);
delay(1000);
// Get microphone frame information
uac_frame_size_t frame_info;
if (usb->uacMicGetFrameSize(&frame_info) != NULL) {
Serial.printf("Microphone format: %d channels, %d bits, %u Hz\n",
frame_info.ch_num,
frame_info.bit_resolution,
frame_info.samples_frequence);
}
// Unmute microphone
usb->uacMicMute((void *)0);
// Set volume to 60
usb->uacMicVolume((void *)60);
// Example: Suspend and resume
delay(5000);
usb->uacMicSuspend(NULL);
Serial.println("Microphone suspended");
delay(2000);
usb->uacMicResume(NULL);
Serial.println("Microphone resumed");
}
void loop() {
// Alternative: Read microphone data directly
uint8_t mic_buffer[2048];
size_t bytes_read = 0;
// Read with 100ms timeout
USB_STREAM *usb = USB_STREAM::getInstance(); // Get instance
usb->uacReadMic(mic_buffer, sizeof(mic_buffer), &bytes_read, 100);
if (bytes_read > 0) {
Serial.printf("Read %d bytes from microphone\n", bytes_read);
// Process mic_buffer
}
delay(100);
}