跳转至

audio 核心库

作者:梁健

一、概述

Audio 核心库 是指合宙的 LuatOS 通过对 8311 或者 8211 编解码器进行配置以及传输,从而实现录音,播放音频,播放 TTS(文字转语音)功能,由于此 API 创建较早,历史包袱导致参数过多,使用非常不方便,建议使用 exaudio 扩展库。

重要概念解释:

1.1 硬件 DAC&ADC

也常常称为 codec(编码器) ,decoder(解码器) 音频的编解码芯片,合宙目前仅支持"es8311","es8211",其中 8311 支持 模拟音频转数据音频的输入,即为录音,也支持数据音频转为模拟音频的输出,即为播放。

1.2 采样率

决定 “声音会不会漏了高频细节”(比如没抓住小鸟叫),采样率越高,细节越丰富,但是占用的空间也越大

1.3 位深

  • 决定 “声音的音量变化会不会生硬”(比如能不能分清小声说话和轻声咳嗽),使用 bit 表示,表示单次采样,模拟量使用数据量保存的位数,位数越高质量越高,占用空间越大

1.4 流式播放

一边传输音频数据,一边进行播放,适合一些对实时性要求较高的场景,或者需要对音频进行编码的场景,详情请见: codec 核心库

1.5 流式录音

一边录音,一边上传数据,适合对录音实时性要求较高或者需要对音频进行编码的场景,详情请见 codec 核心库。

1.6 8311 和 8211 的区别

8311 支持音频的编码和解码,即支持录音和播放,如果需要打电话,则需要使用 8311

8211 仅支持音频的解码,即支持播放

8311 相对于 8211 需要一路 I2C 作为信令的收发,因此电路上 8211 要更为简单

[!TIP] 780EHV 模块内部集成了 ES8311 , 方便客户使用音频相关功能,并使用 GPIO20 控制 8311 的使能,Air8000 以及 Air780 系列其他型号内部不含 ES8311,需要外挂,相关硬件设计请见,合宙音频配件板

1.7 audio,exaudio,codec 三个库文件的区别和联系

  1. audio,codec,是核心库,可以调用的最底层的代码,exaudio 是扩展库
  2. audio 库和 exaudio 库都是实现了录音和播放,但是 exaudio 使用更加简单,去掉了历史原因造成的 audio 的荣冗余参数
  3. codec 库 是实现了音频数据的编码和解码,不会对音频直接播放,audio 和 exaudio 可以对编解码后的音频进行播放

二、核心示例

1、核心示例是指:使用本库文件提供的核心 API,开发的基础业务逻辑的演示代码;

2、核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;

3、更加完整和详细的 demo,请参考 LuatOS 仓库 中各个产品目录下的相关示例:

-- 音频回调处理
local function audio_callback(id, event, point)
    if event == audio.MORE_DATA then
        log.info("流式播放,需要通过audio.write,写入要播放的数据",audio.write("xxxx"))
    elseif event == audio.DONE then
        log.info("播放完成")       
    elseif event == audio.RECORD_DATA then
        log.info("流式录音数据过来了")   
    elseif event == audio.RECORD_DONE then
        log.info("录音完成")   
    end
end
-- 回调函数设置
audio.on(0,audio_callback)
-- 音频硬件特性控制,包括DAC,PA 的电平和时序控制
audio.config(0, pa_pin, pa_on_level, power_delay, pa_delay, power_pin)
--硬件输出通道参数设置
audio.setBus(0, audio.BUS_I2S,{chip = "es8311",i2cid = i2c_id , i2sid = i2s_id})      

-- 播放参数设置
audio.start(0, audio.PCM, 1, 16000, 16)
-- 音量设置
audio.vol(0, 50)
-- 设置audio 工作模式
audio.pm(0,audio.RESUME)

三、常量详解

核心库常量,顾名思义是由合宙 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;

四、函数详解

4.1 audio.start(id, audio_format, num_channels, sample_rate, bits_per_sample, is_signed)

功能

启动一个音频通道,仅用于流式播放。

