http://blog.csdn.net/ameyume/article/details/7794953
2012
一.AudioRecord錄音的初始化設(shè)置AudioRecord::set
->
AudioSystem::getInput
->
調(diào)用IAudioPolicyService.cpp文件中的
BpAudioPolicyService的getInput函數(shù)
remote()->transact(GET_INPUT, data, &reply);
- BnAudioPolicyService::onTransact(
- case GET_INPUT:
- audio_io_handle_t input = getInput(inputSource,
- samplingRate,
- format,
- channels,
- acoustics); // 調(diào)用的是AudioPolicyService::getInput函數(shù)
->
AudioPolicyService::getInput
->
AudioPolicyManagerBase::getInput
mpClientInterface->openInput
->
AudioPolicyService::openInput
->
BpAudioFlinger的openInput函數(shù)
->
AudioFlinger::openInput
mAudioHardware->openInputStream
->
- AudioHardwareALSA::openInputStream
- err = mALSADevice->open(&(*it), devices, mode(), 0);
-
- in = new AudioStreamInALSA(this, &(*it), acoustics);
- err = in->set(format, channels, sampleRate);
->
alsa_default.cpp
調(diào)用s_open函數(shù)
- ALSAStreamOps::set
- if (rate && *rate > 0) {
- if (mHandle->sampleRate != *rate) {
- LOGE("%s L%d mHandle->sampleRate = %d, return BAD_VALUE %d ", __FUNCTION__, __LINE__, mHandle->sampleRate, BAD_VALUE);
- return BAD_VALUE;
- }
- }
E/AudioHardwareALSA( 1181): set L123 mHandle->sampleRate = 8000, return BAD_VALUE -22 // 如果采樣率不是8000,則返回BAD_VALUE
E/AudioHardwareALSA( 1181): openInputStream L314 in->set err = -22
// BAD_VALUE的定義是
BAD_VALUE = -EINVAL,
#define EINVAL 3
按照以上定義,BAD_VALUE的值應(yīng)該是-3,但log輸出的值是-22,很奇怪。
----------------------------------------------------------------------------------
二.錄音start函數(shù)的處理流程1.如果是錄像,則錄像中的音頻錄制的調(diào)用順序是:
MPEG4Writer::start
->
MPEG4Writer::startWriterThread()
->
MPEG4Writer::startTracks
->
MPEG4Writer::Track::start
->
錄像時,video track是CameraSource,即調(diào)用CameraSource::start函數(shù)
audio track是AMRNBEncoder,即調(diào)用AMRNBEncoder::start函數(shù)
->
2.如果是單純的錄音操作,則直接走下面的路程:
AudioSource::start
->
AudioRecord::start()
->
IAudioRecord::start()
如果返回值為DEAD_OBJECT,則調(diào)用
->
AudioRecord::openRecord
->
AudioFlinger::openRecord
->
返回RecordHandle對象
->
AudioFlinger::RecordHandle::start()
->
AudioFlinger::RecordThread::start
->
AudioSystem::startInput(mId);
->
AudioPolicyService::startInput
->
AudioPolicyManagerBase::startInput
如果AudioRecord::openRecord返回NO_ERROR,則繼續(xù)調(diào)用IAudioRecord::start()
如果IAudioRecord::start()返回NO_ERROR,則啟動ClientRecordThread線程。
----------------------------------------------------------------------------------
三.AudioRecord開始錄音的處理流程1.frameworks\base\media\java\android\media\AudioRecord.java文件中的
startRecording()函數(shù)
- // start recording
- synchronized(mRecordingStateLock) { // 一直處于同步狀態(tài),同一時間只能有一個錄音
- if (native_start() == SUCCESS) { // 調(diào)用native方法
- mRecordingState = RECORDSTATE_RECORDING;
- }
- }
->
2.native_start對應(yīng)frameworks\base\core\jni\android_media_AudioRecord.cpp文件中的
android_media_AudioRecord_start 函數(shù)
取得AudioRecord對象lpRecorder,然后調(diào)用lpRecorder->start()的函數(shù),開始錄音
->
3.frameworks\base\media\libmedia\AudioRecord.cpp文件的
AudioRecord::start()函數(shù)
3.1 取得ClientRecordThread對象t
3.2 調(diào)用IAudioRecord對象mAudioRecord->start()
(1)如果返回DEAD_OBJECT,則執(zhí)行AudioRecord::openRecord函數(shù),調(diào)用IAudioFlinger的openRecord函數(shù)打開錄音設(shè)備,然后再執(zhí)行mAudioRecord->start()開始錄音