Audio Development Guide_Rev1.1
1 Revision History
Version |
Date |
Author |
Reviewer |
Revision Content |
|---|---|---|---|---|
Rev1.0 |
2026-01-29 |
sxx |
zlc |
Document created |
2 Introduction
This document describes the LTE-EC71X Audio interface APIs, which are declared in the liot_audio2.h file.
The Audio interface is a wrapper for Codec device audio interfaces that integrate I2S data transmission. Currently adapted hardware drivers include ES8311, TM8211, ES8374, and ES8375.
2.1 Audio Control Logic
Upon receiving audio initialization, the system first matches the Codec type and performs Codec hardware initialization. For example, ES8311 first configures related registers via I2C, then initializes the I2S bus, and creates an audio playback queue. Audio playback is asynchronous — after calling Liot_AudioPlay(), a backup is created in the audio playback queue for playback. Theoretically, the queue length has no upper limit and is determined by the system’s memory allocation limit.
MP3 and PCM playback first decodes the data source and then places it into the audio playback queue.
2.2 I2S Playback Principle
I2S (Inter-IC Sound) is a serial digital communication bus dedicated to audio, specifically designed for transmitting digital audio data between chips.
MCLK: Master clock (system audio clock, commonly 256x sample rate)
BCLK (SCK): Bit clock, transfers 1 bit per transition
LRCK (WS): Channel clock. Low level = left channel; High level = right channel
SDIN/SDOUT: Audio data serial line
Working logic:
Based on the sample rate (e.g., 44.1K, 48KHz), WS switches channels the corresponding number of times per second;
Within each WS cycle, BCLK shifts out 16/24/32-bit audio sample data bit by bit;
The transmitter sends data serially according to the clock, the receiver samples and parses synchronously, separates left and right channels, and restores digital audio;
Only pure audio data streams are transmitted; commands and configuration use separate I2C/SPI control.
3 API Function Overview
Function |
Description |
|---|---|
|
Audio initialization interface |
|
Audio deinitialization interface |
|
Set software volume |
|
Get software volume |
|
Set Codec hardware volume |
|
Get Codec hardware volume |
|
Set microphone volume |
|
Set volume step mode |
|
Play PCM audio data |
|
Record audio |
|
Pause playback |
|
Resume playback |
|
Play audio file (PCM) |
|
Wait for playback to finish |
|
Stop playback |
|
Play MP3 file |
|
Play MP3 data from memory |
|
Play WAV file |
|
Play WAV data from memory |
|
Start MP3 streaming playback session |
|
Feed MP3 data to the streaming decoder |
|
Stop MP3 streaming playback |
4 Type Descriptions
4.1 Liot_AudErr_e
Enum definition:
typedef enum {
L_AUD_ERR_SUCCESS = 0,
L_AUD_ERR_EXECUTE,
L_AUD_ERR_INVALID_PARAM,
L_AUD_ERR_OPEN,
L_AUD_ERR_CONFIG,
L_AUD_ERR_PULL_SET,
L_AUD_ERR_CALLBACK,
L_AUD_ERR_LEVEL_TRIGGER,
L_AUD_ERR_NOMEM,
L_AUD_ERR_FILE,
} Liot_AudErr_e;
Enum description
Variable |
Description |
|---|---|
L_AUD_ERR_SUCCESS |
Operation successful |
L_AUD_ERR_EXECUTE |
General execution error |
L_AUD_ERR_INVALID_PARAM |
Invalid input parameter |
L_AUD_ERR_OPEN |
Failed to open |
L_AUD_ERR_CONFIG |
Configuration interface failed |
L_AUD_ERR_PULL_SET |
Pull-up setting failed |
L_AUD_ERR_NOMEM |
Out of memory |
L_AUD_ERR_FILE |
File operation failed |
4.2 Liot_AudDevice_e
Enum definition:
typedef enum {
L_AUD_DEV_NONE,
L_AUD_TM8211,
L_AUD_ES8311,
L_AUD_ES8374,
L_AUD_ES8375,
L_AUD_DEV_MAX,
} Liot_AudDevice_e;
Enum description
Variable |
Description |
|---|---|
L_AUD_DEV_NONE |
No audio device |
L_AUD_TM8211 |
TM8211 |
L_AUD_ES8311 |
ES8311 |
L_AUD_ES8374 |
ES8374 |
L_AUD_ES8375 |
ES8375 |
L_AUD_DEV_MAX |
Maximum audio device enum value |
4.3 Liot_AudSample_e
Sample rate.
Enum definition:
typedef enum
{
L_AUD_08K_SAMPLES,
L_AUD_16K_SAMPLES,
L_AUD_22K_SAMPLES,
L_AUD_24K_SAMPLES,
L_AUD_32K_SAMPLES,
L_AUD_44K_SAMPLES,
L_AUD_48K_SAMPLES,
L_AUD_96K_SAMPLES,
} Liot_AudSample_e;
Enum description
Variable |
Description |
|---|---|
L_AUD_08K_SAMPLES |
8KHz sample rate |
L_AUD_16K_SAMPLES |
16KHz sample rate |
L_AUD_22K_SAMPLES |
22.05KHz sample rate |
L_AUD_24K_SAMPLES |
24KHz sample rate |
L_AUD_32K_SAMPLES |
32KHz sample rate |
L_AUD_44K_SAMPLES |
44.1KHz sample rate |
L_AUD_48K_SAMPLES |
48KHz sample rate |
L_AUD_96K_SAMPLES |
96KHz sample rate |
4.4 Liot_AudFrameSize_e
Data frame format.
Enum definition:
typedef enum
{
L_AUD_FRAMESIZE_16_16 = 0,
L_AUD_FRAMESIZE_16_32 = 1,
L_AUD_FRAMESIZE_24_32 = 2,
L_AUD_FRAMESIZE_32_32 = 3,
} Liot_AudFrameSize_e;
Enum description
Variable |
Description |
|---|---|
L_AUD_FRAMESIZE_16_16 |
16_16 frame format, word size 16, 16bit per frame |
L_AUD_FRAMESIZE_16_32 |
16_32 frame format, slot size 32, 16bit per frame |
L_AUD_FRAMESIZE_24_32 |
24_32 frame format, slot size 32, 24bit per frame |
L_AUD_FRAMESIZE_32_32 |
32_32 frame format, slot size 32, 32bit per frame |
4.5 Liot_AudMode_e
Audio data format.
Enum definition:
typedef enum
{
L_AUD_MODE_MSB,
L_AUD_MODE_LSB,
L_AUD_MODE_I2S,
L_AUD_MODE_PCM,
} Liot_AudMode_e;
Enum description
Variable |
Description |
|---|---|
L_AUD_MODE_MSB |
Audio data left-aligned |
L_AUD_MODE_LSB |
Audio data right-aligned |
L_AUD_MODE_I2S |
I2S data stream format |
L_AUD_MODE_PCM |
PCM data stream format |
4.6 Liot_AudRole_e
Codec master/slave mode.
Enum definition:
typedef enum
{
L_AUD_ROLE_MASTER,
L_AUD_ROLE_SLAVE,
} Liot_AudRole_e;
Enum description
Variable |
Description |
|---|---|
L_AUD_ROLE_MASTER |
Codec operates as master |
L_AUD_ROLE_SLAVE |
Codec operates as slave |
4.7 Liot_AudChannel_e
Audio channel.
Enum definition:
typedef enum
{
L_AUD_DUAL = 1,
L_AUD_MONO_LEFT,
L_AUD_MONO_RIGHT,
} Liot_AudChannel_e;
Enum description
Variable |
Description |
|---|---|
L_AUD_DUAL |
Dual channel (stereo) audio |
L_AUD_MONO_LEFT |
Mono left channel |
L_AUD_MONO_RIGHT |
Mono right channel |
4.8 Liot_AudState_e
Audio state.
Enum definition:
typedef enum
{
L_AUD_STA_DEINIT,
L_AUD_STA_IDLE,
L_AUD_STA_PLAYING,
L_AUD_STA_PAUSE,
L_AUD_STA_RESUME,
L_AUD_STA_STOP,
} Liot_AudState_e;
Enum description
Variable |
Description |
|---|---|
L_AUD_STA_DEINIT |
Audio uninitialized state |
L_AUD_STA_IDLE |
Audio idle state |
L_AUD_STA_PLAYING |
Audio playing state |
L_AUD_STA_PAUSE |
Audio paused state |
L_AUD_STA_RESUME |
Audio resumed state |
L_AUD_STA_STOP |
Audio stopped state |
4.9 Liot_AudEvent_e
Audio playback event (used in callbacks).
Enum definition:
typedef enum {
L_AUD_EVT_ERROR = -1,
L_AUD_EVT_START = 0,
L_AUD_EVT_PAUSE = 1,
L_AUD_EVT_FINISH = 2,
L_AUD_EVT_CLOSE = 3,
L_AUD_EVT_RESUME = 4,
} Liot_AudEvent_e;
Enum description
Variable |
Description |
|---|---|
L_AUD_EVT_ERROR |
Playback error |
L_AUD_EVT_START |
Playback started |
L_AUD_EVT_PAUSE |
Playback paused |
L_AUD_EVT_FINISH |
Playback finished |
L_AUD_EVT_CLOSE |
Playback channel closed |
L_AUD_EVT_RESUME |
Playback resumed |
4.10 Liot_AudVolStep_e
Volume step mode.
Enum definition:
typedef enum {
L_AUD_VOL_STEP_0_1 = 0,
L_AUD_VOL_STEP_0_01,
} Liot_AudVolStep_e;
Enum description
Variable |
Description |
|---|---|
L_AUD_VOL_STEP_0_1 |
Volume step 0.1 |
L_AUD_VOL_STEP_0_01 |
Volume step 0.01 |
4.11 Liot_AudHwConfig_t
Hardware configuration structure.
Structure definition:
typedef struct
{
int8_t i2cNum;
int8_t i2sNum;
int8_t paGpioNum;
Liot_AudDevice_e codecType;
Liot_AudChannel_e channel;
Liot_AudRole_e role;
Liot_AudMode_e mode;
Liot_AudFrameSize_e frameSize;
Liot_AudSample_e samples;
Liot_AudCb_t callback;
void *cbContext;
} Liot_AudHwConfig_t;
Structure member description
Variable |
Description |
|---|---|
i2cNum |
I2C bus number used for audio communication |
i2sNum |
I2S bus number used for audio communication |
paGpioNum |
GPIO number of the PA control pin |
codecType |
Audio Codec type |
channel |
Audio channel |
role |
Codec role |
mode |
Data stream format |
frameSize |
Data frame format |
samples |
Sample rate |
callback |
Audio event callback (may be NULL) |
cbContext |
Callback user context |
5 API Function Details
5.1 Liot_AudioInit
Audio initialization.
Declaration
Liot_AudErr_e Liot_AudioInit(Liot_AudHwConfig_t *config);
Parameters
config: [In] Audio format configuration.
Return value
Error code, see Liot_AudErr_e.
5.2 Liot_AudioDeInit
Audio deinitialization.
Declaration
Liot_AudErr_e Liot_AudioDeInit(void);
Parameters
None.
Return value
Error code, see Liot_AudErr_e.
5.3 Liot_AudioSetVolume
Set software volume (0-100).
Declaration
Liot_AudErr_e Liot_AudioSetVolume(int Volume);
Parameters
Volume: [In] Volume value (0-100).
Return value
Error code, see Liot_AudErr_e.
5.4 Liot_AudioGetVolume
Get current software volume.
Declaration
Liot_AudErr_e Liot_AudioGetVolume(int *Volume);
Parameters
Volume: [Out] Volume value.
Return value
Error code, see Liot_AudErr_e.
5.5 Liot_AudioSetCodecVolume
Set Codec hardware volume register.
Declaration
Liot_AudErr_e Liot_AudioSetCodecVolume(int Volume);
Parameters
Volume: [In] Volume value (range depends on Codec).
Return value
Error code, see Liot_AudErr_e.
5.6 Liot_AudioGetCodecVolume
Get Codec hardware volume register value.
Declaration
Liot_AudErr_e Liot_AudioGetCodecVolume(int *Volume);
Parameters
Volume: [Out] Volume value.
Return value
Error code, see Liot_AudErr_e.
5.7 Liot_AudioSetMicVolume
Set microphone volume.
Declaration
Liot_AudErr_e Liot_AudioSetMicVolume(uint8_t micGain, int micVolume);
Parameters
micGain: [In] Microphone gain.
micVolume: [In] Microphone volume value.
Return value
Error code, see Liot_AudErr_e.
5.8 Liot_AudioSetVolMode
Set volume step mode.
Declaration
Liot_AudErr_e Liot_AudioSetVolMode(Liot_AudVolStep_e mode);
Parameters
mode: [In] Step mode, see
Liot_AudVolStep_e.
Return value
Error code, see Liot_AudErr_e.
5.9 Liot_AudioPlay
Play PCM audio data (asynchronous).
Declaration
Liot_AudErr_e Liot_AudioPlay(uint8_t* data, int datalen);
Parameters
data: [In] Audio data to play.
datalen: [In] Data length (bytes).
Return value
Error code, see Liot_AudErr_e.
5.10 Liot_AudioRecord
Record audio (blocking, until datalen bytes are recorded).
Declaration
Liot_AudErr_e Liot_AudioRecord(uint8_t* data, int datalen);
Parameters
data: [Out] Recording buffer.
datalen: [In] Buffer length (bytes).
Return value
Error code, see Liot_AudErr_e.
5.11 Liot_AudioPlayPause
Pause playback.
Declaration
Liot_AudErr_e Liot_AudioPlayPause(void);
Parameters
None.
Return value
Error code, see Liot_AudErr_e.
5.12 Liot_AudioPlayResume
Resume playback.
Declaration
Liot_AudErr_e Liot_AudioPlayResume(void);
Parameters
None.
Return value
Error code, see Liot_AudErr_e.
5.13 Liot_AudioPlayFile
Play audio file (raw PCM stream).
Declaration
Liot_AudErr_e Liot_AudioPlayFile(char* fileName);
Parameters
fileName: [In] File path.
Return value
Error code, see Liot_AudErr_e.
5.14 Liot_AudioWaitPlayFinish
Wait for all audio in the current queue to finish playing.
Declaration
Liot_AudErr_e Liot_AudioWaitPlayFinish(int timeout);
Parameters
timeout: [In] Timeout in seconds, or
LIOT_WAIT_FOREVER.
Return value
Error code, see Liot_AudErr_e.
5.15 Liot_AudioStop
Immediately stop playback and clear the queue.
Declaration
Liot_AudErr_e Liot_AudioStop(void);
Parameters
None.
Return value
Error code, see Liot_AudErr_e.
5.16 Liot_AudioPlayMp3File
Play MP3 file.
Declaration
Liot_AudErr_e Liot_AudioPlayMp3File(char* fileName);
Parameters
fileName: [In] File path.
Return value
Error code, see Liot_AudErr_e.
5.17 Liot_AudioPlayMp3
Play MP3 data from memory.
Declaration
Liot_AudErr_e Liot_AudioPlayMp3(uint8_t* data, int datalen);
Parameters
data: [In] MP3 data buffer.
datalen: [In] Data length (bytes).
Return value
Error code, see Liot_AudErr_e.
5.18 Liot_AudioPlayWavFile
Play WAV file.
Declaration
Liot_AudErr_e Liot_AudioPlayWavFile(char* fileName);
Parameters
fileName: [In] File path.
Return value
Error code, see Liot_AudErr_e.
5.19 Liot_AudioPlayWav
Play WAV data from memory (including WAV header).
Declaration
Liot_AudErr_e Liot_AudioPlayWav(uint8_t* data, int datalen);
Parameters
data: [In] WAV data buffer (including 44-byte header).
datalen: [In] Total data length (bytes).
Return value
Error code, see Liot_AudErr_e.
5.20 Liot_AudioMp3StreamStart
Start an MP3 streaming playback session, initializing the decoder only once.
Declaration
Liot_AudErr_e Liot_AudioMp3StreamStart(void);
Parameters
None.
Return value
Error code, see Liot_AudErr_e.
5.21 Liot_AudioMp3StreamPlay
Feed a chunk of MP3 data to the streaming decoder for decoding and playback.
Declaration
Liot_AudErr_e Liot_AudioMp3StreamPlay(uint8_t* data, int datalen);
Parameters
data: [In] MP3 data chunk.
datalen: [In] Data length (bytes).
Return value
Error code, see Liot_AudErr_e.
5.22 Liot_AudioMp3StreamStop
Stop MP3 streaming playback and release decoder resources.
Declaration
Liot_AudErr_e Liot_AudioMp3StreamStop(void);
Parameters
None.
Return value
Error code, see Liot_AudErr_e.
6 Code Example
Refer to the example code in LSDK\examples\demo\src\demo_audio.c.
#include "liot_type.h"
#include "liot_audio.h"
#include "liot_log.h"
#include "liot_os.h"
#include "liot_gpio2.h"
#define TEST_PLAY
//#define TEST_RECORD
#ifdef TEST_PLAY
__attribute__((aligned(16))) uint8_t audio16k_16[] = {
//audio source data
}
#endif
#ifdef TEST_RECORD
#define TEST_CACHE_LEN (1280)
__attribute__((aligned(16))) uint8_t audioRecord[TEST_CACHE_LEN] = {0};
#endif
void liot_audio_demo_thread(void *argv)
{
liot_rtos_task_sleep_ms(2000);
Liot_AonPowerCtl(TRUE);
Liot_SetVoltage(L_DOMAIN_ALL, L_VOLT_3_30V);
Liot_AudHwConfig_t cfg = {
.i2cNum = 1,
.i2sNum = 0,
.paGpioNum = 0,
.codecType = L_AUD_ES8311,
.channel = L_AUD_MONO_RIGHT,
.role = L_AUD_ROLE_SLAVE,
.mode = L_AUD_MODE_I2S,
.frameSize = L_AUD_FRAMESIZE_16_16,
.samples = L_AUD_16K_SAMPLES,
};
liot_trace("Liot_AudioInit");
Liot_AudioInit(&cfg);
liot_trace("Liot_AudioSetVolume");
Liot_AudioSetVolume(50);
Liot_AudioSetMicVolume(8, 200);
while(1)
{
#ifdef TEST_PLAY
liot_trace("Liot_AudioPlay ...");
Liot_AudioPlay(audio16k_16, sizeof(audio16k_16));
liot_rtos_task_sleep_ms(5000);
#endif
#ifdef TEST_RECORD
liot_trace("Liot_AudioRecord ...");
Liot_AudioRecord(audioRecord, TEST_CACHE_LEN);
Liot_AudioPlay(audioRecord, TEST_CACHE_LEN);
liot_rtos_task_sleep_ms(1);
#endif
}
Liot_AudioDeInit();
liot_rtos_task_delete(0);
}