一、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 发出各种服务请求,从而完成自己的音频业务。