Android AudioFlinger

一、AudioFlinger介绍

AudioPolicyService 与 AudioFlinger 是 Android 音频系统的两大基本服务。前者是音频系统策略的制定者,负责音频设备切换的策略抉择、音量调节策略等;后者是音频系统策略的执行者,负责音频流设备的管理及音频流数据的处理传输,所以 AudioFlinger 也被认为是 Android 音频系统的引擎。

AudioFlinger 对外提供的主要的服务接口如下:

  • createTrack:新建输出流管理对象: 找到对应的 PlaybackThread,创建输出流管理对象 Track,然后创建并返回该 Track 的代理对象 TrackHandle

  • createRecord:新建输入流管理对象:找到 RecordThread,创建输入流管理对象 RecordTrack,然后创建并返回该 RecordTrack 的代理对象 RecordHandle

  • openOutput:打开输出流:打开输出流设备,并创建 PlaybackThread 对象

  • openInput:打开输入流:打开输入流设备,并创建 RecordThread 对象

  • closeOutput:关闭输出流:移除并销毁 PlaybackThread 上面挂着的所有的 Track,退出 PlaybackThread,关闭输出流设备

  • closeInput:关闭输入流:退出 RecordThread,关闭输入流设备

  • sampleRate:获取硬件设备的采样率

  • format:获取硬件设备的音频格式

  • frameCount:获取硬件设备的周期帧数

  • latency:获取硬件设备的传输延迟

  • masterVolume:主输出设备的音量

  • masterMute:主输出设备静音

  • setMasterVolume:调节主输出设备的音量

  • setMasterMute:静音主输出设备

  • streamVolume:音频流的音量

  • streamMute:音频流静音

  • setStreamVolume:调节指定类型的音频流的音量,这种调节不影响其他类型的音频流的音量

  • setStreamMute:静音指定类型的音频流

  • setVoiceVolume:调节通话音量

  • setMicMute:静音麦克风输入

  • getMicMute:获取麦克风静音

  • setMode:切换音频模式:音频模式有 4 种,分别是 Normal、Ringtone、Call、Communicatoin

  • setParameters:设置音频参数:往下调用 HAL 层相应接口,常用于切换音频通道

  • getParameters:获取音频参数:往下调用 HAL 层相应接口

  • setAudioPortConfig:

其它接口:

  • setRecordSilenced

  • registerClient

  • getInputBufferSize

  • openDuplicateOutput

  • suspendOutput

  • restoreOutput

  • invalidateStream

  • setVoiceVolume

  • getRenderPosition

  • getInputFramesLost

  • newAudioUniqueId

  • acquireAudioSessionId

  • releaseAudioSessionId

  • queryNumberEffects

  • queryEffect

  • getEffectDescriptor

  • createEffect

  • moveEffects

  • loadHwModule

  • getPrimaryOutputSamplingRate

  • getPrimaryOutputFrameCount

  • setLowRamDevice

  • getAudioPort

  • createAudioPatch

  • releaseAudioPatch

  • listAudioPatches

  • getAudioHwSyncForSession

  • systemReady

  • audioPolicyReady

  • frameCountHAL

  • getMicrophones

  • setMasterBalance

  • getMasterBalance

  • setEffectSuspended

  • setAudioHalPids

  • setVibratorInfos

  • updateSecondaryOutputs

  • getMmapPolicyInfos

  • getAAudioMixerBurstCount

  • getAAudioHardwareBurstMinUsec

  • setDeviceConnectedState

可以归纳出 AudioFlinger 响应的服务请求主要有:

  • 音量调节(Audio Volume)

  • 静音操作(Audio Mute)

  • 音频模式切换(Audio Mode)

  • 音频参数设置(Audio Parameters)

  • 音效模块(Audio PatchPanel )

  • 音频设备管理(Audio Device)

  • 音频流管理(Audio Thread)

  • 音频路径管理(Audio PatchPanel)

  • 音频线程管理(Audio Thread)

二、AudioFlinger相关类

