Android 7.0 Audio: AudioFlinger介绍和初始

本文详细解析了Android N版本中AudioFlinger组件的工作原理,包括启动流程、线程模型及内部服务交互机制。通过深入研究AudioFlinger的实例化过程、线程管理以及与系统其他组件的互动方式,帮助读者理解Android音频系统的架构。

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

对于AF的分析,先看其所在层的位置以及相关的交互类,

 

 

 

之前的版本,AF在Main_MediaServer.cpp里面启动,在android N,AF在main_audioserver.cpp里面启动,

   ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    

      ALOGI("ServiceManager: %p", sm.get());

        AudioFlinger::instantiate();

        AudioPolicyService::instantiate();

        RadioService::instantiate();

        SoundTriggerHwService::instantiate(); .

        ProcessState::self()->startThreadPool();

        IPCThreadState::self()->joinThreadPool();

 

 

在android N, audioserver进程的启动也发生了一些变化,

init.zygote64.rc

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server

    class main

    socket zygote stream 660 root system

    onrestart write /sys/android_power/request_state wake

    onrestart write /sys/power/state on

    onrestart restart audioserver

    onrestart restart cameraserver

    onrestart restart media

    onrestart restart netd.

    writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks.

 

init.target.rc

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

service audiod /system/bin/audiod

   class late_start

   user system

   group system .

 

在AudioFlinger.cpp的类创建过程中,AudioFlinger::instantiate()函数实例化AudioFlinger,instantiate在其父类BinderService里实现(frameworks/base/include/binder/BinderService.h头文件中),这里可以看到它被添加到系统服务里面了,之后,就存在一个AF的类实例,可以通过系统服务的方式被访问,再之后onFirstRef会被执行。

 

构造函数和onFirstRef里面没有创建和关联太多相关类,只创建了PatchPanel,

 

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void AudioFlinger::onFirstRef()

{

    mPatchPanel = new PatchPanel(this);

 

    mMode = AUDIO_MODE_NORMAL;

}                                                                              .

 

 

在AF内部,由于和他交互的模块较多,所以实现了不同的服务端、客户端,为了达到实现不同功能的目的,其本身还维护多个线程。

 

 

关于内部线程方面,各线程的关系如下,

 

这些线程实现在\frameworks\av\services\audioflinger\ Threads.cpp ,主要的实现在PlaybackThread,在我们前面分析AT的时候,会在AF的openOutput_l里面new一个PlaybackThread(或其子类),这样就创建了线程实例,然后在其onFirstRef里启动线程,

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void AudioFlinger::PlaybackThread::onFirstRef()

{

    run(mThreadName, ANDROID_PRIORITY_URGENT_AUDIO);.

}

 

线程的Looper为boolAudioFlinger::PlaybackThread::threadLoop(),这个函数很大,不展开分析,简单说就是它负责处理播放过程,相应相关事件,收到外部通知或播放结束就结束线程。

 

AudioFlinger::RecordThread::RecordThread为输入线程,也不展开分析了。

 

 

 

 

线程的上下交互关系如下,

 

对于输出部分,可以看到针对不同的OUTPUT FLAG,在AF和HAL层有不同的Thread来进行播放。

 

对于音量控制,其框图如下

 

 

 

输入部分,则为

 

 

