錄音相關的處理流程

來源:互聯網
上載者:User

一.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()開始錄音

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.