AudioRecord is a audio client for receiving data from an audio input device such as a microphone.
应用层调用AudioRecord的主要APIs,主要有getMinBufferSize()、new AudioRecord()、startRecording()、getRecordingState()、read()、getState()、stop()、 release(),大致调用步骤如下:
静态方法getMinBufferSize
Java Framework层,./frameworks/base/media/java/android/media/AudioRecord.java
static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat) {
int size = native_get_min_buff_size(sampleRateInHz, channelCount, audioFormat);
}
JNI层, ./frameworks/base/core/jni/android_media_AudioRecord.cpp
static jint android_media_AudioRecord_get_min_buff_size(...) {
status_t result = AudioRecord::getMinFrameCount(&frameCount,..);
}
C++ Framework层,./frameworks/av/media/libaudioclient/AudioRecord.cpp 、./frameworks/av/media/libaudioclient/AudioSystem.cpp
status_t AudioRecord::getMinFrameCount(...){
status_t status = AudioSystem::getInputBufferSize(sampleRate, format, channelMask, &size);
}
AudioSystem 通过binder方式,调用AudioFlinger的getInputBufferSize函数 {
const sp<AudioFlingerClient> afc = getAudioFlingerClient();
return afc->getInputBufferSize(sampleRate, format, channelMask, buffSize);
}
new AudioRecord
./frameworks/base/media/java/android/media/AudioRecord.java
throws IllegalArgumentException 调用相关的函数来检查参数的合法性,以及保存参数等操作; 最后调用自己的构造函 this(),一系列操作后走到jni层的方法native_setup();
./frameworks/base/core/jni/android_media_AudioRecord.cpp
./frameworks/av/media/libaudioclient/AudioRecord.cpp
./frameworks/av/media/libaudioclient/AudioSystem.cpp
./frameworks/av/services/audioflinger/AudioFlinger.h <