#include <Arduino.h>
#include "USB_STREAM.h"
USB_STREAM *usb;
bool speaker_running = true;
void setup() {
Serial.begin(115200);
usb = new USB_STREAM();
// Configure for stereo, 16-bit, 48kHz speaker
usb->uacConfiguration(
UAC_CH_ANY, UAC_BITS_ANY, UAC_FREQUENCY_ANY, 0, // No mic
2, 16, 48000, 8192 // Stereo speaker
);
usb->start();
usb->connectWait(1000);
// Get actual speaker configuration
size_t list_size = 0;
size_t current_index = 0;
usb->uacSpkGetFrameListSize(&list_size, ¤t_index);
Serial.printf("Speaker frame list size: %d, index: %d\n", list_size, current_index);
uac_frame_size_t frame_info;
if (usb->uacSpkGetFrameSize(&frame_info) != NULL) {
Serial.printf("Active format: %d ch, %d bits, %u Hz (range: %u-%u Hz)\n",
frame_info.ch_num,
frame_info.bit_resolution,
frame_info.samples_frequence,
frame_info.samples_frequence_min,
frame_info.samples_frequence_max);
}
// Unmute and set volume
usb->uacSpkMute((void *)0);
usb->uacSpkVolume((void *)75);
}
void loop() {
if (speaker_running) {
// Create stereo audio (left and right channels)
const size_t samples_per_channel = 512;
uint16_t stereo_buffer[samples_per_channel * 2];
for (size_t i = 0; i < samples_per_channel; i++) {
// Left channel: 440 Hz (A4)
float left = sin(2.0 * PI * 440.0 * i / 48000.0);
stereo_buffer[i * 2] = (uint16_t)((left + 1.0) * 32767.5);
// Right channel: 554.37 Hz (C#5)
float right = sin(2.0 * PI * 554.37 * i / 48000.0);
stereo_buffer[i * 2 + 1] = (uint16_t)((right + 1.0) * 32767.5);
}
// Write stereo audio
usb->uacWriteSpk(stereo_buffer, sizeof(stereo_buffer), 500);
}
// Check for serial commands
if (Serial.available()) {
char cmd = Serial.read();
switch (cmd) {
case 'p': // Pause
usb->uacSpkSuspend(NULL);
speaker_running = false;
Serial.println("Speaker paused");
break;
case 'r': // Resume
usb->uacSpkResume(NULL);
speaker_running = true;
Serial.println("Speaker resumed");
break;
case 'm': // Mute
usb->uacSpkMute((void *)1);
Serial.println("Speaker muted");
break;
case 'u': // Unmute
usb->uacSpkMute((void *)0);
Serial.println("Speaker unmuted");
break;
case 's': // Switch to mono 44.1kHz
usb->uacSpkSuspend(NULL);
usb->uacSpkFrameReset(1, 16, 44100);
usb->uacSpkResume(NULL);
Serial.println("Switched to mono 44.1kHz");
break;
}
}
delay(10);
}