Android 11音频服务创建以及播放的流程( 四 )


在set函数中会和以及进行互动,主要是找到给当前Track播放的设备以及该设备使用的线程,最终实现播放音频的目的 。
3.2 策略查找流程
【Android 11音频服务创建以及播放的流程】在中获取的候可以选择主设备和次设备输出,但是次设备都是通过动态策略进行选择的,不支持选中次设备,主要都是通过这里的APM从前面解析xml之后得到的一些结果中去查询需要的数据 。
3.3 播放线程和HAL的交互
将输出设备选中之后就需要针对该输出设备创建相应的线程进行数据的写入了,前面部分已经获取了当前应用要播放的流类型应该打开的的所有信息,剩下的工作就是怎么找到当前所对应的播放线程:
3.3.1 播放线程的选择以及Track创建
这里首先根据当前找到的查找对应的播放线程,这个播放线程是在一开始创建和的时候就打开的,然后在该线程中为当前要播放的音频创建一个Track并将该Track添加进当前线程持有的Track容器中 。
到此从应用发起创建的请求到最终创建已经结束,剩下的事情就是应用开始往共享内存中写入内容,获取内容并发送到HAL层中通过驱动打开硬件进行最终的播放 。
3.3.1 打开输出源
上面的内容是找到了当前相关的以及相应的工作线程,接下来就需要打开这个,然后开始往里面写数据,也就是应用调用write或play之后开始写数据的内容,直接从.cpp中开始看
在上面调用的时候需要进行一些判断来决定最终是否打开该输出源,如果不能打开是不会向底层写数据的,调试的时候需要重点关注这部分内容,判断是否所有情况都准备就绪再去看数据处理的部分 。
3.3.2 向HAL层写数据
这里向共享内存写入数据,从共享内存中读取数据,我们这里直接从里面的线程开始分析,假设是(大部分情况都是这种)过程如下: