一些笔记
来源:互联网 发布:网络与新媒体研究生吧 编辑:程序博客网 时间: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
- 一些笔记
- 一些笔记
- 一些笔记
- 一些笔记
- 一些笔记
- 一些笔记
- 一些笔记
- 一些笔记
- 一些笔记
- 一些笔记
- 一些笔记
- 一些笔记
- 一些笔记
- 一些笔记
- 一些笔记。。
- 一些笔记
- 一些笔记
- 一些笔记
- 都不知道说什么好了,我解释不清,懂的自己看
- 模型的把控
- STL_Sequence_大小写英文字母和数字进栈输出显示
- HashMap collision problem
- 微派第四届企业微信营销培训成功举行
- 一些笔记
- spring访问数据库
- delphi 短信猫(SMS)编程总结
- 推理机Jess、Racer、Jena 比较 (转)
- 信息检索之索引压缩
- Setup win32 development environment
- (转)Cocos2d-x加Box2D制作弹弓类游戏
- log4net 发送错误日志到邮箱配置
- python 写的http后台弱口令爆破工具