Android音頻流程三(各種類及主要方法)

來源:互聯網
上載者:User

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兩部分,流程和函數相似;音效部分的類的構造和函數實現暫時不分析


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.