参数

id

参数含义:音频通道;
数据类型:number
取值范围:仅支持0
是否必选:必须传入此参数;
注意事项:目前仅支持0,不可以传入其他的参数;
参数示例:0,音频通道0 

audio_format

参数含义:播放的音频格式;
数据类型:number
取值范围:audio.PCM
是否必选:必须传入此参数;
注意事项:仅支持audio.PCM
参数示例:audio.PCM 代表PCM 音频数据 

num_channels

参数含义:声音通道数;
数据类型:number
取值范围:1
是否必选:必须传入此参数;
注意事项:仅支持1个音频通道,此处必须填入1
参数示例:1 表示一个音频通道;

sample_rate

参数含义:采样频率;
数据类型:number
取值范围:8000,16000,24000,32000,48000,20050,44100
是否必选:必须传入此参数;
注意事项:参数的取值,需要和音频源文件一致;
参数示例:8000 代表每秒对音频源采样8000 

bits_per_sample

参数含义:采样位数,用多少个二进制位(0  1)来描述 “单个采样点的振幅大小”(即音量高低);
数据类型:number
取值范围:81624
是否必选:必须传入此参数;
注意事项:参数的取值,需要和音频源文件一致;
参数示例:16,表示每次采样的时候,使用16位数据来保存音频数据 

is_signed

参数含义:播放的音频源,是否有符号;
数据类型:boolean
取值范围:true(有符号),false(无符号)
是否必选:必须传入此参数;
注意事项:参数的取值,需要和音频源文件一致,一般来说都是有符号,即为true
参数示例:true,音频文件有符号 

返回值

成功 true, 失败 false

示例

local function audio_callback(id, event, point)  -- 音频回调处理
    if event == audio.MORE_DATA then
        audio.write(0,"xxxx")    --  当快要播完的时候,需要尽快写入数据
    end
end

audio.on(0, audio_callback)     -- 回调函数
audio.start(
        0, 
        audio.PCM, 
        1, 
        16000, 
        16, 
        true
    )

4.2 audio.record(id, record_type, record_time, amr_quailty, path, nil, buff0, buff1,channelCount)

功能

录音

参数

id

参数含义:音频通道;
数据类型:number;
取值范围:仅支持0;
是否必选:必须传入此参数;
注意事项:目前仅支持0,不可以传入其他的参数;
参数示例:0,音频通道0 ;

record_type

参数含义:录音音频格式;
数据类型:number
取值范围:audio.AMR,audio.AMR_NB,audio.AMR_WB,audio.PCM
是否必选:必须传入此参数;
注意事项:此接口可以实现流式录音,但是仅仅支持PCM 格式,audio.AMR和audio.AMR_NB同样作用
参数示例:audio.AMR_NB,录制的音频是audio.AMR_NB格式 

record_time

参数含义:录制时长;
数据类型:number(单位秒);
取值范围:大于或等于0;
是否必选:必须传入此参数;
注意事项:如果使用的是0,则表示一直录
参数示例:3,表示录制3秒的音频 ;

amr_quailty

参数含义:音频质量;
数据类型:number
取值范围:0 - 8
是否必选:必须传入此参数;
注意事项:
1. 音频质量是综合了采样率和位深,如果设置了音频质量,那么audio.start设置的采样率和位深,将会失效。
2. 此参数仅在record_type的值audio.AMR,audio.AMR_NB,audio.AMR_WB 有效,
3. 如果是AMR_NB,范围是0~7,建议值为7。如果是audio.AMR_WB,范围是0~8,值越大消耗的空间越多,音质越高,默认0
参数示例:7 表示 audio.AMR_NB 的音频质量为7 

path

参数含义:录音文件的存储位置;
数据类型:string/nil;
取值范围:string/nil;
是否必选:必须传入此参数;
注意事项:如果填入的是路径,则支持audio.AMR,audio.AMR_NB,audio.AMR_WB,PCM 三种格式,如果是nil 则表示流式录音,需要通过audio.on 的回调函数来获取录音的数据;
参数示例:"/ram/xxx.amr" 表示录制的音频存在/ram/xxx.amr 文件中;

