AudioFlinger服务

源码文件

AudioFlinger:
AudioFlinger.cpp    (frameworks/av/services/audioflinger/AudioFlinger.cpp)
Threads.cpp         (frameworks/av/services/audioflinger/Threads.cpp)
Tracks.cpp          (frameworks/av/services/audioflinger/Thracks.cpp)
audio_hw_hal.cpp    (hardware/libhardware_legacy/audio/audio_hw_hal.cpp)
AudioHardware.cpp   (device/friendly-arm/common/libaudio/AudioHardware.cpp)
AudioPolicyService:
AudioPolicyService.cpp (frameworks/av/services/audiopolicy/AudioPolicyService.cpp)
AudioPolicyClientImpl.cpp (frameworks/av/services/audiopolicy/AudioPolicyClientImpl.cpp)
AudioPolicyInterfaceImpl.cpp (frameworks/av/services/audiopolicy/AudioPolicyInterfaceImpl.cpp)
AudioPolicyManager.cpp  (device/friendly-arm/common/libaudio/AudioPolicyManager.cpp)
AudioPolicyManager.h    (device/friendly-arm/common/libaudio/AudioPolicyManager.h)
AudioPolicyManagerBase.cpp  (hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp)
应用程序APP所用文件
AudioTrack.java (frameworks/base/media/java/android/media/AudioTrack.java)
android_media_AudioTrack.cpp (frameworks/base/core/jni/android_media_AudioTrack.cpp)
AudioTrack.cpp  (framework/av/media/libmedia/AudioTrack.cpp)
AudioSystem.cpp (framework/av/media/libmedia/AudioSystem.cpp)

AudioFlinger启动过程

a. 注册AudioFlinger服务
b. 被AudioPolicyService调用打开厂家提供的so文件
1)
2)
3) 对硬件的封装
AudioFlinger : AudioHwDevice(放入mAudioHwDevs数组中)
audio_hw_hal.cpp : audio_hw_device
厂家 : AudioHardware(派生自: AudioHardwareInterface)
AudioHwDevice是对audio_hw_device的封装,
audio_hw_device中函数的实现要通过AudioHardware类对象。

c. 打开对应的output

调用过程

90 class AudioFlinger :                                                            
 91     public BinderService<AudioFlinger>,                                         
 92     public BnAudioFlinger

说明:AudioFlinger类继承与BinderService类。

 34 class BinderService                                                             
 35 {                                                                               
 36 public:                                                                         
 37     static status_t publish(bool allowIsolated = false) {                       
 38         sp<IServiceManager> sm(defaultServiceManager());                        
 39         return sm->addService(                                                  
 40                 String16(SERVICE::getServiceName()),                            
 41                 new SERVICE(), allowIsolated);                                  
 42     }                                                                           
 43                                                                                 
 44     static void publishAndJoinThreadPool(bool allowIsolated = false) {          
 45         publish(allowIsolated);                                                 
 46         joinThreadPool();                                                       
 47     }                                                                           
 48                                                                                 
 49     static void instantiate() { publish(); } 
 ..
 }

说明:
1)49行中instantiate函数中调用publish函数。

总结:
在frameworks/av/media/mediaserver/main_mediaserver.cpp中
AudioFlinger::instantiate();—>BinderService::instantiate()–>publish–>
BinderService调用函数sm->addService(“media_audio_flinger”,new AudioFlinger())

so名字

名字从/system/etc/audio_policy.conf得到: primary
所以so文件就是:audio.primary.XXX.so
从/system/lib/hw文件夹中得知:
audio.primary.tiny4412.so

so需要哪些源文件

查看device/friendly-arm/common/libaudio/Android.mk
audio.primary.$(TARGET_DEVICE) : device/friendly-arm/common/libaudio/AudioHardware.cpp
libhardware_legacy
libhardware_legacy : hardware/libhardware_legacy/audio/audio_hw_hal.cpp

怎么加载

  1. 先把配置文件中的module保存到mHwModules数组
    函数loadHwModule:
4198 void AudioPolicyManagerBase::loadHwModule(cnode *root)                          
4199 {                                                                               
4200     cnode *node = config_find(root, OUTPUTS_TAG);       //首先找到outputs                    
4201     status_t status = NAME_NOT_FOUND;                                           
4202                                                                                 
4203     HwModule *module = new HwModule(root->name);  
...
4237         mHwModules.add(module);
...

4203行创建一个HwModule,里面包含module的名字,然后在4237行把这个HwModule添加到mHwModules数组里。

  1. 然后循环mHwMoudules数组中的module来加载module
1567     for (size_t i = 0; i < mHwModules.size(); i++) {                            
1568         mHwModules[i]->mHandle = mpClientInterface->loadHwModule(mHwModules[i]->mName);
1569         if (mHwModules[i]->mHandle == 0) {                                      
1570             ALOGW("could not open HW module %s", mHwModules[i]->mName);         
1571             continue;                                                                                    
1572         }  
}

在1568行中,调用audioflinger中的loadHwModule来加载module。

3 AudioFlinger中的loadHwModule函数

1479 audio_module_handle_t AudioFlinger::loadHwModule(const char *name)              
1480 {                                                                               
1481     if (name == NULL) {                                                         
1482         return 0;                                                               
1483     }                                                                           
1484     if (!settingsAllowed()) {                                                   
1485         return 0;                                                               
1486     }                                                                           
1487     Mutex::Autolock _l(mLock);                                                  
1488     return loadHwModule_l(name);                                                
1489 }                 

在1488行调用loadHwModule_l,这个时候name是primary。
3. loadHwModule_l函数

1492 audio_module_handle_t AudioFlinger::loadHwModule_l(const char *name)            
1493 {                                                                               
1494     for (size_t i = 0; i < mAudioHwDevs.size(); i++) {                          
1495         if (strncmp(mAudioHwDevs.valueAt(i)->moduleName(), name, strlen(name)) == 0) {
1496             ALOGW("loadHwModule() module %s already loaded", name);             
1497             return mAudioHwDevs.keyAt(i);                                       
1498         }                                                                       
1499     }                                                                           
1500                                                                                 
1501     audio_hw_device_t *dev;                                                     
1502                                                                                 
1503     int rc = load_audio_interface(name, &dev);  
....
}

在1503行调用load_audio_interface的name。

  1. load_audio_interface函数
 138 static int load_audio_interface(const char *if_name, audio_hw_device_t **dev)   
 139 {                                                                               
 140     const hw_module_t *mod;                                                     
 141     int rc;                                                                     
 142                                                                                 
 143     rc = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, if_name, &mod); 
...
}

在143行中,使用函数hw_get_module_by_class,因为AUDIO_HARDWARE_MODULE_ID=audio if_name=primary

  1. hw_get_module_by_class
    在hardware/libhardware/hardware.c中的定义如下:
145 int hw_get_module_by_class(const char *class_id, const char *inst,                                                                         
146                            const struct hw_module_t **module)                   
147 {                                                                               
148     int i;                                                                      
149     char prop[PATH_MAX];                                                        
150     char path[PATH_MAX];                                                        
151     char name[PATH_MAX];                                                        
152     char prop_name[PATH_MAX];                                                   
153                                                                                 
154     if (inst)                                                                   
155         snprintf(name, PATH_MAX, "%s.%s", class_id, inst);                      
156     else                                                                        
157         strlcpy(name, class_id, PATH_MAX);                                      
158                                                                                 
159     /*                                                                          
160      * Here we rely on the fact that calling dlopen multiple times on           
161      * the same .so will simply increment a refcount (and not load              
162      * a new copy of the library).                                              
163      * We also assume that dlopen() is thread-safe.                             
164      */                                                                         
165                                                                                 
166     /* First try a property specific to the class and possibly instance */      
167     snprintf(prop_name, sizeof(prop_name), "ro.hardware.%s", name);

getprop ro.hardware命令,输出: tiny4412。
getprop命令使用

现在知道了so文件名: audio.primary.tiny4412.so了。

硬件封装

AudioFlinger.cpp : AudioHwDevice
audio_hw_hal.cpp: audio_hw_device
AudioHardware.cpp : AudioHardware
1)AudioHwDevice含有audio_hw_device
2)audio_hw_device使用AudioHardware提供的函数

问题1: audioflinger怎么调用audio_hw_hal函数,audio_hw_hal怎么调用audio_hw_device也就是厂家提供的so文件?

