1. AudioTrack播放音乐之前需要做好准备,即需要先计算最小音频数据缓存空间
文件路径:AudioTrack.java (frameworks\base\media\java\android\media)
static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat) {
@参数sampleRateInHz,音频源的采样率
@参数channelConfig,音频声道配置,如AudioFormat#CHANNEL_OUT_MONO
@参数audioFormat,音频数据格式,如AudioFormat#ENCODING_PCM_16BIT
@返回值,无效参数则返回ERROR_BAD_VALUE,不能查询硬件输出性能则返回ERROR,顺利执行则返回得到的最小音频数据缓存空间大小
int channelCount = 0;
..................
// 源采样率参数检测
if ( (sampleRateInHz < SAMPLE_RATE_HZ_MIN) || (sampleRateInHz > SAMPLE_RATE_HZ_MAX) ) {
loge("getMinBufferSize(): " + sampleRateInHz + " Hz is not a supported sample rate.");
return ERROR_BAD_VALUE;
}
//下面这个函数就是进入底层获取最小音频数据内存
int size = native_get_min_buff_size(sampleRateInHz, channelCount, audioFormat);
@参数sampleRateInHz,音频源的采样率
@参数channelCount,音频声道类型,如1表示单声道,2表示多声道
@参数audioFormat,音频数据格式,如AudioFormat#ENCODING_PCM_16BIT
..........
}
2. 由native_get_min_buff_size函数通过JNI进入android_media_AudioTrack_get_min_buff_size函数
文件路径:android_media_AudioTrack.cpp (frameworks\base\core\jni)
static jint android_media_AudioTrack_get_min_buff_size(JNIEnv *env, jobject thiz,
jint sampleRateInHertz, jint channelCount, jint audioFormat) {
@参数sampleRateInHz,音频源的采样率
@参数channelCount,音频声道类型,如1表示单声道,2表示多声道
@参数audioFormat,音频数据格式,如AudioFormat#ENCODING_PCM_16BIT
@若获取最小音频数据缓存内存失败,则返回-1;成功则返回帧个数即最小音频数据缓存大小
size_t frameCount;
//获取最小帧个数,这个函数将进入底层的audiotrack函数
const status_t status = AudioTrack::getMinFrameCount(&frameCount,
AUDIO_STREAM_DEFAULT,
sampleRateInHertz);
@参数&frameCount,得到的最小帧个数的存储变量
@参数AUDIO_STREAM_DEFAULT,默认音频流类型
@参数sampleRateInHertz,音频源采样率
if (status != NO_ERROR) {
ALOGE("AudioTrack::getMinFrameCount() for sample rate %d failed with status %d",
sampleRateInHertz, status);
return -1;
}
//音频数据格式转换,如AudioFormat#ENCODING_PCM_16BIT转换为
const audio_format_t format = audioFormatToNative(audioFormat);
@参数audioFormat,音频数据格式,如AudioFormat#ENCODING_PCM_16BIT
if (audio_is_linear_pcm(format)) { //判断是否为PCM音频数据,pcm是音频裸流数据
//每个采样点比特位数,函数路径为system/media/audio/include/system/audio.h
const size_t bytesPerSample = audio_bytes_per_sample(format);
return frameCount * channelCount * bytesPerSample; //计算最小音频数据缓存大小并返回
} else {
return frameCount;
}
}
2.1. 进入AudioTrack::getMinFrameCount()函数获取帧个数
路径:AudioTrack.cpp (frameworks\av\media\libmedia)
// static
status_t AudioTrack::getMinFrameCount(
size_t* frameCount,
audio_stream_type_t streamType,
uint32_t sampleRate)
{
@参数frameCount,得到的最小帧个数的存储变量