USBAudio

This content relates to a deprecated version of Mbed

Mbed 2 is now deprecated. For the latest version please see the Mbed OS documentation.

The USBAudio class enables the mbed to be recognized as an audio device. With this interface, you can receive and send audio packets from and to a computer (play a music,...) over USB. For instance you can connect a speaker or an I2S/I2C chip to the mbed and play the stream received from the computer.

The USB connector should be attached to

  • p31 (D+), p32 (D-) and GND for the LPC1768 and the LPC11U24
  • The on-board USB connector of the FRDM-KL25Z

Change the default sound board

To send audio packets to the mbed, you have to change the default sound board used by the Operating system.
On Windows, you can do this by clicking on:

  • control panel
  • Hardware and Sound
  • Manage audio device in the Sound section
  • Select the Mbed Audio device and press Set default

Hello World

Import program

00001 // Hello World example for the USBAudio library
00002  
00003 #include "mbed.h"
00004 #include "USBAudio.h"
00005  
00006 Serial pc(USBTX, USBRX);
00007  
00008 // frequency: 48 kHz
00009 #define FREQ 48000
00010  
00011 // 1 channel: mono
00012 #define NB_CHA 1
00013  
00014 // length of an audio packet: each ms, we receive 48 * 16bits ->48 * 2 bytes. as there is one channel, the length will be 48 * 2 * 1
00015 #define AUDIO_LENGTH_PACKET 48 * 2 * 1
00016  
00017 // USBAudio
00018 USBAudio audio(FREQ, NB_CHA);
00019  
00020 int main() {
00021     int16_t buf[AUDIO_LENGTH_PACKET/2];
00022     
00023     while (1) {
00024         // read an audio packet
00025         audio.read((uint8_t *)buf);
00026  
00027         // print packet received
00028         pc.printf("recv: ");
00029         for(int i = 0; i < AUDIO_LENGTH_PACKET/2; i++) {
00030             pc.printf("%d ", buf[i]);
00031         }
00032         pc.printf("\r\n");
00033     }
00034 }

API

Import library

Public Member Functions

USBAudio (uint32_t frequency_in=48000, uint8_t channel_nb_in=1, uint32_t frequency_out=8000, uint8_t channel_nb_out=1, uint16_t vendor_id=0x7bb8, uint16_t product_id=0x1111, uint16_t product_release=0x0100)
Constructor.
float getVolume ()
Get current volume between 0.0 and 1.0.
bool read (uint8_t *buf)
Read an audio packet.
bool readNB (uint8_t *buf)
Try to read an audio packet.
bool write (uint8_t *buf)
Write an audio packet.
bool readWrite (uint8_t *buf_read, uint8_t *buf_write)
Write and read an audio packet at the same time (on the same frame)
void attach (void(*fptr)(void))
attach a handler to update the volume
template<typename T >
void attach (T *tptr, void(T::*mptr)(void))
Attach a nonstatic void/void member function to update the volume.

More examples

The following program is sending to a speaker all audio packets received. This means that you can play a music on your computer and listen it on your Mbed.

Import programUSBAUDIO_speaker

USBAudio speaker example

The USBAudio playback example sends back to the computer all audio packets received. You can then listen for incoming audio packets with audacity for instance.

Import programUSBAudioPlayback

USBAudio example: playback

In details

Audio packet length

In this section, I will explain what kind of packets are received according to the frequency and the number of channels.

An audio packet is received each millisecond. So let's say that a frequency of 48 kHz has been chosen with 2 channels (stereo). Knowing that each sample of a packet are 16 bits long, 48 * 2 bytes will be received each millisecond for one channel. In total, for 2 channels, 48 * 2 * 2 bytes will be received.

Compute the length packet

AUDIO_LENGTH_PACKET = (FREQ / 500) * nb_channel

How to interpret an audio packet ?

The read() function fills an uint8_t array. But these data has to be interpreted as 16 bits signed data (PCM). Then PCM values can be handled according to the number of channels.

MONO: single channel

/media/uploads/samux/pcm.png

STEREO: 2 channels

When there are 2 channels, values for channel 1 and values for channel 2 will alternate as explained in the following diagram:

/media/uploads/samux/pcm_stereo.png


All wikipages