Android系统中,应用程序只能看到AudioSystem这个接口,AudioFlinger是一个实现类,主要用于音频选路和PCM包的混音与重采样,并把PCM数据包传送给底层。AudioFlinger在所有进程中只有一个实体,其他进程如需要访问通过Binder进程间通信的方式进行访问。
AudioHardware是一层硬件抽象层,主要负责音频数据的收发与控制。AudioFlinger把他看成实际的硬件。当音频路径设置成A2DP时,通过Bluetooth模块收发数据,通过立体声蓝牙耳机即可听到高保真音乐。
AudioAccessory主要用于事件的监听,并把这些事件发送给AudioFlinger模块进行音频路径的重新设定。当蓝牙立体声耳机匹配之后,AudioAccessory会从kernel中获得相应的信息(监听HCI层的事件),然后把音频路径配置成A2DP模式,这样音频数据就只会发送到蓝牙耳机当中,如有必要,也可以设置扬声器的音频解码芯片转入休眠状态。
当有音频数据播放时,由于SBC音频压缩的开源代码只能压缩512bytes大小的数据因此,AudioHardware每次发送下来4096Bytes,然后把这4096个字节分割成N个512Bytes的小块,放入一个队列当中。经过SBC压缩之后变成113bytes。另外一个线程会每次对SBC压缩好的包进行再封装,封装成一个标准的A2DP packet,然后再把这样的A2DP packet移动到发送队列当中。
最后设定好软件定时器,每隔一段时间回发送一个A2DP包。这个时间间隔是SBC编码期间返回的推荐值。
AudioHardware是一层硬件抽象层,主要负责音频数据的收发与控制。AudioFlinger把他看成实际的硬件。当音频路径设置成A2DP时,通过Bluetooth模块收发数据,通过立体声蓝牙耳机即可听到高保真音乐。
AudioAccessory主要用于事件的监听,并把这些事件发送给AudioFlinger模块进行音频路径的重新设定。当蓝牙立体声耳机匹配之后,AudioAccessory会从kernel中获得相应的信息(监听HCI层的事件),然后把音频路径配置成A2DP模式,这样音频数据就只会发送到蓝牙耳机当中,如有必要,也可以设置扬声器的音频解码芯片转入休眠状态。
当有音频数据播放时,由于SBC音频压缩的开源代码只能压缩512bytes大小的数据因此,AudioHardware每次发送下来4096Bytes,然后把这4096个字节分割成N个512Bytes的小块,放入一个队列当中。经过SBC压缩之后变成113bytes。另外一个线程会每次对SBC压缩好的包进行再封装,封装成一个标准的A2DP packet,然后再把这样的A2DP packet移动到发送队列当中。
最后设定好软件定时器,每隔一段时间回发送一个A2DP包。这个时间间隔是SBC编码期间返回的推荐值。