01-18 16:50:07.926 222 222 I AudioFlinger: Using default 3000 mSec as standby time. 01-18 16:50:07.942 222 222 D AudioHardwareTiny: ALSA Audio Version: V1.1.0 01-18 16:50:07.942 222 222 D alsa_route: Can not get config table for sound card0 dummysound, so get default config table. 01-18 16:50:07.942 222 222 D AudioHardwareTiny: read_snd_card_info buf0 = dummysound 01-18 16:50:07.942 222 222 D AudioHardwareTiny: read_snd_card_info buf1 = ROCKCHIPSPDIF 01-18 16:50:07.942 222 222 D AudioHardwareTiny: read_snd_card_info buf2 = rkhdmispdif 01-18 16:50:07.942 222 222 D AudioHardwareTiny: now is 2 snd card mode 01-18 16:50:07.942 222 222 I AudioFlinger: loadHwModule() Loaded primary audio interface from Manta audio HW HAL (audio) handle 10 01-18 16:50:07.942 222 222 I AudioFlinger: openOutput(), module 10 Device 2, SamplingRate 48000, Format 0x000001, Channels 3, flags 2 01-18 16:50:07.942 222 222 D AudioHardwareTiny: audio hal adev_open_output_stream devices = 0x2, flags = 2, samplerate = 48000 01-18 16:50:07.942 222 222 D AudioHardwareTiny: out->config.rate = 48000, out->config.channels = 2 out->config.format = 0,out->config.flag = 0 01-18 16:50:07.943 222 222 I AudioFlinger: HAL output buffer size 512 frames, normal sink buffer size 1024 frames 01-18 16:50:07.978 222 222 I AudioFlinger: Using module 10 has the primary audio interface 01-18 16:50:07.978 222 222 D AudioHardwareTiny: adev_set_mode: set_mode = 0 01-18 16:50:07.986 222 252 I AudioFlinger: AudioFlinger's thread 0xb2103f80 ready to run 01-18 16:50:07.986 222 252 D AudioHardwareTiny: out_set_parameters: kvpairs = routing=2 01-18 16:50:07.988 222 252 W AudioFlinger: no wake lock to update, system not ready yet 01-18 16:50:07.991 222 254 I AudioFlinger: AudioFlinger's thread 0xb1d83b00 ready to run 01-18 16:50:07.996 222 222 I AudioFlinger: loadHwModule() Loaded a2dp audio interface from A2DP Audio HW HAL (audio) handle 18 01-18 16:50:08.007 222 222 I AudioFlinger: loadHwModule() Loaded usb audio interface from USB audio HW HAL (audio) handle 26 01-18 16:50:08.009 222 222 I r_submix: adev_open(name=audio_hw_if) 01-18 16:50:08.009 222 222 I AudioFlinger: loadHwModule() Loaded r_submix audio interface from Wifi Display audio HAL (audio) handle 34 01-18 16:50:08.012 222 256 I AudioFlinger: AudioFlinger's thread 0xb1c83bc0 ready to run 01-18 16:50:10.057 222 252 W AudioFlinger: no wake lock to update, system not ready yet 01-18 16:50:10.057 222 252 D AudioHardwareTiny: start_output_stream 01-18 16:50:10.066 222 252 D alsa_route: route_info->sound_card 0, route_info->devices 0 01-18 16:50:10.066 222 252 D alsa_route: route_set_controls() set route 0 01-18 16:50:17.994 222 252 D AudioHardwareTiny: out_set_parameters: kvpairs = routing=2 01-18 16:50:18.015 222 252 D AudioHardwareTiny: out_set_parameters: kvpairs = routing=2 01-18 16:50:18.036 222 252 D AudioHardwareTiny: out_set_parameters: kvpairs = routing=2 01-18 16:50:18.049 222 258 D AudioHardwareTiny: adev_set_parameters: kvpairs = orientation=undefined 01-18 16:50:18.615 222 258 D AudioHardwareTiny: adev_set_parameters: kvpairs = slice-weakly 01-18 16:50:18.694 222 258 D AudioHardwareTiny: adev_set_parameters: kvpairs = A2dpSuspended=false 01-18 16:50:18.725 222 258 I AudioFlinger: systemReady 01-18 16:50:19.041 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4096) from active list on thread 0xb2103f80 01-18 16:50:19.042 222 252 E AudioFlinger: no wake lock to update, but system ready! 01-18 16:50:20.188 222 252 E AudioFlinger: no wake lock to update, but system ready! 01-18 16:50:20.660 222 252 D AudioHardwareTiny: out_set_parameters: kvpairs = routing=2 01-18 16:50:20.693 222 252 D AudioHardwareTiny: out_set_parameters: kvpairs = routing=2 01-18 16:50:20.713 222 252 D AudioHardwareTiny: out_set_parameters: kvpairs = routing=2 01-18 16:50:20.725 222 252 D AudioHardwareTiny: out_set_parameters: kvpairs = routing=2 01-18 16:50:20.730 222 222 I AudioFlinger: openOutput(), module 10 Device 400, SamplingRate 44100, Format 0x000001, Channels 3, flags 1 01-18 16:50:20.730 222 222 D AudioHardwareTiny: audio hal adev_open_output_stream devices = 0x400, flags = 1, samplerate = 44100 01-18 16:50:20.730 222 222 D AudioHardwareTiny: Not any bitstream mode! 01-18 16:50:20.730 222 222 D AudioHardwareTiny: out->config.rate = 0, out->config.channels = 0 out->config.format = 0,out->config.flag = 0 01-18 16:50:20.731 222 247 D AudioHardwareTiny: adev_set_parameters: kvpairs = connect=1024 01-18 16:50:20.960 222 252 D AudioHardwareTiny: out_set_parameters: kvpairs = routing=1024 01-18 16:50:20.961 222 252 D alsa_route: route_set_controls() set route 24 01-18 16:50:20.961 222 252 D AudioHardwareTiny: close device 01-18 16:50:20.961 222 251 D AudioHardwareTiny: start_output_stream 01-18 16:50:20.962 222 251 D alsa_route: route_info->sound_card 1, route_info->devices 0 01-18 16:50:21.546 222 252 E AudioFlinger: no wake lock to update, but system ready! 01-18 16:50:21.699 222 222 D AudioHardwareTiny: adev_set_parameters: kvpairs = A2dpSuspended=false 01-18 16:50:24.442 222 252 D alsa_route: route_set_controls() set route 24 01-18 16:50:24.442 222 252 D AudioHardwareTiny: close device 08-11 18:17:32.263 222 252 D AudioHardwareTiny: start_output_stream 08-11 18:17:32.268 222 252 D alsa_route: route_info->sound_card 1, route_info->devices 0 08-11 18:17:36.463 222 252 D alsa_route: route_set_controls() set route 24 08-11 18:17:36.463 222 252 D AudioHardwareTiny: close device 08-11 18:17:39.677 222 1368 I AudioFlinger: AudioFlinger's thread 0xb1603a80 ready to run 08-11 18:17:39.692 222 1367 D AudioHardwareTiny: Device : 0x0 08-11 18:17:39.692 222 1367 D AudioHardwareTiny: SampleRate : 0 08-11 18:17:39.692 222 1367 D AudioHardwareTiny: Channels : 4 08-11 18:17:39.692 222 1367 D AudioHardwareTiny: Formate : 0 08-11 18:17:39.692 222 1367 D AudioHardwareTiny: PreiodSize : 0 08-11 18:17:39.692 222 1367 E AudioHardwareTiny: getInputRouteFromDevice:device:80000004 08-11 18:17:39.692 222 1367 D alsa_route: route_info->sound_card 0, route_info->devices 0 08-11 18:17:39.692 222 1367 D alsa_route: route_set_controls() set route 21 08-11 18:17:42.028 222 252 D AudioHardwareTiny: start_output_stream 08-11 18:17:42.029 222 252 D alsa_route: route_info->sound_card 1, route_info->devices 0 08-11 18:20:27.951 222 252 D AudioFlinger: mixer(0xb2103f80) throttle end: throttle time(6) 08-11 18:25:51.990 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 18:27:16.399 222 252 D AudioFlinger: mixer(0xb2103f80) throttle end: throttle time(7) 08-11 18:28:45.387 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 18:31:38.721 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 18:34:32.031 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 18:35:31.548 222 252 D AudioFlinger: mixer(0xb2103f80) throttle end: throttle time(1) 08-11 18:37:25.300 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 18:38:53.382 222 252 D AudioFlinger: mixer(0xb2103f80) throttle end: throttle time(1) 08-11 18:40:18.677 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 18:43:12.054 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 18:44:34.010 222 252 D AudioFlinger: mixer(0xb2103f80) throttle end: throttle time(10) 08-11 18:44:34.266 222 252 D AudioFlinger: mixer(0xb2103f80) throttle end: throttle time(4) 08-11 18:46:05.388 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 18:48:58.851 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 18:51:46.265 222 252 D AudioFlinger: mixer(0xb2103f80) throttle end: throttle time(1) 08-11 18:51:52.159 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 18:54:27.738 222 252 D AudioFlinger: mixer(0xb2103f80) throttle end: throttle time(5) 08-11 18:54:45.471 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 18:55:08.676 222 252 D AudioFlinger: mixer(0xb2103f80) throttle end: throttle time(2) 08-11 18:57:38.954 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 18:57:40.018 222 252 D AudioFlinger: mixer(0xb2103f80) throttle end: throttle time(13) 08-11 18:57:40.231 222 252 D AudioFlinger: mixer(0xb2103f80) throttle end: throttle time(2) 08-11 19:00:32.395 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 19:03:25.814 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 19:06:19.424 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 19:13:06.054 222 252 D AudioFlinger: mixer(0xb2103f80) throttle end: throttle time(2) 08-11 19:15:50.475 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 19:16:10.587 222 252 D AudioFlinger: mixer(0xb2103f80) throttle end: throttle time(3) 08-11 19:18:43.745 222 252 I AudioFlinger: BUFFER TIMEOUT: remove(4097) from active list on thread 0xb2103f80 08-11 19:24:32.987 222 252 D AudioFlinger: mixer(0xb2103f80) throttle end: throttle time(4) 08-11 19:29:59.697 222 252 D alsa_route: route_set_controls() set route 24 08-11 19:29:59.698 222 252 D AudioHardwareTiny: close device 08-11 19:34:14.303 222 252 D AudioHardwareTiny: start_output_stream 08-11 19:34:14.303 222 252 D alsa_route: route_info->sound_card 1, route_info->devices 0 08-11 19:34:30.498 222 1368 E AudioFlinger: read failed: framesRead=-2147483631 08-11 19:34:30.501 222 1368 D alsa_route: route_set_controls() set route 25 08-11 19:34:30.514 222 1367 D AudioHardwareTiny: Device : 0x0 08-11 19:34:30.514 222 1368 E AudioFlinger: read failed: framesRead=-2147483631 08-11 19:34:30.514 222 1367 D AudioHardwareTiny: SampleRate : 851968 08-11 19:34:30.514 222 1367 D AudioHardwareTiny: Channels : 4 08-11 19:34:30.514 222 1367 D AudioHardwareTiny: Formate : 0 08-11 19:34:30.514 222 1367 D AudioHardwareTiny: PreiodSize : 4800 08-11 19:34:30.514 222 1367 E AudioHardwareTiny: getInputRouteFromDevice:device:80000004 08-11 19:34:30.514 222 1367 D alsa_route: route_info->sound_card 0, route_info->devices 0 08-11 19:34:30.514 222 1367 D alsa_route: route_set_controls() set route 21 08-11 19:34:30.522 222 1368 D alsa_route: route_set_controls() set route 25 08-11 19:34:30.533 222 1367 D AudioHardwareTiny: Device : 0x0 08-11 19:34:30.533 222 1368 E AudioFlinger: read failed: framesRead=-2147483631 08-11 19:34:30.533 222 1367 D AudioHardwareTiny: SampleRate : 851968 08-11 19:34:30.533 222 1367 D AudioHardwareTiny: Channels : 4 08-11 19:34:30.533 222 1367 D AudioHardwareTiny: Formate : 0 08-11 19:34:30.533 222 1367 D AudioHardwareTiny: PreiodSize : 4800 分析下这段日志,错误原因
最新发布
08-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值