USBAudio
USBAudio class hierarchy
You can use the USBAudio interface to send and receive audio data over USB. Once a USB program is loaded onto the Mbed board, you can send audio data to your PC by selecting Mbed Audio as your PC's microphone input. Your Mbed Enabled board can receive audio data from your PC if you select Mbed Audio as your PC's speaker output.
USBAudio class reference
Public Member Functions | |
USBAudio (bool connect=true, uint32_t frequency_rx=48000, uint8_t channel_count_rx=1, uint32_t frequency_tx=8000, uint8_t channel_count_tx=1, uint32_t buffer_ms=10, uint16_t vendor_id=0x7bb8, uint16_t product_id=0x1111, uint16_t product_release=0x0100) | |
Basic constructor. More... | |
USBAudio (USBPhy *phy, uint32_t frequency_rx, uint8_t channel_count_rx, uint32_t frequency_tx, uint8_t channel_count_tx, uint32_t buffer_ms, uint16_t vendor_id, uint16_t product_id, uint16_t product_release) | |
Fully featured constructor. More... | |
virtual | ~USBAudio () |
Destroy this object. More... | |
void | connect () |
Connect USBAudio. More... | |
void | disconnect () |
Disconnect USBAudio. More... | |
bool | read (uint8_t *buf, uint32_t size) |
Read audio data. More... | |
void | read_nb (uint8_t *buf, uint32_t size, uint32_t *actual) |
Nonblocking audio data read. More... | |
uint32_t | read_overflows (bool clear=false) |
Return the number read packets dropped due to overflow. More... | |
bool | read_ready () |
Check if the audio read channel is open. More... | |
void | read_wait_ready () |
Wait until the audio read channel is open. More... | |
bool | write (uint8_t *buf, uint32_t size) |
Write audio data. More... | |
void | write_nb (uint8_t *buf, uint32_t size, uint32_t *actual) |
Nonblocking audio data write. More... | |
uint32_t | write_underflows (bool clear=false) |
Return the number write packets not sent due to underflow. More... | |
bool | write_ready () |
Check if the audio write channel is open. More... | |
void | write_wait_ready () |
Wait until the audio write channel is open. More... | |
float | get_volume () |
Get current volume between 0.0 and 1.0. More... | |
void | attach (mbed::Callback< void()> &cb) |
Attach a Callback to update the volume. More... | |
void | attach_tx (mbed::Callback< void(AudioEvent)> &cb) |
attach a Callback to Tx Done More... | |
void | attach_rx (mbed::Callback< void(AudioEvent)> &cb) |
attach a Callback to Rx Done More... |
Protected Member Functions | |
virtual void | callback_state_change (DeviceState new_state) |
Called when USB changes state. More... | |
virtual void | callback_request (const setup_packet_t *setup) |
Called by USBDevice on Endpoint0 request. More... | |
virtual void | callback_request_xfer_done (const setup_packet_t *setup, bool aborted) |
Called by USBDevice on data stage completion. More... | |
void | init () |
Initialize this instance. More... | |
void | deinit () |
Power down this instance. More... | |
bool | configured () |
Check if the device is configured. More... | |
void | sof_enable () |
Enable the start of frame interrupt. More... | |
void | sof_disable () |
Disable the start of frame interrupt. More... | |
bool | endpoint_add (usb_ep_t endpoint, uint32_t max_packet, usb_ep_type_t type, mbed::Callback< void()> callback=nullptr) |
Add an endpoint. More... | |
template<typename T > | |
bool | endpoint_add (usb_ep_t endpoint, uint32_t max_packet, usb_ep_type_t type, void(T::*callback)()) |
Add an endpoint. More... | |
void | endpoint_remove (usb_ep_t endpoint) |
Remove an endpoint. More... | |
void | endpoint_remove_all () |
Remove all non-zero endpoints. More... | |
void | endpoint_stall (usb_ep_t endpoint) |
Stall an endpoint. More... | |
void | endpoint_unstall (usb_ep_t endpoint) |
Un-stall an endpoint. More... | |
uint32_t | endpoint_max_packet_size (usb_ep_t endpoint) |
Get the current maximum size for this endpoint. More... | |
void | endpoint_abort (usb_ep_t endpoint) |
Abort the current transfer on this endpoint. More... | |
bool | read_start (usb_ep_t endpoint, uint8_t *buffer, uint32_t size) |
start a read on the given endpoint More... | |
uint32_t | read_finish (usb_ep_t endpoint) |
Get the status of a read. More... | |
bool | write_start (usb_ep_t endpoint, uint8_t *buffer, uint32_t size) |
Write a data to the given endpoint. More... | |
uint32_t | write_finish (usb_ep_t endpoint) |
Get the status of a write. More... | |
virtual void | callback_power (bool powered) |
Called by USBDevice layer on power state change. More... | |
virtual void | callback_sof (int frame_number) |
Called by USBDevice layer on each new USB frame. More... | |
virtual void | callback_reset () |
Called by USBDevice layer on bus reset. More... | |
void | complete_request (RequestResult result, uint8_t *data=NULL, uint32_t size=0) |
Called to complete the setup stage of a callback request. More... | |
void | complete_request_xfer_done (bool success) |
Called to complete the data stage of a callback request. More... | |
void | complete_set_configuration (bool success) |
Called to complete a set configuration command. More... | |
void | complete_set_interface (bool success) |
Called to complete a set interface command. More... | |
uint8_t * | find_descriptor (uint8_t descriptor_type, uint8_t index=0) |
Find a descriptor type inside the configuration descriptor. More... | |
const usb_ep_table_t * | endpoint_table () |
Get the endpoint table of this device. More... | |
virtual void | start_process () |
Callback called to indicate the USB processing needs to be done. More... | |
virtual void | lock () |
Acquire exclusive access to this instance USBDevice. More... | |
virtual void | unlock () |
Release exclusive access to this instance USBDevice. More... | |
virtual void | assert_locked () |
Assert that the current thread of execution holds the lock. More... |
USBAudio square wave example
This example outputs an audio square wave over USB.
/*
* Copyright (c) 2006-2020 Arm Limited and affiliates.
* SPDX-License-Identifier: Apache-2.0
*/
#include "mbed.h"
#include "USBAudio.h"
#include <math.h>
int16_t square_wave(uint32_t freq_hz, uint16_t amplitude, float time_s)
{
float period = (float)1 / freq_hz;
if (fmod(time_s, period) > period / 2) {
return amplitude / 2;
} else {
return -(amplitude / 2);
}
}
int main()
{
uint32_t tx_freq = 16000;
USBAudio audio(true, 8000, 2, tx_freq, 1, 10, 0x7bb8, 0x1112, 0x0100);
float cur_time = 0;
while (true) {
uint16_t samples[64];
for (int i = 0; i < 64; i++) {
samples[i] = square_wave(100, 5000, cur_time);
cur_time += 1.0 / tx_freq;
}
if (!audio.write((uint8_t *)&samples, sizeof(samples))) {
audio.write_wait_ready();
}
}
}
USBAudio loopback example
This example loops input audio to the Mbed board back to the host PC, so that you may record the audio or listen to it through headphones or speakers.
/*
* Copyright (c) 2006-2020 Arm Limited and affiliates.
* SPDX-License-Identifier: Apache-2.0
*/
#include "mbed.h"
#include "USBAudio.h"
int main()
{
USBAudio audio(true, 44100, 2, 44100, 2);
printf("Looping audio\r\n");
static uint8_t buf[128];
while (true) {
if (!audio.read(buf, sizeof(buf))) {
memset(buf, 0, sizeof(buf));
}
audio.write(buf, sizeof(buf));
}
}
USBAudio play sound data example
This example loads raw audio data to your board's flash. That data then plays on the host PC over USB. We have tested this example with the NXP FRDM-K64F, which has 1 MB of flash memory. If you are using a board that has less than 1 MB of flash memory, delete data from the end of the data
array, and set NUM_ELEMENTS
accordingly until the program size is small enough to flash without exceeding storage. Follow the link below, and click Ctrl + s to save the raw code view for main.cpp
.