下面的图示描述了AudioFlinger类的内部结构和关系:

AudioFlinger

AudioFlinger是Android系统中一个重要的音频组件,负责管理和控制所有音频数据的路由、混合和输出,以及执行音频效果处理,是Android系统实现高质量音频的关键组件之一。AudioFlinger运行在系统服务进程中,并提供了对应用程序、硬件驱动程序和其他音频组件的接口。

AudioFlinger代码位于:

frameworks/av/media/libaudioclient/aidl/android/media/IAudioFlingerClient.aidl

frameworks/av/media/libaudioclient/aidl/android/media/IAudioFlingerService.aidl

frameworks/av/media/libaudioclient/IAudioFlinger.cpp

frameworks/av/media/libaudioclient/include/media/IAudioFlinger.h

frameworks/av/services/audioflinger/AudioFlinger.cpp

frameworks/av/services/audioflinger/AudioFlinger.h

AudioFlinger的定义:

interface IAudioFlingerClient {}
interface IAudioFlingerService {}
class IAudioFlinger : public virtual RefBase {}
class AudioFlingerClientAdapter : public IAudioFlinger {}
class AudioFlingerServerAdapter : public media::BnAudioFlingerService {}
class AudioFlinger : public AudioFlingerServerAdapter::Delegate{}

AudioHwDevice

AudioHwDevice是AudioFlinger中用于管理audio设备的类。Device是对audio_hw_device的封装

AudioHwDevice代码位于:

frameworks/av/services/audioflinger/AudioHwDevice.cpp

frameworks/av/services/audioflinger/AudioHwDevice.h

AudioHwDevice的定义:

class AudioHwDevice {}

AudioStreamOut

AudioStreamOut是AudioFlinger中用于管理音频输出设备对象的类。

AudioStreamOut代码位于:

frameworks/av/services/audioflinger/AudioStreamOut.cpp

frameworks/av/services/audioflinger/AudioStreamOut.h

frameworks/av/services/audioflinger/SpdifStreamOut.cpp

frameworks/av/services/audioflinger/SpdifStreamOut.h

AudioStreamOut的定义:

class AudioStreamOut {}
class SpdifStreamOut : public AudioStreamOut {}

FastCapture

FastCapture是AudioFlinger中用于捕获音频的类。

FastCapture代码位于:

frameworks/av/services/audioflinger/FastCapture.cpp

frameworks/av/services/audioflinger/FastCapture.h

frameworks/av/services/audioflinger/FastCaptureDumpState.cpp

frameworks/av/services/audioflinger/FastCaptureDumpState.h

frameworks/av/services/audioflinger/FastCaptureState.cpp

frameworks/av/services/audioflinger/FastCaptureState.h

FastCapture的定义:

class FastCapture : public FastThread {}

FastMixer

FastMixer是AudioFlinger中用于混音的类。

FastMixer代码位于:

frameworks/av/services/audioflinger/FastMixer.cpp

frameworks/av/services/audioflinger/FastMixer.h

frameworks/av/services/audioflinger/FastMixerDumpState.cpp

frameworks/av/services/audioflinger/FastMixerDumpState.h

frameworks/av/services/audioflinger/FastMixerState.cpp

frameworks/av/services/audioflinger/FastMixerState.h

FastMixer的定义:

class FastMixer : public FastThread {}

FastThread

FastThread 是 FastMixer 和 FastCapture 的通用抽象基类。

FastThread代码位于:

frameworks/av/services/audioflinger/FastThread.cpp

frameworks/av/services/audioflinger/FastThread.h

frameworks/av/services/audioflinger/FastThreadDumpState.cpp

frameworks/av/services/audioflinger/FastThreadDumpState.h

frameworks/av/services/audioflinger/FastThreadState.cpp

frameworks/av/services/audioflinger/FastThreadState.h

FastThread的定义:

class FastThread : public Thread {}

Threads

