当前位置: 技术问答>linux和unix
关于音频缓冲区的设置问题,请教高手!
来源: 互联网 发布时间:2016-07-18
本文导语: 以下代码是来自s3c2410_uda1314.c 我的问题是: 代码中 已经用kmalloc(sizeof(audio_buf_t) * s->nbfrags, GFP_KERNEL);分配了内存空间,为什么还要用 consistent_alloc(GFP_KERNEL|GFP_DMA, dmasize, &dmaphys);呢? 是不是在分配音频缓冲区...
以下代码是来自s3c2410_uda1314.c
我的问题是:
代码中 已经用kmalloc(sizeof(audio_buf_t) * s->nbfrags, GFP_KERNEL);分配了内存空间,为什么还要用
consistent_alloc(GFP_KERNEL|GFP_DMA, dmasize, &dmaphys);呢?
是不是在分配音频缓冲区的时候必须是先分配一段内存,接着再设置具体的内容。
这个consistent_alloc函数是用来设置dma的吗?
static int audio_setup_buf(audio_stream_t * s)
{
int frag;
int dmasize = 0;
char *dmabuf = 0;
dma_addr_t dmaphys = 0; //dma总线地址
if (s->buffers)
return -EBUSY;
s->nbfrags = audio_nbfrags; //片段的数量
s->fragsize = audio_fragsize; //片段的大小
s->buffers = (audio_buf_t *)
kmalloc(sizeof(audio_buf_t) * s->nbfrags, GFP_KERNEL);
if (!s->buffers)//分配失败,跳出
goto err;
//给分配的区域清零
memset(s->buffers, 0, sizeof(audio_buf_t) * s->nbfrags);
for (frag = 0; frag nbfrags; frag++) {
audio_buf_t *b = &s->buffers[frag];
if (!dmasize) {
dmasize = (s->nbfrags - frag) * s->fragsize;
do {
dmabuf = consistent_alloc(GFP_KERNEL|GFP_DMA,
dmasize, &dmaphys);
if (!dmabuf)
dmasize -= s->fragsize;
} while (!dmabuf && dmasize);
if (!dmabuf)
goto err;
b->master = dmasize;
}
b->start = dmabuf;
b->dma_addr = dmaphys;
sema_init(&b->sem, 1);
DPRINTK("buf %d: start %p dma %dn", frag, b->start, b->dma_addr);
dmabuf += s->fragsize;
dmaphys += s->fragsize;
dmasize -= s->fragsize;
}
s->buf_idx = 0;
s->buf = &s->buffers[0];
return 0;
err:
printk(AUDIO_NAME ": unable to allocate audio memoryn ");
audio_clear_buf(s);
return -ENOMEM;
}
我的问题是:
代码中 已经用kmalloc(sizeof(audio_buf_t) * s->nbfrags, GFP_KERNEL);分配了内存空间,为什么还要用
consistent_alloc(GFP_KERNEL|GFP_DMA, dmasize, &dmaphys);呢?
是不是在分配音频缓冲区的时候必须是先分配一段内存,接着再设置具体的内容。
这个consistent_alloc函数是用来设置dma的吗?
static int audio_setup_buf(audio_stream_t * s)
{
int frag;
int dmasize = 0;
char *dmabuf = 0;
dma_addr_t dmaphys = 0; //dma总线地址
if (s->buffers)
return -EBUSY;
s->nbfrags = audio_nbfrags; //片段的数量
s->fragsize = audio_fragsize; //片段的大小
s->buffers = (audio_buf_t *)
kmalloc(sizeof(audio_buf_t) * s->nbfrags, GFP_KERNEL);
if (!s->buffers)//分配失败,跳出
goto err;
//给分配的区域清零
memset(s->buffers, 0, sizeof(audio_buf_t) * s->nbfrags);
for (frag = 0; frag nbfrags; frag++) {
audio_buf_t *b = &s->buffers[frag];
if (!dmasize) {
dmasize = (s->nbfrags - frag) * s->fragsize;
do {
dmabuf = consistent_alloc(GFP_KERNEL|GFP_DMA,
dmasize, &dmaphys);
if (!dmabuf)
dmasize -= s->fragsize;
} while (!dmabuf && dmasize);
if (!dmabuf)
goto err;
b->master = dmasize;
}
b->start = dmabuf;
b->dma_addr = dmaphys;
sema_init(&b->sem, 1);
DPRINTK("buf %d: start %p dma %dn", frag, b->start, b->dma_addr);
dmabuf += s->fragsize;
dmaphys += s->fragsize;
dmasize -= s->fragsize;
}
s->buf_idx = 0;
s->buf = &s->buffers[0];
return 0;
err:
printk(AUDIO_NAME ": unable to allocate audio memoryn ");
audio_clear_buf(s);
return -ENOMEM;
}
|
恭喜楼主,希望楼主说说是怎么解决的!
|
啊,这么快。分析原因贴出来呗
|
那就告诉我吧 我也想知道
|
自问自答?
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。