Frame 帧数,1单位的Frame等于一个采样点的字数*声道数(r如PCM16,双声道的1个Frame为2*2=4字节),一般音频系统都是用它为单位来分配和管理的
AudioTrack:
AudioManager.STREAM_MUSIC 音频流的类型
8000采样频率,每秒8000个点
AudioFormat.CHANNEL_CONFIGUATION_STEREO 双声道
AudioFormat.ENCODING_PCN_16BIT 采样精度:一个采样点16bit,相当于2个字节
bufsize以帧为单位的缓冲区大小
AudioTrack.MODE_STREAM数据加载模式
Audio系统对外提供的API,构造AudioTrack的参数:最后一个参数为数据加载模式,有Mode_STREAM和MODE_STATIC,第一种需要把用户提供的数据
Buffer拷贝到AudioTrack的Buffer中,一定程度上会引起延时,第二种由于是静态的,可直接调用,但这时的Buffer不能太多,否则系统无法分配足够的内存来存储全部数据。
调用native层的native_setup函数,调用AudioTrackJniStorage,new 一个AudioTrack,调用无参的构造函数,再调用Set方法填充,更新AudioTrack的参数。
AudioTrack.getMinBufferSize():调用Native函数,通过JNI查询HAL层硬件的相关信息,比如该硬件支持的最高采样率,硬件内部缓冲的大小(以Frame为单位),会综合考虑硬件的情况,得出一个最小缓冲区的大小,一般分配的缓冲大小是它的整数倍。
AudioTrackJniStorage用到了Android对共享内存的封装类,MemoryHeapBase打开/dev/ashmem设备,mapfd(fd,size)创建共享内存。MemoryBase通过MemoryHeapBase构造,即两个类都可以共享这块内存。
调用AudioTrack的start函数,通过native调用
调用AudioTrack的write函数,然后stop,最后调用native的delete
AudioTrack的set方法,利用Binder机制,实现IAudioTrack,在IAudioTrack中有一块共享内存,头部是一个audio_track_cblk_t(CB)对象,协调和管理AudioTrack和AudioFlinger的步伐。AudioTrack支持两种数据输入方式,push方式:用户主动write写数据;pull方式:主动从用户那pull数据。
write:先obtainBuffer 从