源码文件
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
怎么加载
- 先把配置文件中的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数组里。
- 然后循环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。
- 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
- 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)