reserved

参数含义:无意义参数;
数据类型:nil;
取值范围:nil;
是否必选:必须传入此参数;
注意事项:历史原因导致此参数无意义,此参数固定填写nil;
参数示例:nil,固定填写参数;

buff0

参数含义:流式录音存放的地址0;
数据类型:zbuff;
取值范围:zbuff对象的地址;
是否必选:path 为nil 的时候,必须传入此参数;
注意事项:zbuff0 设置的大小为16000,需要和buff1 同时填入,并保持buff 大小一样,录音会轮番向着两个buff 发送数据;
参数示例:zbuff0: 创建zbuff0返回的对象  ;

buff1

参数含义:流式录音存放的地址1;
数据类型:number;
取值范围:zbuff1 的地址;
是否必选:path 为nil 的时候,必须传入此参数;
注意事项:zbuff1 设置的大小为16000,需要和buff0 同时填入,并保持buff 大小一样,录音会轮番向着两个buff 发送数据;
参数示例:zbuff0: 创建zbuff0返回的地址  ;

返回值

成功 true, 失败 false

示例 1: 录制到文件

audio.record(
            0, 
            audio.AMR_NB, 
            5, 
            7, 
            "/ram/xxx.amr"
        )

示例 1: 流式录音

local function audio_callback(id, event, point) -- 音频回调处理
    if event == audio.RECORD_DATA then
        if type(audio_record_param.path) == "function" then
            local buff, len = point == 0 and pcm_buff0 or pcm_buff1,
                             point == 0 and pcm_buff0:used() or pcm_buff1:used()
            audio_record_param.path(buff, len)
           log.info("收到录音数据地址为:"buff,"长度为",len)
        end

    end
end

pcm_buff0 = zbuff.create(16000)
pcm_buff1 = zbuff.create(16000)
audio.record(
    0, 
    audio.PCM, 
    5, 
    amr_quailty, 
    nil,    -- 保存路径为nil 的时候,将会开启流式录音
    nil,
    pcm_buff0,
    pcm_buff1
)

4.3 audio.recordStop(id)

功能

停止录音

注意:audio 的回调函数返回 audio.RECORD_DONE 的 event 才是真正的结束

参数

id

参数含义:音频通道;
数据类型:number
取值范围:仅支持0
是否必选:必须传入此参数;
注意事项:目前仅支持0,不可以传入其他的参数;
参数示例:0,音频通道0 

返回值

成功 true, 失败 false

示例

audio.recordStop(id)

4.4 audio.write(id, data)

功能

向音频通道中写入音频数据,用于播放

参数

id

参数含义:音频通道;
数据类型:number
取值范围:仅支持0
是否必选:必须传入此参数;
注意事项:目前仅支持0,不可以传入其他的参数;
参数示例:0,音频通道0 

data

参数含义:播放的音频流数据;
数据类型:string
取值范围:音频数据流;
是否必选:必须传入此参数;
注意事项:需要配合audio.start 函数使用,仅仅支持流式播放,数据来源可以从文件或者网络获取;
参数示例:"xxxxx",音频数据流;

返回值

成功 true, 失败 false

示例

audio.write(0, "xxxxxx")

4.5 audio.pm(id,pm_mode)

功能

休眠控制(一般会自动调用不需要手动执行)

参数

id

参数含义:音频通道;
数据类型:number
取值范围:仅支持0
是否必选:必须传入此参数;
注意事项:目前仅支持0
参数示例:0,音频通道0 

pm_mode

