7.2.1 使用AudioTrack播放音频特效
要想学好AudioTrack API,读者可以从分析Android源码中的Java层源码做起。
1)第一段代码如下

针对上述代码有如下两点说明。
(2)AudioTrack.MODE_STREAM
在AudioTrack中有MODE_STATIC和MODE_STREAM两种分类。
■ STREAM:由用户在应用程序中通过write方式把数据一次一次地写到AudioTrack中。
这个过程和在socket中发送数据一样,应用层会从某个地方获取数据,例如通过“编
/解码”的方式得到PCM数据,然后写入到AudioTrack。这种方式的缺点就是总是在
Java层和Native层交互,效率较低。
■ STATIC:意思是一开始创建的时候,就把音频数据放到一个固定的buffer,然后直接
传给AudioTrack,后续就不用一次次地使用write操作了。AudioTrack会自己播放这
个buffer中的数据。这种方法对于铃声等内存占用较小、延时要求较高的声音来说很
适用。
(3)StreamType
StreamType在构造AudioTrack的第一个参数中使用,此参数和Android中的AudioManager类有关系,涉及手机的音频管理策略。(https://www.daowen.com)
Android将系统中的声音分为以下几类。
■ STREAM_ALARM:警告声。
■ STREAM_MUSIC:音乐声,例如music等。
■ STREAM_RING:铃声。
■ STREAM_SYSTEM:系统声音。
■ STREAM_VOICE_CALL:电话声音。
其实系统将这几种声音的数据分开管理,所以这个参数对AudioTrack来说,它的含义就是告诉系统:我现在想使用的是哪种类型的声音,这样系统就可以对应管理它们了。
接下来将通过一个具体实例的实现过程,讲解用AudioTrack播放音频的方法。

编写主程序文件AuTrackCH.java,主要代码如下



执行之后会播放根目录中的音频文件test.wav,如图7-2所示

图7-2 执行效果