播放接口:AudioTrack
錄製接口:AudioRecord
系統控制接口:AudioSystem
Audio系統框架分爲三個進程:Audio客戶端、main_mediaserver和servicemanager,兩個服務:AudioFlinger和AudioPolicyservice;真正幹活的都是在兩個服務中。
流程介紹
播放流程:
1、AudioTrack::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
2、AudioTrack::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
3、AudioTrack::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
3、AudioRecord::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();//釋放底層資源。
AudioTrack播放流程圖
AudioRecord錄製流程圖