Maestro Audio Framework  v 1.7
NXP Semiconductors
Getting started with Maestro framework

Introduction

This document describes the basic usage of the Maestro Audio Framework. This framework intends to enable the chaining of basic audio processing blocks (called "elements"). These blocks then form stream processing objects ("pipeline"). This pipeline can be used for multiple audio processing use cases. The processing blocks can include (but are not limited to) different audio sources (for example file or microphone), decoders or encoders, filters or effects, and audio sinks. For detailed description of the Maestro framework, please refer to the programmer's guide.

Framework overview is depicted in the following picture:

Supported examples

  • maestro_playback
  • maestro_record
  • maestro_usb_mic
  • maestro_usb_speaker
  • maestro_sync

The examples can be found in the audio_examples folder of the desired board. The demo applications are based on FreeRTOS and use multiple tasks to form the application functionality.

maestro_playback

  • file: Perform audio file decode and playback to the line-out (speaker).
    • start: Play default (first found) or specified audio track file.
    • stop: Stops actual playback.
    • pause: Pause actual track or resume if already paused.
    • volume: Set volume. The volume can be set from 0 to 100.
    • seek: Seek currently paused track. Seek time is absolute time in milliseconds.
    • track filename: Select audio track to play.
    • list: List audio files available on mounted SD card.
    • info: Prints playback info.

maestro_record

  • record_mic: Records MIC audio and either:
    • audio: Playback on a codec (line-out/speaker).
    • file [file_name]: Store samples from onboard microphone to a file on sd card.
    • vit: On supported boards perform VoiceSeeker pre-processing, then perform voice recognition (VIT).
  • opus_encode: Perform opus encoding on a sample pcm file and compare with a reference.

maestro_usb_mic

  • usb_mic: Record MIC audio and playback to the USB port as an audio 2.0 microphone device.

maestro_usb_speaker

  • usb_speaker: Play data from the USB port as an audio 2.0 speaker device.

maestro_sync

  • start: Demonstrates the use of synchronous pipelines (Tx and Rx in this case).
  • stop: Stops a running streamer.
  • debug [on|off]: Starts / stops debugging.

Example applications overview

To set up the audio framework properly, it is necessary to create a streamer with streamer_create API. It is also essential to set up the desired hardware peripherals using the functions described in streamer_pcm.h. The Maestro example projects consist of several files regarding the audio framework. The initial file is main.c with code to create multiple tasks. For features including SD card (in the maestro_playback examples, reading a file from SD card is supported and in maestro_record writing to SD card is currently supported) the APP_SDCARD_Task is created. The command prompt and connected functionalities are handled by APP_Shell_Task.

One of the most important parts of the configuration is the streamer_pcm.c where the initialization of the hardware peripherals, input and output buffer management can be found. For further information please see also streamer_pcm.h

In the Maestro USB examples (maestro_usb_mic and maestro_usb_speaker), the USB configuration is located in the usb_device_descriptor.c, audio_microphone.c and audio_speaker.c files. For further information please see also usb_device_descriptor.h, audio_microphone.h and audio_speaker.h.

In order to be able to get the messages from the audio framework, it is necessary to create a thread for receiving the messages from the streamer, which is usually called a Message Task. The message thread is placed in the app_streamer.c file, reads the streamer message queue, and reacts to the following messages:

  • STREAM_MSG_ERROR - stops the streamer and exits the message thread
  • STREAM_MSG_EOS - stops the streamer and exits the message thread
  • STREAM_MSG_UPDATE_DURATION - prints info about the stream duration
  • STREAM_MSG_UPDATE_POSITION - prints info about current stream position
  • STREAM_MSG_CLOSE_TASK - exits the message thread

Commands

version

Prints component versions

file

File command is supported in the maestro_playback example. The command calls the STREAMER_file_Create or STREAMER_PCM_Create function from the app_streamer.c file depending on whether or not MULTICHANNEL_EXAMPLE is defined.

  • When MULTICHANNEL_EXAMPLE is not defined:
    • The command calls STREAMER_file_Create function that creates the STREAM_PIPELINE_FILESYSTEM pipeline.
    • When SSRC_PROC is defined, the synchronous sample rate converter is added before the audio sink element.   Playback itself can be started with STREAMER_Start function. The pipeline can consist of the following elements:
      • TYPE_ELEMENT_FILE_SRC
      • TYPE_ELEMENT_DECODER
      • TYPE_ELEMENT_AUDIO_PROC (If SSRC_PROC is defined)
      • TYPE_ELEMENT_AUDIO_SINK  
  • When MULTICHANNEL_EXAMPLE is defined:
    • The command calls STREAMER_PCM_Create function, which creates STREAM_PIPELINE_PCM_AUDIO pipeline.
    • If the input file is an 8 channel PCM file, output to all 8 channels is available.
      • The properties of the PCM file are set in the app_streamer.c file using file source properties sent to the streamer: PROP_FILESRC_SET_SAMPLE_RATE - default value is 96000 [Hz] PROP_FILESRC_SET_NUM_CHANNELS - default value is 8 PROP_FILESRC_SET_BIT_WIDTH - default value is 32
    • The synchronous sample rate converter is not supported in the multi-channel examples.   Playback itself can be started with STREAMER_Start function. The pipeline can consist of the following elements:
      • TYPE_ELEMENT_FILE_SRC (PCM format only)
      • TYPE_ELEMENT_AUDIO_SINK