1491 // loadHwModule_l() must be called with AudioFlinger::mLock held                
1492 audio_module_handle_t AudioFlinger::loadHwModule_l(const char *name)            
1493 {                                                                               
1494     for (size_t i = 0; i < mAudioHwDevs.size(); i++) {                                                                                                                                                       
1495         if (strncmp(mAudioHwDevs.valueAt(i)->moduleName(), name, strlen(name)) == 0) {
1496             ALOGW("loadHwModule() module %s already loaded", name);             
1497             return mAudioHwDevs.keyAt(i);                                       
1498         }                                                                       
1499     }                                                                           
1500                                                                                 
1501     audio_hw_device_t *dev;                                                     
1502                                                                                 
1503     int rc = load_audio_interface(name, &dev);                                  
1504     if (rc) {                                                                   
1505         ALOGI("loadHwModule() error %d loading module %s ", rc, name);          
1506         return 0;                                                               
1507     }                                                                           
1508                                                                                 
1509     mHardwareStatus = AUDIO_HW_INIT;                                            
1510     rc = dev->init_check(dev);                                                  
1511     mHardwareStatus = AUDIO_HW_IDLE;                                            
1512     if (rc) {                                                                   
1513         ALOGI("loadHwModule() init check error %d for module %s ", rc, name);   
1514         return 0;                                                               
1515     }                                                                           
1516                                                                                 
1517     // Check and cache this HAL's level of support for master mute and master   
1518     // volume.  If this is the first HAL opened, and it supports the get        
1519     // methods, use the initial values provided by the HAL as the current       
1520     // master mute and volume settings.                                         
1521                                                                                 
1522     AudioHwDevice::Flags flags = static_cast<AudioHwDevice::Flags>(0);          
1523     {  // scope for auto-lock pattern                                           
1524         AutoMutex lock(mHardwareLock);                                          
1525                                                                                 
1526         if (0 == mAudioHwDevs.size()) {                                         
1527             mHardwareStatus = AUDIO_HW_GET_MASTER_VOLUME;                       
1528             if (NULL != dev->get_master_volume) {                               
1529                 float mv;                                                       
1530                 if (OK == dev->get_master_volume(dev, &mv)) {                   
1531                     mMasterVolume = mv;                                         
1532                 }                                                               
1533             }                                                                   
1534         
1535             mHardwareStatus = AUDIO_HW_GET_MASTER_MUTE;                         
1536             if (NULL != dev->get_master_mute) {                                 
1537                 bool mm;                                                        
1538                 if (OK == dev->get_master_mute(dev, &mm)) {                     
1539                     mMasterMute = mm;                                           
1540                 }                                                               
1541             }                                                                   
1542         }                                                                       
1543                                                                                 
1544         mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;                           
1545         if ((NULL != dev->set_master_volume) &&                                 
1546             (OK == dev->set_master_volume(dev, mMasterVolume))) {               
1547             flags = static_cast<AudioHwDevice::Flags>(flags |                   
1548                     AudioHwDevice::AHWD_CAN_SET_MASTER_VOLUME);                 
1549         }                                                                       
1550                                                                                 
1551         mHardwareStatus = AUDIO_HW_SET_MASTER_MUTE;                             
1552         if ((NULL != dev->set_master_mute) &&                                   
1553             (OK == dev->set_master_mute(dev, mMasterMute))) {                   
1554             flags = static_cast<AudioHwDevice::Flags>(flags |                   
1555                     AudioHwDevice::AHWD_CAN_SET_MASTER_MUTE);                   
1556         }                                                                       
1557                                                                                 
1558         mHardwareStatus = AUDIO_HW_IDLE;                                                                                                                                                                     
1559     }                                                                           
1560                                                                                 
1561     audio_module_handle_t handle = nextUniqueId();                              
1562     mAudioHwDevs.add(handle, new AudioHwDevice(handle, name, dev, flags));                                                     
1563                                                                                 
1564     ALOGI("loadHwModule() Loaded %s audio interface from %s (%s) handle %d",    
1565           name, dev->common.module->name, dev->common.module->id, handle);      
1566                                                                                 
1567     return handle;                                                              
1568                                                                                 
1569 }    

说明:
1)1503 int rc = load_audio_interface(name, &dev); 1503行中,通过load_audio_interface中构建了audio_hw_device的dev.
2)在1562行,通过AudioHwDevice函数够着一个AudiHwDevice类对象,AudiHwDevice包含audio_hw_device(在load_audio_interface中构造)的dev,然后添加到
mAudioHwDevs这个数组(DefaultKeyedVector<audio_module_handle_t, AudioHwDevice*> mAudioHwDevs)中。
3)至于audio_hw_hal.cpp到厂家的AudioHardware.cpp就看下面的分析。

加载so流程分析

在load_audio_interface函数中:

 138 static int load_audio_interface(const char *if_name, audio_hw_device_t **dev)   
 139 {                                                                               
 140     const hw_module_t *mod;                                                     
 141     int rc;                                                                     
 142                                                                                 
 143     rc = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, if_name, &mod);       
 144     ALOGE_IF(rc, "%s couldn't load audio hw module %s.%s (%s)", __func__,       
 145                  AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc));             
 146     if (rc) {                                                                   
 147         goto out;                                                               
 148     }                                                                           
 149     rc = audio_hw_device_open(mod, dev);                                                                                                                                                                
 150     ALOGE_IF(rc, "%s couldn't open audio hw device in %s.%s (%s)", __func__,    
 151                  AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc));             
 152     if (rc) {                                                                   
 153         goto out;                                                               
 154     }                                                                           
 155     if ((*dev)->common.version < AUDIO_DEVICE_API_VERSION_MIN) {                
 156         ALOGE("%s wrong audio hw device version %04x", __func__, (*dev)->common.version);
 157         rc = BAD_VALUE;                                                         
 158         goto out;                                                               
 159     }                                                                           
 160     return 0;                                                                   
 161                                                                                 
 162 out:                                                                            
 163     *dev = NULL;                                                                
 164     return rc;                                                                  
 165 }  

