Audio Codec
audio codec is an audio device that takes care of receiving and transmitting audio sample data to the analog input and outputs.
AudioDevice
on KLST_PANDA the default audio device can be intialized with system_init_audiocodec()
. this initializes the audio device connected to audio jacks on KLST_PANDA ( see Technical Specifications ):
- ⑭ :: line out
- ⑮ :: line in
- ⑯ :: headphones + mic
- ⑰ :: microphone in
AudioDevice
implements the following functions:
void audioblock(AudioBlock* audio_block)
AudioDevice* audiodevice_init_audiocodec(AudioInfo* audioinfo)
void audiodevice_deinit(AudioDevice* audiodevice)
void audiodevice_resume(AudioDevice* audiodevice)
void audiodevice_pause(AudioDevice* audiodevice)
void audiodevice_setup_device(AudioDevice* audiodevice)
AudioDevice* audiodevice_create_from_audioinfo(AudioInfo* audioinfo)
AudioInfo
structure that can be used to initalize an audio device with audiodevice_init_audiocodec(AudioInfo*)
. properties like sample rate and in- and output channels can be specified.
uint32_t sample_rate
uint8_t output_channels
uint8_t input_channels
uint16_t block_size
uint8_t bit_depth
uint8_t device_type
uint8_t device_id
AudioBlock
structure that is passed to the callback function void audioblock(AudioBlock*)
.
input
:: contains sample data from audio input ( if present ).output
:: expects sample data to be written to by applicationdevice_id
:: can be used to distinguish between audio device ( if multiple devices are present )
uint32_t sample_rate
uint8_t output_channels
uint8_t input_channels
uint16_t block_size
float** output
float** input
uint8_t device_id
Example AudioCodec
/**
* this example demonstrates how to set up the audio code and generate a sine wave sound.
*/
#include "Arduino.h"
#include "System.h"
#include "Console.h"
#include "AudioDevice.h"
#include "MWavetable.h"
float wavetable[512];
MWavetable oscillator_left{wavetable, 512, 48000};
MWavetable oscillator_right{wavetable, 512, 48000};
AudioDevice* audiodevice;
float osc_frequency = 440.0f;
bool audiocodec_paused = false;
void setup() {
system_init();
MWavetable::fill(wavetable, 512, MWavetable::WAVEFORM_SINE);
oscillator_left.set_amplitude(0.1f);
oscillator_right.set_amplitude(0.15f);
// long init section ...
AudioInfo audioinfo;
audioinfo.sample_rate = 48000;
audioinfo.output_channels = 2;
audioinfo.input_channels = 2;
audioinfo.block_size = 128;
audioinfo.bit_depth = 16;
audiodevice = audiodevice_init_audiocodec(&audioinfo);
if (audiodevice->audioinfo->device_id == AUDIO_DEVICE_INIT_ERROR) {
console_error("error initializing audio device");
}
audiodevice_resume(audiodevice);
// ... or for short with default values and auto start
// audiodevice = system_init_audiocodec();
}
void loop() {
osc_frequency += 10.0f;
if (osc_frequency > 880.0f) {
osc_frequency = 220.0f;
}
oscillator_left.set_frequency(osc_frequency);
oscillator_right.set_frequency(osc_frequency * 0.495f);
console_println("frequency: %f", osc_frequency);
if ((audiocodec_paused = !audiocodec_paused)) {
audiodevice_pause(audiodevice);
} else {
audiodevice_resume(audiodevice);
}
delay(1000);
}
void audioblock(AudioBlock* audio_block) {
for (int i = 0; i < audio_block->block_size; ++i) {
audio_block->output[0][i] = audio_block->input[0][i] + oscillator_left.process();
audio_block->output[1][i] = audio_block->input[1][i] + oscillator_right.process();
}
}
// arduino-cli compile -u -b klangstrom:emulator:KLST_EMU:board=KLST_PANDA AudioCodec
// arduino-cli compile -u -b STMicroelectronics:stm32:KLST_PANDA AudioCodec
also see README for additional information.