mSleepTimeUs与其在systrace的表现

本文详细解析了Android AudioFlinger中MixerThread的mSleepTimeUs、mIdleSleepTimeUs和mActiveSleepTimeUs的计算及作用,讨论了在不同条件下线程如何进入sleep状态以及对hal层数据的影响。通过分析threadLoop_sleepTime函数和mix函数,揭示了在systrace中的表现,特别是0数据的写入情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、mSleepTimeUs
表示要sleep的时间,一般是等于mIdleSleepTimeUs,而 mIdleSleepTimeUs是idleSleepTimeUs()的返回。

uint32_t AudioFlinger::MixerThread::idleSleepTimeUs() const
{
return (uint32_t)(((mNormalFrameCount * 1000) / mSampleRate) * 1000) / 2;
}

大概就是等于out_write一次数据的时间的一半。比如mNormalFrameCount = 1920, mSampleRate = 48000, 那idleSleepTimeUs = 1920/4800/2 = 20ms,但是mNormalFrameCount还不一定
等于hal层返回的framecount,mNormalFrameCount = multiplier * mFrameCount;
mFrameCount 才是hal层返回的framecount,mFrameCount = mBufferSize / mFrameSize;

2、mActiveSleepTimeUs
mActiveSleepTimeUs = activeSleepTimeUs();

uint32_t AudioFlinger::PlaybackThread::activeSleepTimeUs() const
{
return (uint32_t)((uint32_t)((mNormalFrameCount * 1000) / mSampleRate) * 1000);
}

所以mActiveSleepTimeUs会等于idleSleepTimeUs的2倍,大概是40ms。

3、sleepTimeShift
一个移位参数,主要用于计算实际mSleepTimeUs的值, mSleepTimeUs 不超过kMaxThreadSleepTimeShift(即static const uint32_t kMaxThreadSleepTimeShift = 2;)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值