一.AudioRecord錄音的初始化設定
AudioRecord::set
->
AudioSystem::getInput
->
調用IAudioPolicyService.cpp檔案中的
BpAudioPolicyService的getInput函數
remote()->transact(GET_INPUT, data, &reply);
BnAudioPolicyService::onTransact(case GET_INPUT: audio_io_handle_t input = getInput(inputSource, samplingRate, format, channels, acoustics); // 調用的是AudioPolicyService::getInput函數
->
AudioPolicyService::getInput
->
AudioPolicyManagerBase::getInput
mpClientInterface->openInput
->
AudioPolicyService::openInput
->
BpAudioFlinger的openInput函數
->
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
調用s_open函數
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的值應該是-3,但log輸出的值是-22,很奇怪。
----------------------------------------------------------------------------------
二.錄音start函數的處理流程
1.如果是錄影,則錄影中的音頻錄製的調用順序是:
MPEG4Writer::start
->
MPEG4Writer::startWriterThread()
->
MPEG4Writer::startTracks
->
MPEG4Writer::Track::start
->
錄影時,video track是CameraSource,即調用CameraSource::start函數
audio track是AMRNBEncoder,即調用AMRNBEncoder::start函數
->
2.如果是單純的錄音操作,則直接走下面的路程:
AudioSource::start
->
AudioRecord::start()
->
IAudioRecord::start()
如果傳回值為DEAD_OBJECT,則調用
->
AudioRecord::openRecord
->
AudioFlinger::openRecord
->
返回RecordHandle對象
->
AudioFlinger::RecordHandle::start()
->
AudioFlinger::RecordThread::start
->
AudioSystem::startInput(mId);
->
AudioPolicyService::startInput
->
AudioPolicyManagerBase::startInput
如果AudioRecord::openRecord返回NO_ERROR,則繼續調用IAudioRecord::start()
如果IAudioRecord::start()返回NO_ERROR,則啟動ClientRecordThread線程。
----------------------------------------------------------------------------------
三.AudioRecord開始錄音的處理流程
1.frameworks\base\media\java\android\media\AudioRecord.java檔案中的
startRecording()函數
// start recording synchronized(mRecordingStateLock) { // 一直處於同步狀態,同一時間只能有一個錄音 if (native_start() == SUCCESS) { // 調用native方法 mRecordingState = RECORDSTATE_RECORDING; } }
->
2.native_start對應frameworks\base\core\jni\android_media_AudioRecord.cpp檔案中的
android_media_AudioRecord_start 函數
取得AudioRecord對象lpRecorder,然後調用lpRecorder->start()的函數,開始錄音
->
3.frameworks\base\media\libmedia\AudioRecord.cpp檔案的
AudioRecord::start()函數
3.1 取得ClientRecordThread對象t
3.2 調用IAudioRecord對象mAudioRecord->start()
(1)如果返回DEAD_OBJECT,則執行AudioRecord::openRecord函數,調用IAudioFlinger的openRecord函數開啟錄音裝置,然後再執行mAudioRecord->start()開始錄音