audiomixer分析

本文深入探讨了AF如何在playbackThread线程中执行mixer操作,并将内容输出到硬件。关键点在于process__validate作为hook的入口,揭示了音频混合的内部工作原理。
摘要由CSDN通过智能技术生成



我们在AF小节里面讲了,AF会创建playbackThread线程,进行mixer操作。并且写入硬件。

我们这里以MixerThread为例进行分析。
先看MixerThread构造函数
AudioFlinger::MixerThread::MixerThread()
{
...
    mAudioMixer = new AudioMixer(mNormalFrameCount, mSampleRate);
...
}
构造函数里,主要就是创建了一个AudioMixer的类
class AudioMixer中比较重要的就是一些操作函数setResampler ,setParameter,setBufferProvider,getTrackName等,
以及下面这个结构体,其中track_t         tracks[MAX_NUM_TRACKS]数组承载了AT小节里面讲到的,AT在AF里面创建对应的Track实例。最多可以创建32个。
即最多支持32路同时混音。
  struct state_t {
        uint32_t        enabledTracks;
        uint32_t        needsChanged;
        size_t          frameCount;
        void            (*hook)(state_t* state, int64_t pts);   // one of process__*, never NULL
        int32_t         *outputTemp;
        int32_t         *resampleTemp;
        NBLog::Writer*  mLog;
        int32_t         reserved[1];
        track_t         tracks[MAX_NUM_TRACKS]; __attribute__((aligned(32)));
    };
前面AF章节我们讲到,AF中,做audio mixer前,会先调用prepareTracks_l来准备数据和Track,并且把准备好的参数设置给AudioMixer
最终的mixer实际操作是在AudioMixer->process里面,
void AudioMixer::process(int64_t  pts)
{
    mState.hook(&mState,pts);
}
很明显,要根据不同的实际情况,挂接不同的钩子函数来做对应的mixer操作
在代码里,我们可以看到有以下几个钩子函数:
process__validate:    根据具体情况,负责为hook挂接具体实现
process__nop:   hook的初始化值
process__OneTrack16BitsStereoNoResampling:   只有一路Track,16比特立体声,不重采样
process__genericNoResampling:     两路(包含)以上Track,不重采样,也是用的最多的场景
process__genericResampling:       两
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值