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 三个库文件的区别和联系
- audio,codec,是核心库,可以调用的最底层的代码,exaudio 是扩展库
- audio 库和 exaudio 库都是实现了录音和播放,但是 exaudio 使用更加简单,去掉了历史原因造成的 audio 的荣冗余参数
- 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;
取值范围:8,16,24;
是否必选:必须传入此参数;
注意事项:参数的取值,需要和音频源文件一致;
参数示例: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.RESUME,audio.STANDBY,audio.SHUTDOWN,audio.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,onLevel,dacDelay,paDelay,dacTimeDelay**音频参数,可以有效的降低pop 音;
2.如果不传入则不对pa进行任何控制
参数示例:0,GPIO0 控制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**_设置为10,10,测试是否有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**_设置为10,10,测试是否有pop 音,然后逐步减少,达到最佳播放效率_
2.2 如果是播放后有声音,则将**dacTimeDelay **_设置为100,测试是否有pop 音,然后逐步减少,达到最佳播放效率_
参数示例:10,启动dac后,等待10ms 再打开pa ;
dacPin
参数含义:外部dac电源控制IO;
数据类型:number;
取值范围:具体硬件环境支持的GPIO;
是否必选:非必须传入此参数;
注意事项:
1. 配合**paPin,onLevel,dacDelay,paDelay,dacTimeDelay**音频参数,可以有效的降低pop 音放;
2. 如果没有填入此值,则不会对外部dac 进行任何供电动作
参数示例:0,GPIO0 控制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**_设置为10,10,测试是否有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;
是否必选:必须传入此参数;
注意事项:需要根据实际的硬件配置,如果设置过大可能造成声音过曝,或者电流供应不上的问题;
参数示例:80,80% 的音量 ;
返回值
result
参数含义:音量,百分比;
数据类型:number;
取值范围:1~100;
是否必选:必须接收此参数;
参数示例:80,80% 的音量 ;
例子
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;
是否必选:必须传入此参数;
注意事项:需要更具实际情况调节;
参数示例:80,80% 的音量 ;
返回值
result
参数含义:录制音量,百分比;
数据类型:number;
取值范围:1~100;
是否必选:必须接收此参数;
参数示例:80,80% 的录制音量 ;
例子
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_I2S,I2S 方式驱动音频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_I2S,I2S 方式驱动音频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 引脚可能有所不同,请参考具体产品的硬件手册。