AudioTrack
音軌建立:
AudioTrack::createTrack
1)AudioSystem::get_audio_flinger
2)AudioSystem::getOutputSamplingRate
3)AudioSystem::getOutputFrameCount
4)AudioSystem::getOutputLatency
5)audioFlinger->createTrack調用audioFlinger的方法
6)sp<IMemory> cblk = track->getCblk();獲得buffer,實際是在audioFlinger中申請的
7)mCblk = static_cast<audio_track_cblk_t*>(cblk->pointer());獲得buffer指標
8)mCblk->buffers = (char*)mCblk + sizeof(audio_track_cblk_t);
擷取緩衝:
AudioTrack::obtainBuffer
1)uint32_t framesAvail = cblk->framesAvailable();buffer中有多少幀資料可用
2)while (framesAvail == 0){}只要沒擷取成功,就迴圈著
3)cblk->userBase cblk->frameCount環形buffer起止位置調整
寫音頻資料
AudioTrack::write
1)obtainBuffer(&audioBuffer, -1)擷取一個buffer,不用等待
2)memcpy(audioBuffer.i8, src, toWrite)拷貝資料
3)releaseBuffer(&audioBuffer)釋放buffer
擷取輸出裝置
AudioTrack::getOutput
1)AudioSystem::getOutput
總之,audioTrack會調用audioFlinger建立音軌,獲得緩衝buffer,會調用audioSystem擷取參數
AudioSystem
擷取輸出裝置
AudioSystem::getOutput
1) AudioSystem::gStreamOutputMap.valueFor擷取iohandle
2) Aps = AudioSystem::get_audio_policy_service擷取不到iohandle,請求aps協助
3) output = aps->getOutput通過aps協助獲得輸出裝置
4) AudioSystem::gStreamOutputMap.add儲存結果,避免下次還要調用aps
其他的方法類似,都是調用audioPolicyService的方法
audioPolicyService
建立服務
AudioPolicyService::AudioPolicyService
1)mpPolicyManager = createAudioPolicyManager(this)
擷取輸出裝置
AudioPolicyService::getOutput
1)mpPolicyManager->getOutput
其他的方法類似,都是調用AudioPolicyManager的方法
但是AudioPolicyManager沒有實現,而是在它父類中實現方法,繼承關係:
class AudioPolicyManager: public AudioPolicyManagerBase
AudioPolicyManagerBase
建立服務
AudioPolicyManagerBase::getOutput
1) AudioOutputDescriptor *outputDesc = new AudioOutputDescriptor()
2) mHardwareOutput = mpClientInterface->openOutput需要輸入參數是client,不知道是哪裡建立的client
3) addOutput
4) setOutputDevice
擷取裝置
AudioPolicyManagerBase::getOutput
1)output = mHardwareOutput最終得到了output
audioFlinger
audioFlinger是整個音頻架構的中介層,起著承上啟下的重要作用,audioFlinger.cpp中因此也定義了很多的類以及各自的方法實現
AudioFlinger::openOutput
1)AudioStreamOut *output = mAudioHardware->openOutputStream
2)new DirectOutputThread 或者 new MixerThread
3)thread->audioConfigChanged_l(AudioSystem::OUTPUT_OPENED);
AudioFlinger::closeOutput
1)dupThread->removeOutputTrack
2)audioConfigChanged_l
3)thread->exit();
4)mAudioHardware->closeOutputStream
audioFlinger的方法可分成playback和record兩部分,流程和函數相似;音效部分的類的構造和函數實現暫時不分析