Audio系統調用流程

播放接口:AudioTrack

錄製接口:AudioRecord

系統控制接口:AudioSystem

Audio系統框架分爲三個進程:Audio客戶端、main_mediaserver和servicemanager,兩個服務:AudioFlinger和AudioPolicyservice;真正幹活的都是在兩個服務中。

 

流程介紹

播放流程:

1AudioTrack::AudioTrack-->native_setup-->JNI-->android_media_AudioTrack_native_setup(+native_start)--> {AudioTrack* lpTrack = new AudioTrack()} gAudioFlinger=AudioSystem::get_audio_policy_service-->defaultServiceManager::getService(String16("media.audio_policy"))-->lpTrack->set-->AudioTrack::set-->AudioTrack::createTrack_l-->mAudioTrack=BpaudioFlinger->createTrack--

    續上--BpAudioFlinger::Transact<==Binder==>BnAudioFlinger::onTransact-->AudioFlinger::createTrack-->track = PlaybackThread *thread->createTrack_l-->trackHandle = new TrackHandle(track)[trackHandle返回給binder]-->mTrack=track

      2AudioTrack::play-->native_start-->android_media_AudioTrack_native_start-->AudioTrack::start 

--> BpAudioTrack::Transact<====>BnAudioTrack::onTransact-->TrackHandle::start-->

        -->AudioFlinger::TrackHandle::start()-->mTrack->start()-->AudioFlinger::PlaybackThread::Track::start-->AudioFlinger::PlaybackThread::addTrack_l(-->mActiveTracks.add)&&AudioSystem::startOutput-->BpAudioPolicyService::startOutput==>接續

   續上--BpAudioPolicyService::startOutput-->Transact<==Binder==>BnAudioPolicyService::onTransact-->

AudioPolicyService::startOutput-->HAL Audio

3AudioTrack::write-->native_write_short-->JNI-->native_write_short-->native_write-->writeToTrack

-->AudioTrack::write[流模式]-->

 

錄製流程:

1、   AudioRecord::AudioRecord-->native_setup-->JNI-->android_media_AudioRecord_setup-->{AudioRecord* lpRecorder = new AudioRecord()}gAudioFlinger=AudioSystem::get_audio_policy_service

-->defaultServiceManager::getService(String16("media.audio_policy"))

                                                                                       -->lpRecorder->set-->AudioRecord::set-->AudioRecord::openRecord_l-->mAudioRecord=BpaudioFlinger->openRecord && mCblk=cblk = record->getCblk獲取數據的指針-->

續上--BpAudioFlinger::Transact<====>BnAudioFlinger::onTransact-->AudioFlinger::openRecord-->recordTrack = RecordThread *thread->createRecordTrack_l-->recordHandle = new RecordHandle(recordTrack)[recordHandle返回給binder]-->mRecordTrack=recordTrack

2、   AudioRecord::startRecording-->native_start-->android_media_AudioRecord_start-->AudioRecord::start-->

BpAudioRecord::Transact<====>BnAudioRecord::onTransact-->RecordHandle::start-->  -->AudioFlinger::RecordHandle::start()-->mRecordTrack->start()-->AudioFlinger::RecordThread::RecordTrack::start-->AudioFlinger::RecordThread::start-->mActiveTrack->mState = TrackBase::RESUMING&&AudioSystem::startInput啓動硬件-->BpAudioPolicyService::startInput==>接續

   續上--BpAudioPolicyService::startInput-->Transact<==Binder==>BnAudioPolicyService::onTransact

-->AudioPolicyService::startInput-->HAL Audio

3AudioRecord::read-->native_read_in_short_array/native_read_in_direct_buffer-->JNI-->

android_media_AudioRecord_readInByteArray-->AudioRecord::read-->AudioRecord::obtainBuffer&&memcpy   源自===>mCblk=cblk = record->getCblk-->BpAudioRecord::Transact<====>BnAudioRecord::onTransact-->AudioFlinger::RecordHandle::getCblk()-->mRecordTrack->getCblk()-->AudioFlinger::RecordThread::getCblk-->AudioFlinger::ThreadBase::TrackBase::getCblk-->return mCblkMemory

 

AudioFlinger服務註冊:

main_mediaserver-->AudioFlinger::instantiate()-->繼承AudioFlinger:BinderService

--->BinderService::instantiate

代碼路徑

 

frameworks/base/include/media/

frameworks/base/media/libmedia/

frameworks/base/libs/audioflinger

frameworks\base\media\java\media\

 

應用實例

frameworks\base\media\java\media\AudioManager.java

frameworks\base\media\libstagefright\AudioPlayer.cpp

frameworks\base\voip\AudioGroup.cpp

frameworks\base\media\java\android\media\JetPlayer.java

//根據採樣率,採樣精度,單雙聲道來得到frame的大小。

int bufsize = AudioTrack.getMinBufferSize(8000,//每秒8K個點

AudioFormat.CHANNEL_CONFIGURATION_STEREO,//雙聲道

AudioFormat.ENCODING_PCM_16BIT);//一個採樣點16比特-2個字節

//注意,按照數字音頻的知識,這個算出來的是一秒鐘buffer的大小。

//創建AudioTrack

AudioTrack trackplayer = new AudioTrack(AudioManager.STREAM_MUSIC, 8000,

AudioFormat.CHANNEL_CONFIGURATION_ STEREO,

AudioFormat.ENCODING_PCM_16BIT,bufsize,AudioTrack.MODE_STREAM);

 

trackplayer.play() ;//開始

trackplayer.write(bytes_pkg, 0, bytes_pkg.length) ;//track中寫數據

trackplayer.stop();//停止播放

trackplayer.release();//釋放底層資源。

 Audio系統調用流程

AudioTrack播放流程圖

Audio系統調用流程

AudioRecord錄製流程圖

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