Other possible element types could be found in the streamer_api.h.

Each of the elements has several properties that can be accessed using streamer_get_property. These properties allow a user to change the values of the appropriate elements. The list of properties can be found in streamer_element_properties.h. See the example of setting property value in the following piece of code from app_streamer.c:

EXT_PROCESS_DESC_T ssrc_proc = {SSRC_Proc_Init, SSRC_Proc_Execute, SSRC_Proc_Deinit, &get_app_data()->proc_args};
prop.prop = PROP_SRC_PROC_FUNCPTR;
prop.val = (uintptr_t)&ssrc_proc;
if (streamer_set_property(streamer, 0, prop, true) != 0)
{
return -1;
}
prop.prop = PROP_AUDIOSINK_SET_VOLUME;
prop.val = volume;
streamer_set_property(streamer, 0, prop, true);
int32_t streamer_set_property(STREAMER_T *streamer, int8_t pipeline_id, ELEMENT_PROPERTY_T prop, bool block)
Set element property.
Definition: streamer.c:784
Element Property structure.
Definition: streamer_api.h:567
uint16_t prop
property type
Definition: streamer_api.h:568
uintptr_t val
property value
Definition: streamer_api.h:569
External processing funcion prototypes and arguments.
Definition: streamer_element_properties.h:23

Some of the predefined values can be found in the streamer_api.h.

record_mic

Record_mic command is only supported in the maestro_record example. The command creates pipeline described in the STREAMER_mic_Create function in the app_streamer.c file. The pipeline is selected with STREAM_PIPELINE_PCM, STREAM_PIPELINE_MIC2FILE or STREAM_PIPELINE_VIT in pipeline_type parameter. Depending on the command option, that may be either audio, file or vit. This configuration takes samples from the microphone input and sends them to the audio sink (speaker(s) or filesystem) with optional processing in between.

The pipeline can consist of the following elements:

  • TYPE_ELEMENT_AUDIO_SRC
  • TYPE_ELEMENT_AUDIO_PROC (If VOICE_SEEKER_PROC is defined and the VIT option has been selected)
  • TYPE_ELEMENT_AUDIO_SINK or TYPE_ELEMENT_FILE_SINK or TYPE_ELEMENT_VIT_SINK

Other possible element types and some of the predefined values could be found in the streamer_api.h.

opus encode

Opus_encode command is only supported in the maestro_record example. The command creates pipeline described in the STREAMER_opusmem2mem_Create function in the app_streamer.c file. The pipeline is selected with STREAM_PIPELINE_OPUS_MEM2MEM in pipeline_type parameter. This configuration takes PCM samples from memory and sends them to the Opus encoder. The encoded data is stored in memory and compared to a reference.

The pipeline can consist of the following elements:

  • TYPE_ELEMENT_MEM_SRC
  • TYPE_ELEMENT_ENCODER
  • TYPE_ELEMENT_MEM_SINK

Other possible element types and some of the predefined values could be found in the streamer_api.h.

usb_mic

Usb_mic command is only supported in the maestro_usb_mic example. The command creates pipeline described in the STREAMER_mic_Create function in the app_streamer.c file. The pipeline is selected with STREAM_PIPELINE_PCM in pipeline_type parameter. This configuration takes samples from the microphone input and sends them to the audio sink (USB port). The pipeline can consist of the following elements:

  • TYPE_ELEMENT_AUDIO_SRC
  • TYPE_ELEMENT_AUDIO_SINK

Other possible element types and some of the predefined values could be found in streamer_api.h.

usb_speaker

Usb_speaker command is only supported in the maestro_usb_speaker example. The command creates pipeline described in the STREAMER_speaker_Create function in the app_streamer.c file. The pipeline is selected with STREAM_PIPELINE_PCM in pipeline_type parameter. This configuration takes samples from the USB port and sends them to the audio sink (speaker output). The pipeline can consist of the following elements:

  • TYPE_ELEMENT_AUDIO_SRC
  • TYPE_ELEMENT_AUDIO_SINK

Other possible element types and some of the predefined values could be found in streamer_api.h.

start

