UnderRun和OverRun

本文探讨了音频播放及录音场景中常见的Underrun与OverRun问题。详细解析了这两种现象的原因及其处理机制,包括pcm播放时AudioTrack与AudioFlinger间的交互,以及录音时上层应用与alsa buffer之间的数据流动。

UnderRun

pcm播放的场景,alsa中snd_pcm_write()返回–EPIPE,表示alsa取不到足够的数据;

AudioTrack 写入数据的速度跟不上 AudioFlinger 读取数据的速度,使得 AudioFlinger 不能及时获取到预期的数据量,反映到现实的后果就是声音断续;这种情况的根本原因大多是应用程序不能及时写入数据或者缓冲区分配过小,AudioTrack 本身并没有错;AudioFlinger 针对这点做了容错处理:当发现 underrun 时,先陷入短时间的睡眠,不急着读取数据,让应用程序准备更多的数据。

当检测到当前写入音频数据的时间与上次出现警告的时间间隔大于预定的最大时间间隔(5秒)后,系统将判定音频播放过程出现了 underrun。然后系统会调用 usleep() 函数对当前 PlaybackThread 进行短时间阻塞,这样上层 APP 就能为 PlaybackThread 准备好更多音频数据。这个 usleep() 的时长是根据相邻 2 次写入音频数据的时间间隔实时计算出的。

OverRun

record录音的场景,alsa中snd_pcm_read()返回–EPIPE,表示alsa的buffer满了;上层app取数据取得太慢。

ALSA 的驱动也有一块专门用来存储录音数据的 buffer,上层从该 buffer 搬运数据再存储起来就能得到我们需要的录音文件。一旦驱动的 buffer 满了,就会出现 EPIPE 的错误,因为上层读录音 buffer 数据的速度慢了。

<think> 嗯,用户这次询问的是具备全双工通信、半双工通信、主从操作、8位可编程线性预分频器以及支持多种I2S协议的设备或技术。这个问题非常具体,看起来用户可能在开发音频系统或通信设备。 从引用内容来看,之前的讨论集中在电源模块、支持向量机种群协议模拟软件,与当前问题关联不大。用户需要的是通信接口技术相关的信息,特别是I2S协议相关的控制器或芯片。 用户提到的特性组合相当专业:全双工/半双工通信模式选择、主从操作切换、8位线性预分频器、多I2S协议支持。这些特征指向的是音频数字信号处理领域,常见于微控制器的通信外设或专用音频接口芯片。 我注意到用户特别强调"线性预分频器"这个少见参数,说明用户很可能在设计时钟系统,需要灵活调整采样率。而支持多种I2S协议意味着需要兼容不同厂商的设备标准。 最符合这些要求的应该是现代微控制器上的I2S控制器模块,比如STM32系列里的SAI(Serial Audio Interface),或者NXP的eFlexPWM模块。专用芯片方面,Cirrus LogicTI的音频编解码器也可能满足部分需求。 用户没有说明应用场景,但这类技术常见于专业音频设备、车载娱乐系统或物联网音频终端。考虑到主从模式切换的需求,用户可能在设计可灵活组网的分布式音频系统。 回答时需要解释清楚:1)核心芯片类型 2)关键特性实现原理 3)典型应用场景 4)可选器件举例。特别要说明8位预分频器如何实现采样率调整,以及如何通过寄存器配置切换通信模式。 最好补充询问用户的具体应用方向,因为专业音频处理消费级应用对芯片性能要求差异很大。另外用户提到的"多种I2S协议"需要明确是否包含TDM、PCM等扩展格式。 </think> 基于您描述的特性组合,满足**全双工/半双工通信、主从操作、8位可编程线性预分频器、支持多种I2S协议**的设备或技术,最典型的是**现代微控制器(MCU)或专用音频接口芯片中的高级串行音频接口模块**,尤其是 **I²S(Inter-IC Sound)控制器** 或其增强版本(如STM32的SAI)。以下是详细解析: --- ### **核心技术与特性实现** 1. **全双工与半双工通信** - **全双工**:同时收发数据(如左/右声道独立传输)。 - **半双工**:分时复用同一数据线(如单线传输模式)。 *实现方式*:通过独立的发送/接收数据线(如`SD`/`SDIN`/`SDOUT`)时钟控制逻辑切换模式[^1]。 2. **主从操作模式** - **主模式**:控制器生成时钟信号(`SCK`、`WS`)驱动外部设备。 - **从模式**:接收外部时钟信号同步数据传输。 *关键价值*:适应不同系统架构(如多设备级联时主控切换)[^1]。 3. **8位可编程线性预分频器** - 用于**灵活配置采样率**:通过分频系数调整主时钟(`MCK`)或位时钟(`SCK`)。 - *公式示例*:若输入时钟为 `PCLK`,则输出频率为: $$f_{SCK} = \frac{PCLK}{(预分频系数 + 1)}$$ 8位分频器支持分频系数范围 **0~255**,实现精细的频率控制[^1]。 4. **支持多种I2S协议** 常见兼容协议包括: - 标准I²S(飞利浦格式):左对齐数据,WS下降沿开始左声道。 - 左对齐/右对齐:数据紧邻WS边沿。 - TDM(时分复用):单总线传输多声道(如8通道)。 - PCM(脉冲编码调制):短帧同步脉冲模式。 *配置方式*:通过寄存器选择帧格式、数据长度(16/24/32位)等[^1][^4]。 --- ### **典型应用设备/技术** 1. **微控制器内置音频接口** - **STM32 SAI (Serial Audio Interface)**: - 全双工独立收发器,支持主/从模式。 - 可编程预分频器(8位及以上),精确生成 `MCK/SCK`。 - 兼容I²S、PCM、TDM等协议,最高支持192kHz采样率[^1]。 - **NXP i.MX RT系列eFlexPWM**: - 结合SAI模块实现多协议音频传输。 2. **专用音频编解码器芯片** - **Cirrus Logic CS42Lxx系列**: - 支持全/半双工,主从模式切换。 - 可编程时钟分频器,灵活适配采样率。 - 兼容I²S、左/右对齐格式[^1]。 - **TI PCM3060/PCM3168**: - 多协议接口(I²S、TDM),8通道TDM支持。 --- ### **技术优势与应用场景** | **特性** | **技术价值** | **典型应用场景** | |------------------------|---------------------------------------|-------------------------------| | **全双工/半双工** | 节省引脚资源,适应简单/复杂系统 | 耳机麦克风一体设备、双向对讲机 | | **主从模式** | 多设备协同(如麦克风阵列→处理器) | 智能音响、车载音频系统 | | **8位预分频器** | 精确匹配不同采样率(8kHz~192kHz) | 高保真音频录制、语音识别 | | **多协议I2S支持** | 兼容各厂商设备,简化设计 | 混音器、专业录音设备 | --- ### **开发要点** - **配置流程**: 1. 初始化时钟(设置预分频系数)。 2. 选择主/从模式及通信协议。 3. 使能全/半双工,配置DMA传输。 - **示例代码片段(STM32 HAL库)**: ```c SAI_HandleTypeDef hsai; hsai.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_48K; // 48kHz采样率 hsai.Init.OutputDrive = SAI_OUTPUTDRIVE_ENABLE; // 主模式驱动时钟 hsai.Init.NoDivider = SAI_MASTERDIVIDER_ENABLE; // 启用分频器 hsai.Init.MasterDivider = 23; // 8位分频系数=23 hsai.Init.Protocol = SAI_FREE_PROTOCOL; // 支持多协议 HAL_SAI_Init(&hsai); ``` --- ### **
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaolin2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值