我们已经把大致的流程已经贯穿完了,还有很多东西没有讲,日后慢慢再说。不过现在有一个重要的问题,就是整个流利里各种buf,provider,bufmgr,queue类等之间的关系,说白了就是buf类和buf辅助类之前的关系。理清这些类的关系和这些类的作用,再从Buf流理解一下整个框架,CamAdapter和CamClient是怎么通过Buf联系,会对日后的分析有一个很大的帮助。也相当于对本文的一个总结。本来为了避免贴太多代码,想直接写中文总结的,后来发现贴代码虽然看得更辛苦一点,但细节更清晰,还是贴代码吧
看到这里我们了解到了
ImgBufQueNode为基本buf,里面包装了一个IImgBuf,用于操作内存存储
ImgBufQueue继承于IImgBufQueue和IImgBufProvider,是一个
ImgBufQueNode队列的管理器,里面包含两条buf队列,
一个是mTodoImgBufQue
,一个是
mDoneImgBufQue
,里面
装载着两种不同状态的buf,会把闲置的buf放入todo里,装好数据的buf装到done里,等待处理。在
ImgBufQueue里有两个系列的函数
Process系列:
Provider系列
这些系统函数都继承于他们的父类,其中Process系列的我们已经都看到了,只要给DisplayClient内部用于负责操作mTodoImgBufQue和mDoneImgBufQue的数据进出。但我们根据立面的分析知道,DisplayClient的数据由外部的CamAdapter提供,接下来就从CamAdapter角度来分析:
看到这里我们又知道了:
IImgBufProviderClient是用来管理IImgBufProvider,即让CamAdapter通过ImgBufProvidersManager管理DisplayClient的IImgBufProvider
这里的IImgBufProvider是我们DiaplayClient数据队列的管理者ImgBufQueue的父类。管理着mTodoImgBufQue和mDoneImgBufQue
上面说了ImgBufQueue继承了Provider和Process,并实现了他们的函数,其中Provider是提供给外部的类提出数据包和插入数据包,而Process是用来给内部整理和读取数据包。就如我们的DisplayClient的ImgBufQueue,DisplayClient内部生成和读取Buf通过Process系列函数,而DisplayClient把Provider系列函数提供给了CamAdapter操作数据包
这里还涉及了两个外部管理类,ImgBufProvidersManager和PreviewBufMgr,他们的继承关系是:
ImgBufProvidersManager-->RefBase
PreviewBufMgr-->IPreviewBufMgr-->IPreviewBufMgrHandler
ImgBufProvidersManager是用来管理ImgBufQueue,DisplayClient和CamClient都在它的管理内
PreviewBufMgr则是提取Provider的数据包,并填充数据再按数据包的作用通过ImgBufProvidersManager找到相应的Provider,把数据传给Provider