Start command is only supported in the maestro_sync example. The command creates two pipelines described in the STREAMER_Create function in the app_streamer.c file. The pipelines are selected with the STREAM_PIPELINE_PCM_AUDIO_MEM and STREAM_PIPELINE_VIT_FILESINK in pipeline_type parameter. This configuration should demonstrate the use of synchronous pipelines (Tx and Rx in this case) in a single streamer task.

  • Playback (Tx) pipeline:
    • Playback of audio data in PCM format stored in flash memory to the speaker.
  • Recording (Rx) pipline:
    • Record audio data using a microphone.
    • VoiceSeeker processing.
    • Wake words + voice commands recognition.
    • Save VoiceSeeker output to SD card.  
  • The playback (Tx) pipeline consists of the following elements:
    • TYPE_ELEMENT_MEM_SRC
    • TYPE_ELEMENT_AUDIO_SINK
  • The recording (Rx) pipeline consists of the following elements:
    • TYPE_ELEMENT_AUDIO_SRC
    • TYPE_ELEMENT_AUDIO_PROC (as VoiceSeeker)
    • TYPE_ELEMENT_AUDIO_PROC (as VIT)
    • TYPE_ELEMENT_FIlE_SINK

Other possible element types and some of the predefined values could be found in streamer_api.h.

Configuration options

Users can change the pipeline type when creating the streamer object. Currently tested options are:

  • STREAM_PIPELINE_PCM
  • STREAM_PIPELINE_NETBUF
  • STREAM_PIPELINE_FILESYSTEM
  • STREAM_PIPELINE_MIC2FILE
  • STREAM_PIPELINE_VIT
  • STREAM_PIPELINE_MEM
  • STREAM_PIPELINE_OPUS_MEM2MEM
  • STREAM_PIPELINE_PCM_AUDIO
  • STREAM_PIPELINE_PCM_AUDIO_MEM
  • STREAM_PIPELINE_VIT_FILESINK

In order to create a user defined pipeline, please see the programmer's guide.

Supported features

The current version of the audio framework supports some optional features. These can be limited to some MCU cores or boards variants.

Codecs

The maestro_playback can play multiple files with the file option (STREAM_PIPELINE_FILESYSTEM). The opus (as standalone or as a part of ogg encapsulation) and mp3 codecs are supported for now. For detailed code handling this file extension please check cmd.c file and shellFile() function. Supported codecs and its options are:

Decoder Sample rates [kHz] Number of channels Bit depth
AAC 8, 11.025, 16, 22.050, 24, 32, 44.1, 48 1, 2 (mono/stereo) 16
FLAC 8, 11.025, 16, 22.050, 24, 32, 44.1, 48 1, 2 (mono/stereo) 16
MP3 8, 11.025, 16, 22.050, 32, 44.1, 48 1, 2 (mono/stereo) 16
opus 8, 16, 24, 48 1, 2 (mono/stereo) 16
WAV 8, 11.025, 16, 22.050, 32, 44.1, 48 1, 2 (mono/stereo) 8, 16, 24

For more details about the codecs please see following documents: AAC decoder,FLAC decoder,MP3 decoder,opus,WAV decoder

Using maestro_playback_8ch_96kHz example users can play PCM files from the SD card and output either 2 or 8 channels with 96kHz sampling rate and 32bit depth (just RT1060-EVKB with AUD-EXP-42448 expansion board supported).

VIT

VIT can be enabled for the record_mic command using the vit option. In the STREAMER_mic_Create function in the app_streamer.c file, the VIT_PROC preprocessor define ensures the creation of pipeline with VIT (STREAM_PIPELINE_VIT). More details about VIT are available in the VIT package, which is located in middleware\vit\{platform}\Doc\(depending on the platform) or via following link.

VoiceSeeker

VoiceSeeker can be enabled for the record_mic command using the vit option. In the STREAMER_mic_Create function in the app_streamer.c file, the VIT_PROC and VOICE_SEEKER_PROC preprocessor defines ensure the creation of pipeline with VIT and VoiceSeeker (STREAM_PIPELINE_VIT). More details about VoiceSeeker are available in the VoiceSeeker package, which is located in middleware\voice_seeker\{platform}\Doc\(depending on the platform) or via following link.

SSRC

Synchronous sample rate converter can be enabled for the file command. In the STREAMER_file_Create function on the app_streamer.c file SSRC_PROC preprocessor define ensures the creation of pipeline with the synchronous sample rate converter. More details about SSRC are available in the User Guide, which is located in middleware\maestro\mcu-audio\ssrc\doc\.

ASRC

Asynchronous sample rate converter is not used in our examples, but it is part of the maestro middleware and can be enabled. To enable ASRC, the maestro_framework_asrc and CMSIS_DSP_Library_Source components must be added to the project. Furthermore, it is necessary to switch from Redlib to Newlib (semihost) library and add a platform definition to the project (e.g. for RT1170: PLATFORM_RT1170_CORTEXM7). Supported platforms can be found in the PL_platformTypes.h file.