参数含义:休眠模式;
数据类型:number
取值范围:audio.RESUMEaudio.STANDBYaudio.SHUTDOWNaudio.POWEROFF
是否必选:必须传入此参数;
注意事项:
> | 模式常量       | PA 状态 | Codec 状态                                                   | 适用场景                                                     | 优缺点                                                       |
> | -------------- | ------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
> | audio.RESUME   | 开启    | 全功能工作                                                   | 正在进行语音通话或播放音频时                                 |                                                              |
> | audio.STANDBY  | 断电    | 待机(静音)                                                 | 通话暂停(如等待对方回应)、需要快速恢复的场景。系统不能进低功耗状态,如果PA不可控codec进入静音模式 | 优点:切换到活动状态的恢复时间短,响应快,约1S 缺点:仍然消耗一定的电量,不适合低功耗场景 |
> | audio.SHUTDOWN | 断电    | 可配置的codec关机状态,不可配置的codec断电,系统能进低功耗状态 | 长时间不需要使用音频功能,但希望保留快速恢复的能力。(如监听来电) | 优点:功耗低于 audio.STANDBY 模式,恢复时间约5S比 audio.POWEROFF 短。 缺点:仍然消耗少量电量。 |
> | audio.POWEROFF | 断电    | 完全断电                                                     | 长时间不需要音频功能(如纯数据传输场景),系统能进低功耗状态 | 优点:功耗低,适合极致低功耗场景 缺点:重新激活时需要较长的初始化时间,约10S |
参数示例:audio.RESUME 工作模式;

返回值

成功 true, 失败 false

例子

local result = audio.pm(0,audio.RESUME) --工作模式

4.6 audio.on(id,callback)

功能

音频数据回调函数注册

参数

id

参数含义:音频通道;
数据类型:number
取值范围:仅支持0
是否必选:必须传入此参数;
注意事项:目前仅支持0,不可以传入其他的参数;
参数示例:0,音频通道0 

callback

参数含义:音频事件的回调函数;
数据类型:function
取值范围:无;
是否必选:必须传入此参数;
注意事项:此函数必须使用,用于接收音频事件,包括;
参数示例:
{
 --id
-- 参数含义:I2S的通道号;
-- 数据类型:number;
-- 取值范围:0;
-- 是否必选:必须传入此参数;
-- 注意事项:仅支持0;
-- 参数示例:0,通道0 ;

 --event
 --参数含义:标识当前的发送或者接受数据情况;
 --数据类型:boolean;
 --取值范围:true 或者 false;
 --是否必选:是;
 --注意事项:
 -- 1. 当buff 为 true 的时候,表示收到数据,收到的数据存放在i2s.recv 的buffer 里面
 -- 2. 当buff 为 false 的时候,表示发送数据完毕
 --参数示例:true 表示收到数据;

  --point
 --参数含义:标识当前的发送或者接受数据情况;
 --数据类型:boolean;
 --取值范围:true 或者 false;
 --是否必选:是;
 --注意事项:
 -- 1. 当buff 为 true 的时候,表示收到数据,收到的数据存放在i2s.recv 的buffer 里面
 -- 2. 当buff 为 false 的时候,表示发送数据完毕
 --参数示例:true 表示收到数据;
}

返回值

示例

local function audio_callback(id, event, point)
    if event == audio.MORE_DATA then
        log.info("流式播放,需要通过audio.write,写入要播放的数据",audio.write("xxxx"))
    elseif event == audio.DONE then
        log.info("播放完成")       
    elseif event == audio.RECORD_DATA then
        log.info("收到录音数据地址为:",buff,"长度为",len) -- 使用方法见audio.record 函数
    elseif event == audio.RECORD_DONE then
        log.info("录音完成")   
    end
end
-- 回调函数设置
audio.on(0,audio_callback)

4.7 audio.play(id, path, errStop)

功能

播放或者停止播放一个文件

参数

id

参数含义:音频通道;
数据类型:number
取值范围:仅支持0
是否必选:必须传入此参数;
注意事项:目前仅支持0,不可以传入其他的参数;
参数示例:0,音频通道0 

path

