新闻资讯
Group news
青岛广盛源肥业有限公司    您的位置: 首页  >  新闻资讯  >  正文

Linux音频OSS的buffer分析

2019年10月09日 文章来源:网络整理 热度:114℃ 作者:刘英

1.      JZ                                            君正4760b mips

2.      Audio buff                            就是整个list_head+ list_node *4 + 整个音频

3.      APP                                         应用程序

整体使用框图

Linux音频OSS的buffer分析

Buff分配流程

首先在probe JZ mixer设备的时候进行初始化DMA及缓冲buff.  在函数init_jz_i2s中调用audio_init_endpoint进行实始化。

fragsize= JZCODEC_RW_BUFFER_SIZE * PAGE_SIZE;  

fragstotal= JZCODEC_RW_BUFFER_TOTAL;  

audio_init_endpoint(&out_endpoint,fragsize, fragstotal);  

audio_init_endpoint(&in_endpoint,fragsize, fragstotal);  

fragsize= JZCODEC_RW_BUFFER_SIZE * PAGE_SIZE;fragstotal= JZCODEC_RW_BUFFER_TOTAL;audio_init_endpoint(&out_endpoint,fragsize, fragstotal);audio_init_endpoint(&in_endpoint,fragsize, fragstotal);

进入audio_init_endpoint函数,在这里先表一下in_endpoint和out_ endpoint结构体, 初始化为0.

static audio_pipe out_endpoint = {  

.mem                 = 0,  

.savenode         = 0,  

.fragsize  = 0,  

.fragstotal        = 0,  

.trans_state    = 0,  

};  

staTIc audio_pipe in_endpoint= {  

.mem                 = 0,  

.savenode         = 0,  

.fragsize  = 0,  

.fragstotal        = 0,  

.trans_state    = 0,  

};  

staTIc audio_pipe out_endpoint = {.mem = 0,.savenode = 0,.fragsize = 0,.fragstotal = 0,.trans_state = 0,};staTIc audio_pipe in_endpoint= {.mem = 0,.savenode = 0,.fragsize = 0,.fragstotal = 0,.trans_state = 0,};

void audio_init_endpoint(audio_pipe*endpoint, unsigned int pagesize,  

unsigned int count)  

{  

audio_resizemem_endpoint(endpoint,pagesize, count);  

spin_lock_init(&endpoint->lock);  

init_waitqueue_head(&endpoint->q_full);  

endpoint->avialable_couter= 0;  

endpoint->filter= NULL;  

if(endpoint == &in_endpoint) {  

init_audio_audiodma(endpoint,CODEC_RMODE);  

//INIT_WORK(&endpoint->work, audio_in_endpoint_work);   

endpoint->handle= handle_in_endpoint_work;  

}  

if(endpoint == &out_endpoint) {  

init_audio_audiodma(endpoint,CODEC_WMODE);  

//INIT_WORK(&endpoint->work, audio_out_endpoint_work);   

endpoint->handle= handle_out_endpoint_work;  

}  

}  

int audio_resizemem_endpoint(audio_pipe*endpoint, unsigned int pagesize,   

unsigned int count)  

{  

intret = init_audio_node(&endpoint->mem, pagesize, count,(int*)&endpoint->  

fragmem_start);  

if(ret) {  

endpoint->fragsize= pagesize;  

endpoint->fragstotal= count;  

endpoint->memsize= ret;  

}  

returnret;  

}  

void audio_init_endpoint(audio_pipe*endpoint, unsigned int pagesize,unsigned int count){audio_resizemem_endpoint(endpoint,pagesize, count);spin_lock_init(&endpoint->lock);init_waitqueue_head(&endpoint->q_full);endpoint->avialable_couter= 0;endpoint->filter= NULL;if(endpoint == &in_endpoint) {init_audio_audiodma(endpoint,CODEC_RMODE);//INIT_WORK(&endpoint->work, audio_in_endpoint_work);endpoint->handle= handle_in_endpoint_work;}if(endpoint == &out_endpoint) {init_audio_audiodma(endpoint,CODEC_WMODE);//INIT_WORK(&endpoint->work, audio_out_endpoint_work);endpoint->handle= handle_out_endpoint_work;}}int audio_resizemem_endpoint(audio_pipe*endpoint, unsigned int pagesize,unsigned int count){intret = init_audio_node(&endpoint->mem, pagesize, count,(int*)&endpoint->fragmem_start);if(ret) {endpoint->fragsize= pagesize;endpoint->fragstotal= count;endpoint->memsize= ret;}returnret;}

我们进入audio_resizemem_endpoint分析内存的分配, 其中调用init_audio_node进行实质的
分配, 先介绍一下这里的变量意义,了解了这些意义,分析起来就得心应手了,迫不及待
了。

JZCODEC_RW_BUFFER_SIZE           // 1 * 4096   

JZCODEC_RW_BUFFER_TOTAL;      // 4个buff   

unsignedint     fact;                   //分配物理页的order   

audio_node      *pbuff;               //代表1个audio node   

audio_head      *phead;             //代表整个audiobuff 链表   

unsignedint     *mem;              //分配得到整个audiobuff的虚拟地址   

structlist_head *audio_wfree;       //freebuff 链表   

structlist_head *audio_wuse;        //usebuff 链表   

int    memsize;                                      //链表头+节点+audiobuff占用总空间   

int    datasize;                             //audiobuff占用的总空间   

int    headlistsize;                       //链表头+4个节点占用总空间  

上一篇:Linux中epoll IO多路复用机制


下一篇:linux下IPTABLES配置详解

友情链接
Links