回放线程和录制线程类;回放线程从 FIFO 读取回放数据并混音处理,然后写数据到输出流设备;录制线程从输入流设备读取录音数据并重采样处理,然后写数据到 FIFO。

Threads代码位于:

frameworks/av/services/audioflinger/Threads.cpp

frameworks/av/services/audioflinger/Threads.h

frameworks/av/services/audioflinger/ThreadMetrics .h

Threads的定义:

class ThreadBase : public Thread {}
class PlaybackThread : public ThreadBase, public StreamOutHalInterfaceCallback,
                       public VolumeInterface, public StreamOutHalInterfaceEventCallback {} //播放线程
class RecordThread : public ThreadBase {} //录制线程
class MixerThread : public PlaybackThread {}
class DirectOutputThread : public PlaybackThread {}
class OffloadThread : public DirectOutputThread {}
class AsyncCallbackThread : public Thread {}
class DuplicatingThread : public MixerThread {}
class SpatializerThread : public MixerThread {}
class MmapThread : public ThreadBase {}
class MmapPlaybackThread : public MmapThread, public VolumeInterface {}
class MmapCaptureThread : public MmapThread {}
class ThreadMetrics final {}
class VolumeInterface {}

Tracks

Tracks是AudioFlinger中用于音频流管理类,可控制音频流的状态,如 start、stop、pause。

Tracks代码位于:

frameworks/av/services/audioflinger/Tracks.cpp

frameworks/av/services/audioflinger/TrackBase.h

frameworks/av/services/audioflinger/TrackMetrics.h

frameworks/av/services/audioflinger/PlaybackTracks.h

frameworks/av/services/audioflinger/RecordTracks.h

frameworks/av/services/audioflinger/MmapTracks.h

Tracks的定义:

class TrackBase : public ExtendedAudioBufferProvider, public RefBase {}
class Track : public TrackBase, public VolumeProvider {} //播放流
class RecordTrack : public TrackBase {} //录制流
class PatchProxyBufferProvider {}
class PatchTrackBase : public PatchProxyBufferProvider {}
class TrackMetrics final {}
class OpPlayAudioMonitor : public RefBase {}
class OutputTrack : public Track {}
class PatchTrack : public Track, public PatchTrackBase {}
class PatchRecord : public RecordTrack, public PatchTrackBase {}
class PassthruPatchRecord : public PatchRecord, public Source {}

Effects

Effects是AudioFlinger中用于音效处理类。

Effects代码位于:

frameworks/av/services/audioflinger/Effects.cpp

frameworks/av/services/audioflinger/Effects.h

Effects的定义:

class EffectCallbackInterface : public RefBase {}
class EffectBase : public RefBase {}
class EffectModule : public EffectBase {}
class EffectHandle: public android::media::BnEffect {}
class EffectChain : public RefBase {}
class DeviceEffectProxy : public EffectBase {}

StateQueue

AudioFlinger 中的模块,负责同步线程之间的状态。

Effects代码位于:

frameworks/av/services/audioflinger/StateQueue.cpp

frameworks/av/services/audioflinger/StateQueueInstantiations.cpp

frameworks/av/services/audioflinger/StateQueue.h

Effects的定义:

template<typename T> class StateQueue {}

三、AudioFlinger线程

AndioFlinger 作为 Android 的音频系统引擎,重任之一是负责输入输出流设备的管理及音频流数据的处理传输,这是由回放线程(PlaybackThread 及其派生的子类)和录制线程(RecordThread)进行的,

我们简单看看回放线程和录制线程类关系:

AsyncCallbackThread :class AsyncCallbackThread : public Thread {} ,继承自 Thread,用于回调相关。

ThreadBase:class ThreadBase : public Thread {},PlaybackThread 和 RecordThread 的基类。

MmapThread:class MmapThread : public ThreadBase {},映射线程类,AAudio使用。

MmapPlaybackThread:class MmapPlaybackThread : public MmapThread, public VolumeInterface {}

MmapCaptureThread:class MmapCaptureThread : public MmapThread {}