参数含义:文件名,如果为空,则表示停止播放,如果是table,则表示连续播放多个文件;
数据类型:string/table/nil
取值范围:无;
是否必选:必须传入此参数;
注意事项:
        1. 支持MP3,AMR,WAV格式
        2. 如果是string 表示播放音频文件,
        3. 如果是table 表示连续播放多个音频文件,适合云喇叭等应用,相较于单个播放,中间不会产生停顿的感觉
        4. 如果是nil,则表示停止播放
        5. 只有停止之后,才可以开始新的播放,停止的结束事件为audio.on 返回audio.DONE事件
参数示例:
        1. "/luadb/hello.mp3",播放/luadb/hello.mp3 路径下的mp3 文件;
        2. {"/luadb/hello.mp3""/ram/yes.amr","/ram/yes.wav"} ,表示依次播放列表类的文件
        3. nil,表示停止正在播放的音频

errStop

参数含义:是否在文件解码失败后停止播放;
数据类型:boolean
取值范围:true,false
是否必选:必须写入;
注意事项:
1. path为table 的时候(即连续播放),此参数才有价值;
2. 当为true时候遇到解码错误自动停止
3. 默认为true
参数示例:true,播放列表内播放遇解码错误,立即停止播放;

返回值

成功 true, 失败 false

示例

audio.play(0, "/luadb/hello.mp3")        --开始播放某个文件
audio.play(0, {"/luadb/hello.mp3""/ram/yes.amr","/ram/yes.wav"})        --连续播放多个文件
audio.play(0)                --停止播放某个文件

4.8 audio.tts(id, data)

功能

TTS(文字转语音)播放或者停止

参数

id

参数含义:音频通道;
数据类型:number
取值范围:仅支持0
是否必选:必须传入此参数;
注意事项:目前仅支持0
参数示例:0,音频通道0 

data

参数含义:TTS 的播放内容;
数据类型:string/nil
取值范围:字符串或者空值;
是否必选:非必须传输此值;
注意事项:1. 当传入的是string 则表示要播放TTS,格式请参考https://docs.openluat.com/air780epm/common/tts/
         2,当传入的是nil ,则表示停止当前播放的TTS
         3. 只有停止之后,才可以开始新的播放,停止的结束事件为audio.on 返回audio.DONE事件
参数示例:audio.tts(0, “支付宝到账,一千元整”)

返回值

例子

4.9 audio.isEnd(id)

功能

检查当前文件是否已经播放结束

参数

id

参数含义:音频通道;
数据类型:number
取值范围:仅支持0
是否必选:必须传入此参数;
注意事项:目前仅支持0
参数示例:0,音频通道0 

返回值

成功 true, 失败 false

例子

audio.isEnd(0)

4.10 audio.getError(id)

功能

获取最近一次播放结果

参数

id

参数含义:音频通道;
数据类型:number
取值范围:仅支持0
是否必选:必须传入此参数;
注意事项:目前仅支持0
参数示例:0,音频通道0 

返回值

result

参数含义:播放结果;
数据类型:boolean
取值范围:true,false
是否必选:必须接收此参数;
参数示例:true 播放成功;

user_stop

参数含义:是否是用户停止;
数据类型:boolean
取值范围:true,false
是否必选:必须接收此参数;
参数示例:true 用户停止 

file_no

参数含义:第几个文件失败了,从1开始;
数据类型:number
取值范围:> 0 
是否必选:必须接收此参数;
注意事项:只有audio.play  path 参数是表(表示播放多个文件)才有效;
参数示例:4 第四个文件播放失败;

例子

local result, user_stop, file_no = audio.getError(0)

4.11 audio.config(id, paPin, onLevel, dacDelay, paDelay, dacPin, dacLevel, dacTimeDelay)

功能

配置一个音频通道的特性

参数

id

参数含义:音频通道;
数据类型:number
取值范围:仅支持0
是否必选:必须传入此参数;
注意事项:目前仅支持0
参数示例:0,音频通道0 

paPin

参数含义:PA(音频放大器)控制IO
数据类型:number
取值范围:具体硬件环境支持的GPIO
是否必选:非必须传入此参数;
注意事项:
        1.配合**dacPin,onLeveldacDelaypaDelay,dacTimeDelay**音频参数,可以有效的降低pop 音;
        2.如果不传入则不对pa进行任何控制
