开发版 YDH MT7628,SDK源自 YDH提供的SDK
CentOS下调好的声音采样程序, 上开发板子就崩溃
使用系统自带的alsa util工具命令边采边录:
arecord -r24000 -c2 -fS16_LE | aplay -r24000 -c2 -fS16_LE
一切正常,说明问题在编写的程序本身
查看alsa库中arecord/aplay源码pcm_write(audiobuf, chunk_size),发现每次写入的数据量chunk_size和我们写的一样,比我们大, 难道是缓冲区问题?
把自己程序代码中的缓冲区随便设置了个很大值1M, 采样程序就不崩溃了, 说明确实缓冲区长度有问题。
虽然采样程序不崩溃了,但采样的声音使用aplay播放不正常, 说明采样到的数据有问题。
经反复实验, 得到如下结论:
1) 无论你怎样设置采样缓冲区的缓冲区总时间和周期时间, 在板子上都好像不起作用, 但在CentOS下有用
我猜想openwrt的驱动中, 进行DMA传输的数据区长度根本就是固定的, 不像CentOS下是可以调节的
经过测试: openwrt下无路设置何种采样率和缓冲时间参数, 每次读到的数据长度都是1536,是固定的
2) 如果你的缓冲区帧数量小于1536, 那么你的采样程序基本会挂掉
说明openwrt中,pcm_write(audiobuf, chunk_size) 函数中的第二个参数对帧缓冲区长度的限制根本每起到作用
但在CentOS下, 是起到作用的
后面在做播放程序时, 也是类似的问题,在pcm_writei()调用时, 每次固定写入1536帧的数据
我做了个缓存, 只有当缓存中待播放数据帧>=1536时, 才进行pcm_writei调用,否则制作数据缓存, 不进行实质上的pcm_writei调用。