RecordThread:class RecordThread : public ThreadBase {} ,录制线程类,由 ThreadBase 派生,在threadLoop中循环从AudioHAL读取数据。

PlaybackThread:class PlaybackThread : public ThreadBase, public StreamOutHalInterfaceCallback, public VolumeInterface, public StreamOutHalInterfaceEventCallback {} ,回放线程基类,同由 ThreadBase 派生,,在threadLoop中循环发送数据给AudioHAL。

MixerThread:class MixerThread : public PlaybackThread {},混音回放线程类,由 PlaybackThread 派生,负责处理标识为 AUDIO_OUTPUT_FLAG_PRIMARY、AUDIO_OUTPUT_FLAG_FAST、AUDIO_OUTPUT_FLAG_DEEP_BUFFER 的音频流,MixerThread 可以把多个音轨的数据混音后再输出。

SpatializerThread:class SpatializerThread : public MixerThread {}

DirectOutputThread:class DirectOutputThread : public PlaybackThread {},直输回放线程类,由 PlaybackThread 派生,负责处理标识为 AUDIO_OUTPUT_FLAG_DIRECT 的音频流,这种音频流数据不需要软件混音,直接输出到音频设备即可。

DuplicatingThread:class DuplicatingThread : public MixerThread {},复制回放线程类,由 MixerThread 派生,负责复制音频流数据到其他输出设备,使用场景如主声卡设备、蓝牙耳机设备、USB 声卡设备同时输出。

OffloadThread:class OffloadThread : public DirectOutputThread {},硬解回放线程类,由 DirectOutputThread 派生,负责处理标识为 AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD 的音频流,这种音频流未经软件解码的(一般是 MP3、AAC 等格式的数据),需要输出到硬件解码器,由硬件解码器解码成 PCM 数据。

1、PlaybackThread

PlaybackThread最常用的几个接口

//frameworks/av/services/audioflinger/Threads.cpp

  • AudioFlinger::PlaybackThread::PlaybackThread:构造函数

  • AudioFlinger::PlaybackThread::createTrack_l:创建Track

  • AudioFlinger::PlaybackThread::threadLoop():thread处理循环

//frameworks/av/services/audioflinger/Tracks.cpp

  • AudioFlinger::PlaybackThread::Track::start:开始播放:把该 Track 置 ACTIVE 状态,然后添加到 mActiveTracks 向量中,最后调用 AudioFlinger::PlaybackThread::broadcast_l() 告知 PlaybackThread 情况有变

  • AudioFlinger::PlaybackThread::Track::stop:停止播放:把该 Track 置 STOPPED 状态,最后调用 AudioFlinger::PlaybackThread::broadcast_l() 告知 PlaybackThread 情况有变

  • AudioFlinger::PlaybackThread::Track::pause:暂停播放:把该 Track 置 PAUSING 状态,最后调用 AudioFlinger::PlaybackThread::broadcast_l() 告知 PlaybackThread 情况有变

PlaybackThread与AudioTrack、声卡的对应关系

假设系统中有两个声卡,每个声卡有输入,输出功能,对于他的输出功能,我们称为输出通道output,AudioFlinger中有一个PlaybackThread与他对应。应用程序想要播放声音的时候,创建一个AudioTrack,同时指定声音的类型,AudioFlinger会根据这个声音的类型,找到对应的声卡,再找到对应的PlaybackThread播放线程,然后在PlaybackThread中创建一个Track,这个Track与AudioTrack对应,他们之间通过共享内存传递数据,PlaybackThread播放声音的时候,会查询内部的一个或者多个Track,取出里面的数据混合在一起发送给声卡。

对个APP对应AudioFlinger中的一个PlaybackThread,APP需要播放声音时,传递给PlaybackThread,PlaybackThread混合之后进行播放。这样就不存在多个APP竞争一个输出通道的问题。

2、RecordThread

PlaybackThread最常用的几个接口:

//frameworks/av/services/audioflinger/Threads.cpp

  • AudioFlinger::RecordThread::RecordThread:构造函数

  • AudioFlinger::RecordThread::createRecordTrack_l:创建Record Track

  • AudioFlinger::RecordThread::threadLoop:thread处理循环

  • AudioFlinger::RecordThread::start:开始录制:把该 Track 置 ACTIVE 状态,然后添加到 mActiveTracks 向量中,最后调用 mWaitWorkCV.broadcast(); 告知 PlaybackThread 情况有变

  • AudioFlinger::RecordThread::stop:停止录制:把该 Track 置 STOPPED 状态,最后调用 mWaitWorkCV.broadcast(); 告知 PlaybackThread 情况有变。

四、AudioFlinger与相关组件的交互

1、AudioFlinger与app(AudioTrack\AudioRecord)的交互

AudioFlinger是一个binder服务,app中的native层可以通过获取其binder服务从而进行交互,通过AudioSystem的get_audio_flinger客户获取到IAudioFlinger接口,代码如下:

const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger();
record = audioFlinger->createRecord(input, output, &status);

App和AudioFlinger间音频数据则通过共享内存的方式进行传输。

如下图AudioTrack的数据传输:

如下图AudioRecord的数据传输:

2、AudioFlinger与AudioHAL交互

AudioFlinger通过hidl接口的方式调用hal层服务。启动AudioPolicyService时,会加载音频配置文件,然后根据配置加载HAL module。后续可以调用hal接口进行其他交互(设备选择、通路、读写数据等)。

AudioPolicyService并不直接于Hal层交互,而是由AudioFlinger和Hal通信,这里看看AudioFlinger加载音频模块。

AudioFlinger与AudioHAL交互的代码为://frameworks/av/media/libaudiohal/impl/DeviceHalHidl.cpp

3、AudioFlinger与AudioPolicyService交互

AudioFlinger与AudioPolicyService交互是通过AudioSystem,例如调用getOutputForAttr获取输出设备。

五、AudioFlinger服务启动

AudioFlinger 在系统启动时由 audioserver 加载:

//frameworks/av/media/audioserver/main_audioserver.cpp
int main(int argc __unused, char **argv)
{
    // ......
        android::hardware::configureRpcThreadpool(4, false /*callerWillJoin*/);
        sp<ProcessState> proc(ProcessState::self());
        sp<IServiceManager> sm = defaultServiceManager();
        ALOGI("ServiceManager: %p", sm.get());
        AudioFlinger::instantiate(); //加载AudioFlinger
        AudioPolicyService::instantiate();


        // AAudioService should only be used in OC-MR1 and later.
        // And only enable the AAudioService if the system MMAP policy explicitly allows it.
        // This prevents a client from misusing AAudioService when it is not supported.
        // If we cannot get audio flinger here, there must be some serious problems. In that case,
        // attempting to call audio flinger on a null pointer could make the process crash
        // and attract attentions.
        sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
        std::vector<AudioMMapPolicyInfo> policyInfos;
        status_t status = af->getMmapPolicyInfos(
                AudioMMapPolicyType::DEFAULT, &policyInfos);
        // Initialize aaudio service when querying mmap policy succeeds and
        // any of the policy supports MMAP.
        if (status == NO_ERROR &&
            std::any_of(policyInfos.begin(), policyInfos.end(), [](const auto& info) {
                    return info.mmapPolicy == AudioMMapPolicy::AUTO ||
                           info.mmapPolicy == AudioMMapPolicy::ALWAYS;
            })) {
            AAudioService::instantiate();
        } else {
            ALOGD("Do not init aaudio service, status %d, policy info size %zu",
                  status, policyInfos.size());
        }


        ProcessState::self()->startThreadPool();
        IPCThreadState::self()->joinThreadPool();
}

AudioFlinger 服务启动后,其他进程可以通过 ServiceManager 来获取其代理对象 IAudioFlinger,通过 IAudioFlinger 可以向 AudioFlinger 发出各种服务请求,从而完成自己的音频业务。

  • 29
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值