参数示例:0GPIO0 控制PA 的打开或者关闭 

onLevel

参数含义:PA(音频放大器)打开时的电平;
数据类型:number
取值范围:0(低电平时候,打开PA),1(高电平的时候,打开PA)
是否必选:非必须传入此参数;
注意事项:
        1. 需要根据具体硬件设计来选择0或者1
        2. 默认是1,高电平打开PA
参数示例:0,低电平打开PA 

dacDelay

参数含义:在DAC(es8311,或者es8211,780EPV 内置8311)启动前插入的冗余时间,单位100ms
数据类型:number
取值范围:>0
是否必选:非必须传入此参数;
注意事项:
        1. 需要根据具体环境调节数值,以消除POP 音,默认值为5(即为500ms)
        2. 调试pop 音的时候,需要判断是播放器有声音还是播放后有声音,
        2.1 播放前有声音先将**dacDelay,paDelay**_设置为1010,测试是否有pop 音,然后逐步减少,达到最佳播放效率_
        2.2 如果是播放后有声音,则将**dacTimeDelay **_设置为100,测试是否有pop 音,然后逐步减少,达到最佳播放效率_
参数示例:1,启动dac 之前先插入100ms 的等待时间 

paDelay

参数含义:在DAC(es8311,或者es8211,780EPV 内置8311)启动后,延迟多长时间打开PA(音频放大器),单位1ms
数据类型:number
取值范围:>0
是否必选:非必须传入此参数;
注意事项:
        1. 需要根据具体环境调节数值,以消除POP 音,默认是5ms
        2. 调试pop 音的时候,需要判断是播放器有声音还是播放后有声音,
        2.1 播放前有声音先将**dacDelay,paDelay**_设置为1010,测试是否有pop 音,然后逐步减少,达到最佳播放效率_
        2.2 如果是播放后有声音,则将**dacTimeDelay **_设置为100,测试是否有pop 音,然后逐步减少,达到最佳播放效率_
参数示例:10,启动dac后,等待10ms 再打开pa 

dacPin

参数含义:外部dac电源控制IO
数据类型:number
取值范围:具体硬件环境支持的GPIO
是否必选:非必须传入此参数;
注意事项:
        1. 配合**paPin,onLeveldacDelaypaDelay,dacTimeDelay**音频参数,可以有效的降低pop 音放;
        2. 如果没有填入此值,则不会对外部dac 进行任何供电动作
参数示例:0GPIO0 控制PA 的打开或者关闭 

dacLevel

参数含义:DAC(音频编解码,比如es8311,es8211)打开时的电平;
数据类型:number
取值范围:0(低电平时候,打开DAC),1(高电平的时候,打开DAC)
是否必选:非必须传入此参数;
注意事项:需要根据具体硬件设计来选择0或者1,默认为1(即为高电平打开dac电源)
参数示例:0,低电平打开DAC

dacTimeDelay

参数含义:音频播放完毕时,PA与DAC关闭的时间间隔,单位1ms,默认0ms
数据类型:number
取值范围:大于0
是否必选:非必须传入此参数;
注意事项:
        1. 需要根据具体环境调节数值,以消除POP ,默认为0(即为0ms) 
        2. 调试pop 音的时候,需要判断是播放器有声音还是播放后有声音,
        2.1 播放前有声音先将**dacDelay,paDelay**_设置为1010,测试是否有pop 音,然后逐步减少,达到最佳播放效率_
        2.2 如果是播放后有声音,则将**dacTimeDelay **_设置为100,测试是否有pop 音,然后逐步减少,达到最佳播放效率_
参数示例:10,音频播放完毕后,PA与DAC关闭的时间间隔为10ms 

返回值

例子

audio.config(0, 25, 1, 6, 200)    --PA控制脚是GPIO25,高电平打开

4.12 audio.vol(id, value)

功能

设置播放的音量

参数

id

参数含义:音频通道;
数据类型:number
取值范围:仅支持0
是否必选:必须传入此参数;
注意事项:目前仅支持0
参数示例:0,音频通道0 

