网上已有许多朋友对Android音频子系统做了透彻的分析,我这完全是给自己在做学习笔记本文基于Android Ics
AudioTrack的使用实例,在google的源码中已经为我们准备了AudioTrack的测试代码,代码路径如下:
frameworks/base/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaAudioTrackTest.java
源码太长了鸭梨太大了,我随便在该测试代码中抽取了几个API方法,以至于了解AudioTrack是怎么使用的,方便后面的分析。
好吧来看看testSetStereoVolumeMax这个API吧从字面意思理解应该是设置音量了,具体的实现看下面源码
//Test case 1: setStereoVolume() with max volume returns SUCCESS
@LargeTest
public void testSetStereoVolumeMax() throws Exception {
// constants for test
final String TEST_NAME = "testSetStereoVolumeMax";
final int TEST_SR = 22050;
final int TEST_CONF = AudioFormat.CHANNEL_OUT_STEREO;
final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
final int TEST_MODE = AudioTrack.MODE_STREAM;
final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;
//-------- initialization --------------
int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
minBuffSize, TEST_MODE);
byte data[] = new byte[minBuffSize/2];
//-------- test --------------
track.write(data, 0, data.length);
track.write(data, 0, data.length);
track.play();
float maxVol = AudioTrack.getMaxVolume();
assertTrue(TEST_NAME, track.setStereoVolume(maxVol, maxVol) == AudioTrack.SUCCESS);
//-------- tear down --------------
track.release();
}
从上面的代码我们可以知道当我们使用AudioTrack的时候第一步要做的事情就是初始化AudioTrack,初始化分两部走
1)调用getMinBufferSize get the minimum buffer size required for the successful creation of an AudioTrack
2)创建AudioTrack实例
3)用AudioTrack中的各种API去做各种事,比如说上面的track.write(data, 0, data.length)将数据写入硬件,track.play()播放音频数据
我沿着这几个艰辛的目标回到了AudioTrack这个类的实现frameworks/base/media/java/android/media/AudioTrack.java
getMinBufferSize究竟是怎么实现的,在分析它的源码之前我们需要对它的那三个参数有一定的了解
@param sampleRateInHz:采样率
------------人耳能听到大概是20Hz到40000Hz吧
@param channelConfig:声道
------------CHANNEL_OUT_MONO
------------CHANNEL_CONFIGURATION_MONO
------------CHANNEL_OUT_STEREO
----------&