在143行得到so文件
在149行中使用audio_hw_device_open调用open函数。

legacy_adev_open

在hardware/libhardware_legacy/audio/audio_hw_hal.cpp中

689 static struct hw_module_methods_t legacy_audio_module_methods = {               
690         open: legacy_adev_open                                                                                                           
691 }; 

 37 struct legacy_audio_device {                                                                                                             
 38     struct audio_hw_device device;                                              
 39                                                                                 
 40     struct AudioHardwareInterface *hwif;                                        
 41 };  

640 static int legacy_adev_open(const hw_module_t* module, const char* name,        
641                             hw_device_t** device)                               
642 {                                                                               
643     struct legacy_audio_device *ladev;                                          
644     int ret;                                                                    
645                                                                                 
646     if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0)                            
647         return -EINVAL;                                                         
648                                                                                 
649     ladev = (struct legacy_audio_device *)calloc(1, sizeof(*ladev));            
650     if (!ladev)                                                                 
651         return -ENOMEM;                                                         
652                                                                                 
653     ladev->device.common.tag = HARDWARE_DEVICE_TAG;                             
654     ladev->device.common.version = AUDIO_DEVICE_API_VERSION_2_0;                
655     ladev->device.common.module = const_cast<hw_module_t*>(module);             
656     ladev->device.common.close = legacy_adev_close;                             
657                                                                                 
658     ladev->device.init_check = adev_init_check;                                 
659     ladev->device.set_voice_volume = adev_set_voice_volume;                     
660     ladev->device.set_master_volume = adev_set_master_volume;                   
661     ladev->device.get_master_volume = adev_get_master_volume;                   
662     ladev->device.set_mode = adev_set_mode;                                     
663     ladev->device.set_mic_mute = adev_set_mic_mute;                             
664     ladev->device.get_mic_mute = adev_get_mic_mute;                             
665     ladev->device.set_parameters = adev_set_parameters;                         
666     ladev->device.get_parameters = adev_get_parameters;                         
667     ladev->device.get_input_buffer_size = adev_get_input_buffer_size;           
668     ladev->device.open_output_stream = adev_open_output_stream;                 
669     ladev->device.close_output_stream = adev_close_output_stream;               
670     ladev->device.open_input_stream = adev_open_input_stream;                   
671     ladev->device.close_input_stream = adev_close_input_stream;                 
672     ladev->device.dump = adev_dump;                                             
673                                                                                 
674     ladev->hwif = createAudioHardware();                                        
675     if (!ladev->hwif) {                                                         
676         ret = -EIO;                                                             
677         goto err_create_audio_hw;                                               
678     }                                                                           
679                                                                                 
680     *device = &ladev->device.common;                                            
681                                                                                 
682     return 0;                                                                   
683                                                                                 
684 err_create_audio_hw:                                                                                                                                                                                     
685     free(ladev);                                                                
686     return ret;                                                                 
687 } 

425 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)     
426 {                                                                               
427     struct legacy_audio_device *ladev = to_ladev(dev);                          
428     return ladev->hwif->setVoiceVolume(volume);                                                                                                                                                          
429 }    

legacy_audio_device包含audio_hw_device和AudioHardwareInterface。
在674行中createAudioHardware,说明ldev->hwif函数就是厂家提供的函数。
在425行中 ladev->hwif->setVoiceVolume就是厂家提供setVoiceVolume,也就是adev_set_voice_volume使用的是厂家的 函数,在659行中 ladev->device.set_voice_volume = adev_set_voice_volume;床架的audio_hw_device则调用厂家的函数,也就是AudioHardware.cpp中的createAudiooHardware函数。

createAudioHardware

这是厂家实现的函数在文件中
device/friendly-arm/common/libaudio/AudioHardware.cpp

2316 extern "C" AudioHardwareInterface* createAudioHardware(void) {                  
2317     return new AudioHardware();                                                 
2318 } 

总结1

load_audio_interface(AudioFlinger.cpp---->audio_hw_device):
audio_hw_device_open(mod, dev): audio_hw_device_t dev


legacy_adev_open(audio_hw_hal.cpp---->audio_hw_device)

ladev->hwif = createAudioHardware();


createAudioHardware(AudioHardware.cpp------->AudioHardware)

AudioPolicyService调用open output、创建playback thread?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值