android audio 音頻流的理解記錄

主要是AudioRecord是如何採集到聲卡聲音的
   簡單描述一下流程,audioRecord java層新建實例,同時傳遞參數,
   採集源與聲音的參數,此時會調用jni的native_setup函數建立audioRecord Cpp層的實例,同時傳遞迴調函數指針參數。
   進入audioRecord的cpp層的set函數,set函數根據傳遞的參數,得到一個 input的句柄,會調用AudioFlinger的openInput函數,
從傳遞過來的句柄中獲取一個輸入流,也就是錄音的數據流,這裏是硬件上的音頻流,採集的是PCM。也就是音頻的前端處理。
如果這個前面描述的流程,在處理時,滿足audiosystem\audioPolicy一些設備管理及音頻策略,則可以進入下一個階段,
建立一個錄音的線程reccordThread,同時根據binder機制,分配內存共享塊,定義audio_track_cblk_t.這裏比較感興趣的是,
CPP回調了java中的listener函數,通過javaAudioRecordFields.postNativeEventInJava回調,如此audio的錄音條件環境準備完畢,
待java中發起或者中斷錄音工作,主要理解Binder的通訊.cPP回調java,java調用cpp,比如
錄音時source的傳遞,audioRecord指定source後,在system/audio.h中有一個枚舉,看是否在這相枚舉的定義範圍內。
這是從應用的場景來看這個問題,從邏輯上看,cpp及HAL都沒有此定義。所以,應用場景要正確,才能繼續設計場景及硬件場景

繼續:soure指定後,audioRecord.java層,調用audioattribute進行場景判斷,條件符合,進入audioFlinger的openInput函數。
也可能是openInput_L函數,沒有打log。具體log還需要跟蹤確定。openInput_L這裏會將  findSuitableHwDev_l -》open_input_stream 進

入HAL層。 in->usecase = USECASE_AUDIO_RECORD_AFE_PROXY; in_read->pcm_read  start_input_stream->pcm_open  取得數據流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章