alsa buffer原理_ALSA driver--HW Buffer

本文详细介绍了ALSA驱动中的硬件缓冲区(HW Buffer)原理,特别是其采用的环形缓冲区(Ring Buffer)实现。硬件缓冲区是由多个DMA缓冲区组成,以避免读写指针频繁交换。在数据传输过程中,ALSA核心将应用程序的数据拷贝到HW Buffer,驱动程序再从HW Buffer中读取数据传递给硬件。文中还探讨了读写指针的更新策略,包括如何处理硬件中断和避免XRUN情况。通过对hw_ptr_base、hw_ptr、appl_ptr等关键变量的管理,确保了数据流的顺畅进行。
摘要由CSDN通过智能技术生成

当app在调用snd_pcm_writei时,alsa core将app传来的数据搬到HW buffer(即DMA buffer)中,alsa driver从HW buffer中读取数据传输到硬件播放。

ALSA buffer是采用ring buffer来实现的。ring buffer有多个HW buffer组成。

HW buffer一般是在alsa driver的hw_params函数中分配的一块大小为buffer size的DMA buffer.

之所以采用多个HW buffer来组成ring buffer,是防止读写指针的前后位置频繁的互换(即写指针到达HW buffer边界时,就要回到HW buffer起始点)。

ring buffer = n * HW buffer.通常这个n比较大,在数据读写的过程中,很少会出现读写指针互换的情况。

下图是ALSA buffer的实现以及读写指针更新的方法,

hw_ptr_base是当前HW buffer在Ring buffer中的起始位置。当读指针到达HW buffer尾部时,hw_ptr_base按buffer size移动.

hw_ptr即HW buffer的读指针。alsa driver将数据从HW buffer中读走并送到声卡硬件时,hw_ptr就会移动到新位置。

appl_ptr即HW buffer的写指针。app在调用snd_pcm_write写数据,alsa core将数据copy到HW buffer后,appl_ptr就更新。

boundary即Ring buffer边界。

hw_ofs是读指针在当前HW buffer中的位置。由alsa driver的pointer()返回。

appl_ofs是写指针在当前HW buffer中的位置。

hw_ptr的更新是通过调用snd_pcm_update_hw_ptr0完成。此函数在app写数据时会调用,也会在硬件中断时通过snd_pcm_peroid_elapsed调用。

static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream,

unsigned int in_interrupt)

{

struct snd_pcm_runtime *runtime = substream->runtime;

snd_pcm_uframes_t pos;

snd_pcm_uframes_t old_hw_ptr, new_hw_ptr, hw_base;

snd_pcm_sframes_t hdelta, delta;

unsigned long jdelta;

unsigned long curr_jiffies;

struct timespec curr_tstamp;

struct timespec audio_tstamp;

int crossed_boundary = 0;

old_hw_ptr = runtime->status->hw_ptr;//保存上一次的hw_ptr,在此函数中将更新hw_ptr

/*

* group pointer, time and jiffies reads to allow for more

* accurate correlations/corrections.

* The values are stored at the end of this routine after

* corrections for hw_ptr position

*/

pos = substream->ops->pointer(substream);//获取hw_ptr在当前HW buffer中的偏移

curr_jiffies = jiffies;

if (runtime->tstamp_mode == SND

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值