此文章部分参考 https://blog.youkuaiyun.com/marshal_zsx/article/details/81060100
AudioPolicyService是策略的制定者,
AudioFlinger是策略的执行者,
所以: AudioPolicyService根据配置文件使唤AudioFlinger来创建Thread
管理输入输出设备,包括设备的连接、断开状态,设备的选择和切换等
管理系统的音频策略,比如通话时播放音乐、或者播放音乐时来电话的一系列处理
管理系统的音量
上层的一些音频参数也可以通过AudioPolicyService设置到底层去
godv@godv-OptiPlex-7070:/dev/snd$ ls -la
总用量 0
drwxr-xr-x 3 root root 320 7月 1 21:26 .
drwxr-xr-x 21 root root 4320 7月 1 21:41 ..
drwxr-xr-x 2 root root 60 7月 1 21:26 by-path
crw-rw----+ 1 root audio 116, 2 7月 1 21:26 controlC0
crw-rw----+ 1 root audio 116, 11 7月 1 21:26 hwC0D0
crw-rw----+ 1 root audio 116, 12 7月 1 21:26 hwC0D2
crw-rw----+ 1 root audio 116, 4 7月 1 21:26 pcmC0D0c
crw-rw----+ 1 root audio 116, 3 7月 1 21:39 pcmC0D0p
crw-rw----+ 1 root audio 116, 10 7月 1 21:26 pcmC0D10p
crw-rw----+ 1 root audio 116, 5 7月 1 21:26 pcmC0D2c
crw-rw----+ 1 root audio 116, 6 7月 1 21:26 pcmC0D3p
crw-rw----+ 1 root audio 116, 7 7月 1 21:26 pcmC0D7p
crw-rw----+ 1 root audio 116, 8 7月 1 21:26 pcmC0D8p
crw-rw----+ 1 root audio 116, 9 7月 1 21:26 pcmC0D9p
crw-rw----+ 1 root audio 116, 1 7月 1 21:26 seq
crw-rw----+ 1 root audio 116, 33 7月 1 21:26 timer
默认声卡 & 声卡上存在何种硬件资源(耳机孔/喇叭) 厂家通过配置文件声明
1.读取、解析配置文件
2.AudioPolicyService根据配置文件调用AudioFlinger服务创建线程,打开output
audioserver.rc frameworks/av/media/audioserver/audioserver.rc
service audioserver /system/bin/audioserver
class main
user audioserver
# media gid needed for /dev/fm (radio) and for /data/misc/media (tee)
group audio camera drmrpc inet media mediadrm net_bt net_bt_admin net_bw_acct
ioprio rt 4
writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks
onrestart restart audio-hal-2-0
on property:vts.native_server.on=1
stop audioserver
on property:vts.native_server.on=0
start audioserver
main_audioserver.cpp frameworks/av/media/audioserver/main_audioserver.cpp
int main(int argc __unused, char **argv)
{
signal(SIGPIPE, SIG_IGN);
...
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
ALOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate();
AudioPolicyService::instantiate();
...
SoundTriggerHwService::instantiate();
ProcessState::self()->startThreadPool();
// FIXME: remove when BUG 31748996 is fixed
android::hardware::ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
}
frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp
void AudioPolicyService::onFirstRef()
{
{
Mutex::Autolock _l(mLock);
// start tone playback thread
mTonePlaybackThread = new AudioCommandThread(String8("ApmTone"), this);
// start audio commands thread
mAudioCommandThread = new AudioCommandThread(String8("ApmAudio"), this);
// start output activity command thread
mOutputCommandThread = new AudioCommandThread(String8("ApmOutput"), this);
mAudioPolicyClient = new AudioPolicyClient(this);
mAudioPolicyManager = createAudioPolicyManager(mAudioPolicyClient);
}
// load audio processing modules
sp<AudioPolicyEffects>audioPolicyEffects = new AudioPolicyEffects();
{
Mutex::Autolock _l(mLock);
mAudioPolicyEffects = audioPolicyEffects;
}
}
frameworks/av/services/audiopolicy/service/AudioPolicyService.h
class AudioPolicyClient : public AudioPolicyClientInterface
{
...
private:
AudioPolicyService *mAudioPolicyService;
};
AudioPolicyClient的实现文件frameworks/av/services/audiopolicy/service/AudioPolicyClientImpl.cpp
createAudioPolicyManager frameworks/av/services/audiopolicy/AudioPolicyInterface.h
// Audio Policy client Interface
class AudioPolicyClientInterface
{
...
extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface);
extern "C" void destroyAudi

最低0.47元/天 解锁文章
1383





