一些笔记

来源:互联网 发布:网络与新媒体研究生吧 编辑:程序博客网 时间:2024/05/17 03:05
1. AudioPolicyService和AudioFlinger,这两大服务都在系统启动时由 MediaSever加载,加载的代码位于:frameworks\base\media\mediaserver \main_mediaserver.cpp。

2. AudioPolicyManagerBase.cpp

const AudioPolicyManagerBase::VolumeCurvePoint    AudioPolicyManagerBase::sDefaultVolumeCurve[AudioPolicyManagerBase::VOLCNT] = {    {1, -49.5f}, {33, -33.5f}, {66, -17.0f}, {100, 0.0f}};

3.AudioService.java

private final int[] MAX_STREAM_VOLUME = new int[] {        5,  // STREAM_VOICE_CALL        7,  // STREAM_SYSTEM        7,  // STREAM_RING        15, // STREAM_MUSIC        7,  // STREAM_ALARM        7,  // STREAM_NOTIFICATION        15, // STREAM_BLUETOOTH_SCO        7,  // STREAM_SYSTEM_ENFORCED        15, // STREAM_DTMF        15  // STREAM_TTS    };


 4.AudioFlinger.cpp

audio_io_handle_t AudioFlinger::openOutput(audio_module_handle_t module,                                           audio_devices_t *pDevices,                                           uint32_t *pSamplingRate,                                           audio_format_t *pFormat,                                           audio_channel_mask_t *pChannelMask,                                           uint32_t *pLatencyMs,                                           audio_output_flags_t flags){    status_t status;    PlaybackThread *thread = NULL;    struct audio_config config = {        sample_rate: pSamplingRate ? *pSamplingRate : 0,        channel_mask: pChannelMask ? *pChannelMask : 0,        format: pFormat ? *pFormat : AUDIO_FORMAT_DEFAULT,    };    audio_stream_out_t *outStream = NULL;    AudioHwDevice *outHwDev;...outHwDev = findSuitableHwDev_l(module, *pDevices);    status = hwDevHal->open_output_stream(hwDevHal,                                          id,                                          *pDevices,                                          (audio_output_flags_t)flags,                                          &config,                                          &outStream);...

AudioFlinger::AudioHwDevice* AudioFlinger::findSuitableHwDev_l(        audio_module_handle_t module,        audio_devices_t devices){    // if module is 0, the request comes from an old policy manager and we should load    // well known modules    if (module == 0) {        ALOGW("findSuitableHwDev_l() loading well know audio hw modules");        for (size_t i = 0; i < ARRAY_SIZE(audio_interfaces); i++) {            loadHwModule_l(audio_interfaces[i]);        }...

这里面的audio_interfaces:

static const char * const audio_interfaces[] = {    AUDIO_HARDWARE_MODULE_ID_PRIMARY,    AUDIO_HARDWARE_MODULE_ID_A2DP,    AUDIO_HARDWARE_MODULE_ID_USB,};
audio_module_handle_t AudioFlinger::loadHwModule_l(const char *name){    for (size_t i = 0; i < mAudioHwDevs.size(); i++) {        if (strncmp(mAudioHwDevs.valueAt(i)->moduleName(), name, strlen(name)) == 0) {            ALOGW("loadHwModule() module %s already loaded", name);            return mAudioHwDevs.keyAt(i);        }    }    audio_hw_device_t *dev;    int rc = load_audio_interface(name, &dev);...

 

static int load_audio_interface(const char *if_name, audio_hw_device_t **dev){    const hw_module_t *mod;    int rc;    rc = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, if_name, &mod);    ALOGE_IF(rc, "%s couldn't load audio hw module %s.%s (%s)", __func__,                 AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc));    if (rc) {        goto out;    }    rc = audio_hw_device_open(mod, dev);    ALOGE_IF(rc, "%s couldn't open audio hw device in %s.%s (%s)", __func__,                 AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc));...

这里面的AUDIO_HARDWARE_MODULE_ID在audio.h里面:

#define AUDIO_HARDWARE_MODULE_ID "audio"

Audio.h

static inline int audio_hw_device_open(const struct hw_module_t* module,                                       struct audio_hw_device** device){    return module->methods->open(module, AUDIO_HARDWARE_INTERFACE,                                 (struct hw_device_t**)device);}

haredware.c

int hw_get_module_by_class(const char *class_id, const char *inst,                           const struct hw_module_t **module){    int status;    int i;    const struct hw_module_t *hmi = NULL;    char prop[PATH_MAX];    char path[PATH_MAX];    char name[PATH_MAX];    if (inst)        snprintf(name, PATH_MAX, "%s.%s", class_id, inst);    else        strlcpy(name, class_id, PATH_MAX);    /*     * Here we rely on the fact that calling dlopen multiple times on     * the same .so will simply increment a refcount (and not load     * a new copy of the library).     * We also assume that dlopen() is thread-safe.     */    /* Loop through the configuration variants looking for a module */    for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {        if (i < HAL_VARIANT_KEYS_COUNT) {            if (property_get(variant_keys[i], prop, NULL) == 0) {                continue;            }            snprintf(path, sizeof(path), "%s/%s.%s.so",                     HAL_LIBRARY_PATH2, name, prop);            if (access(path, R_OK) == 0) break;            snprintf(path, sizeof(path), "%s/%s.%s.so",                     HAL_LIBRARY_PATH1, name, prop);            if (access(path, R_OK) == 0) break;        } else {            snprintf(path, sizeof(path), "%s/%s.default.so",                     HAL_LIBRARY_PATH1, name);            if (access(path, R_OK) == 0) break;        }    }...

其中:

#define HAL_LIBRARY_PATH1 "/system/lib/hw"#define HAL_LIBRARY_PATH2 "/vendor/lib/hw" 
0 0