免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4420 | 回复: 2
打印 上一主题 下一主题

[硬件及驱动] 请教snd_pcm_playback_avail()怎么理解dma缓冲区的计算 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-03 14:01 |只看该作者 |倒序浏览
源码为:
  1. 605 /*
  2. 606  *  result is: 0 ... (boundary - 1)
  3. 607  */
  4. 608 static inline snd_pcm_uframes_t snd_pcm_playback_avail(struct snd_pcm_runtime *runtime)
  5. 609 {
  6. 610   snd_pcm_sframes_t avail = runtime->status->hw_ptr + runtime->buffer_size - runtime->control->appl_ptr;
  7. 611   if (avail < 0)                                                                  
  8. 612     avail += runtime->boundary;                                                   
  9. 613   else if ((snd_pcm_uframes_t) avail >= runtime->boundary)                        
  10. 614     avail -= runtime->boundary;                                                   
  11. 615   return avail;                                                                    
  12. 616 }  
复制代码
路径"include/sound/pcm.h"
不太理解是怎么计算avail的值。
我可以理解runtime->status->hw_ptr + runtime->buffer_size - runtime->control->appl_ptr;的含义,他是 已经用完的硬件指针hw_ptr + 还没有写入数据的长度 = 可用的长度。
但是对于下面的情况就不清楚了.
(1)何时会出现avail<0? 我的猜想,根据 runtime->status->hw_ptr + runtime->buffer_size - runtime->control->appl_ptr;肯定是 appl_ptr的值减去 hw_ptr的值大于一个buffer_size的情况下会出现avail<0,但是这时出现avial<0为什么要用 avial+=runtime->boundary呢?
(2)何时会出现avail>runtime->boundary?为什么要avail-=runtime->boundary?

论坛徽章:
0
2 [报告]
发表于 2013-03-04 13:13 |只看该作者
没玩过,不懂,不过我觉得你要是能把这几个数据的定义吃透的话,应该就明白了。

看起来boundary像是一个环形缓冲的大小,hw_ptr像是生产者,buffer是下一个产品的大小,而appl_ptr是消费者。这样一来,第一个问题就好说了,对于第二个问题,就是那个要减去boundary的,就不明白了,可能跟具体的实现或者协议有关系吧?

瞎猜啊,说中了算我的,说错了不负责啊,呵呵。lol

论坛徽章:
0
3 [报告]
发表于 2013-03-04 14:16 |只看该作者
回复 2# 灌水菜鸟


    你说的对,昨天发帖后仿佛理解了,正在实际设置条件来验证
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP