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 application
  • device_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.