value

参数含义:音量,百分比,1%~1000%,默认值100%,就是不调节;
数据类型:number
取值范围:1~100
是否必选:必须传入此参数;
注意事项:需要根据实际的硬件配置,如果设置过大可能造成声音过曝,或者电流供应不上的问题;
参数示例:8080% 的音量 

返回值

result

参数含义:音量,百分比;
数据类型:number
取值范围:1~100
是否必选:必须接收此参数;
参数示例:8080% 的音量 

例子

local result = audio.vol(0, 90)    --通道0的音量调节到90%,result存放了调节后的音量水平,有可能仍然是100

4.13 audio.micVol(id, value)

功能

设置 mic 的音量

参数

id

参数含义:音频通道;
数据类型:number
取值范围:仅支持0
是否必选:必须传入此参数;
注意事项:目前仅支持0
参数示例:0,音频通道0 

value

参数含义:录制音量,百分比,1%~1000%,默认值100%,就是不调节;
数据类型:number
取值范围:1~100
是否必选:必须传入此参数;
注意事项:需要更具实际情况调节;
参数示例:8080% 的音量 

返回值

result

参数含义:录制音量,百分比;
数据类型:number
取值范围:1~100
是否必选:必须接收此参数;
参数示例:8080% 的录制音量 

例子

local result = audio.micVol(0, 90)    --录音音量调节到90%,result存放了调节后的音量水平,有可能仍然是100

4.14 audio.setBus(id, bus_type)

功能

配置音频 DAC(编解码器)

参数

id

参数含义:音频通道;
数据类型:number
取值范围:仅支持0
是否必选:必须传入此参数;
注意事项:目前仅支持0
参数示例:0,音频通道0 

bus_type

参数含义:总线类型;
数据类型:number
取值范围:audio.BUS_I2S
是否必选:必须传入此参数;
注意事项:仅支持audio.BUS_I2S
参数示例:audio.BUS_I2SI2S 方式驱动音频DAC(编解码器) 

config_table

参数含义:DAC配置参数
数据类型:table
取值范围:{
         -- 参数含义:dac 芯片名称;
         -- 数据类型:string;
         -- 取值范围:仅支持“es8311”,“es8211”;
         -- 是否必选:必选传入此参数;
         -- 注意事项:暂无;
         -- 参数示例:"es8311",表示使用的DAC是8311;
        chip=, 
         -- 参数含义:使用的i2c id 的编号;
         -- 数据类型:number;
         -- 取值范围:0,1;
         -- 是否必选:必选传入此参数;
         -- 注意事项:暂无;
         -- 参数示例:0,使用I2C0 进行通信;
        i2cid,  
         -- 参数含义:使用的I2S id 编号;
         -- 数据类型:number;
         -- 取值范围:0;
         -- 是否必选:必选传入此参数
         -- 注意事项:暂无;
         -- 参数示例:0,使用I2S 0 通道进行通信;
        i2sid=0, 
}
是否必选:必须传入此参数;
注意事项:根据实际情况写入i2cid值
参数示例:audio.BUS_I2SI2S 方式驱动音频DAC(编解码器) 

返回值

例子

audio.setBus(0, audio.BUS_I2S,{chip="es8311",i2cid=0,i2sid=0})    --通道0的硬件输出通道设置为I2S

4.15 audio.debug(on_off)

功能

配置调试信息输出

参数

on_off

参数含义:打开或者关闭音频调试输出;
数据类型:boolean
取值范围:true(打开调试信息输出) 或者 false(关闭调试信息输出)
是否必选:必须传入此参数;
注意事项:无;
参数示例:true,打开调试信息输出;

返回值

例子

audio.debug(true)     --  打开调试信息输出

五、产品支持说明

支持 LuatOS 开发的 Air780xx,Air8000xx 产品都支持 audio 库。不同产品支持的硬件 I2C 接口数量和 GPIO 引脚可能有所不同,请参考具体产品的硬件手册。