audio.h
声音的类型和枚举值定义在:system/core/include/system/audio.h。
- 输入输出端口(audio_io_handle_t)
|
typedef int audio_io_handle_t; |
- 流类型audio_stream_type_t(AUDIO_STREAM_*)
流类型在策略计算的主要依据。
| 编号 | 枚举 | 名称 | 说明 |
| -1 | DEFAULT | ||
| 0 | VOICE_CALL | ||
| 1 | SYSTEM | ||
| 2 | RING | ||
| 3 | MUSIC | ||
| 4 | ALARM | ||
| 5 | NOTIFICATION | ||
| 6 | BLUETOOTH_SCO | ||
| 7 | ENFORCED_AUDIBLE | 不能被用户静音 | |
| 8 | DTMF | ||
| 9 | TTS | ||
| 10 | CNT | 共10个有效类型 | |
| 9 | MAX | AUDIO_STREAM_CNT - 1 |
- 源类型audio_source_t(AUDIO_SOURCE_*)
源类型影响预处理音效,具体效果定义在audio_effects.conf配置文件中。
| 编号 | 枚举 | 名称 | 说明 |
| 0 | DEFAULT | ||
| 1 | MIC | ||
| 2 | VOICE_UPLINK | ||
| 3 | VOICE_DOWNLINK | ||
| 4 | VOICE_CALL | ||
| 5 | CAMCORDER | ||
| 6 | VOICE_RECOGNITION | ||
| 7 | VOICE_COMMUNICATION | ||
| 8 | REMOTE_SUBMIX | Source for the mix to be presented remotely, Wifi Display | |
| 9 | CNT | 共9个有效类型 | |
| 8 | MAX | AUDIO_STREAM_CNT – 1 | |
| 1999 | SOURCE_HOTWORD |
- 模式audio_mode_t(AUDIO_MODE_*)
- 设备audio_devices_t(AUDIO_DEVICE_*)
- 输出(AUDIO_DEVICE_OUT_*)
- 输入(AUDIO_DEVICE_IN_*,AUDIO_DEVICE_BIT_IN|)
- 输出标志位audio_output_flags_t(AUDIO_OUTPUT_FLAG_*)
| 编号 | 枚举 | 名称 | 说明 |
| -2 | INVALID | ||
| -1 | CURRENT | ||
| 0 | NORMAL | ||
| 1 | RINGTONE | ||
| 2 | IN_CALL | ||
| 3 | IN_COMMUNICATION | ||
| 4 | CNT | 共4个有效类型 | |
| 3 | MAX | AUDIO_STREAM_CNT – 1 |
| 位 | 枚举 | 名称 | 说明 |
| 无 | NONE | ||
| 31 | BIT_IN | 0x80000000 | |
| 30 | BIT_DEFAULT | 0x40000000 |
| 位 | 枚举 | 名称 | 说明 |
| 0 | EARPIECE | ||
| 1 | SPEAKER | ||
| 2 | WIRED_HEADSET | ||
| 3 | WIRED_HEADPHONE | ||
| 4 | BLUETOOTH_SCO | ||
| 5 | BLUETOOTH_SCO_HEADSET | ||
| 6 | BLUETOOTH_SCO_CARKIT | ||
| 7 | BLUETOOTH_A2DP | ||
| 8 | BLUETOOTH_A2DP_HEADPHONES | ||
| 9 | BLUETOOTH_A2DP_SPEAKER | ||
| 10 | AUX_DIGITAL | ||
| 11 | ANLG_DOCK_HEADSET | ||
| 12 | DGTL_DOCK_HEADSET | ||
| 13 | USB_ACCESSORY | ||
| 14 | USB_DEVICE | ||
| 15 | REMOTE_SUBMIX | ||
| 30 | DEFAULT | AUDIO_DEVICE_BIT_DEFAULT | |
| ALL | 以上所有 | ||
| ALL_A2DP | 所有BLUETOOTH_A2DP | ||
| ALL_SCO | 所有BLUETOOTH_SCO | ||
| ALL_USB | 所有USB_ |
| 位 | 枚举 | 名称 | 说明 |
| 0 | COMMUNICATION | ||
| 1 | AMBIENT | ||
| 2 | BUILTIN_MIC | ||
| 3 | BLUETOOTH_SCO_HEADSET | ||
| 4 | WIRED_HEADSET | ||
| 5 | AUX_DIGITAL | ||
| 6 | VOICE_CALL | ||
| 7 | BACK_MIC | ||
| 8 | REMOTE_SUBMIX | ||
| 9 | ANLG_DOCK_HEADSET | ||
| 10 | DGTL_DOCK_HEADSET | ||
| 11 | USB_ACCESSORY | ||
| 12 | USB_DEVICE | ||
| 13 | DEFAULT | AUDIO_DEVICE_BIT_DEFAULT |
| 位 | 枚举 | 名称 | 说明 |
| 无 | NONE | ||
| 1 | DIRECT | 没有软件混音器 | |
| 2 | PRIMARY | this output is the primary output of the device | |
| 3 | FAST | output supports "fast tracks" | |
| 4 | DEEP_BUFFER | use deep audio buffers | |
| 5 | COMPRESS_OFFLOAD | 有硬件codec负责播放压缩流 | |
| 6 | NON_BLOCKING | 使用非阻塞write |
audio
模块接口定义在hardware/libhardware/include/hardware/audio.h中。模块ID为“audio”,模块实例有“primary”、“a2dp”、“usb”、“r_submix”、“codec_offload”。
类型定义
接口定义
- 流配置,用于打开流程的配置参数
|
struct audio_config { uint32_t sample_rate; audio_channel_mask_t channel_mask; audio_format_t format; audio_offload_info_t offload_info; }; typedef struct audio_config audio_config_t; |
- 流audio_stream
打开的输入输出流,可以动态增加删除设备连接。
| 成员 | 类型 | 说明 |
| get_sample_rate | uint32_t(*) | |
| set_sample_rate | int(*) | 没有使用,用set_parameters代替 AUDIO_PARAMETER_STREAM_SAMPLING_RATE |
| get_buffer_size | size_t(*) | 采样大小的整数倍 |
| get_channels | audio_channel_mask_t (*) | 比如:AUDIO_CHANNEL_OUT_STEREO或者 AUDIO_CHANNEL_IN_STEREO |
| get_format | audio_format_t (*) | 比如:AUDIO_FORMAT_PCM_16_BIT |
| set_format | int (*) | 没有使用,用set_parameters代替 AUDIO_PARAMETER_STREAM_FORMAT |
| standby | int (*) | 进入standby模式,在下一次IO操作时退出 |
| dump | int (*) | |
| get_device | audio_devices_t (*) | 获取流连接的设备(多个) |
| set_device | int (*) | 没有使用,用set_parameters代替 AUDIO_PARAMETER_STREAM_ROUTING |
| set_parameters | int (*) | key1=value1;key2=value2,上层先调用standby |
| get_parameters | char * (*) | 调用者使用free释放返回的字符串 |
| add_audio_effect | int (*) | |
| remove_audio_effect | int (*) |
- 输出流audio_stream_out_t,继承audio_stream
| 成员 | 类型 | 说明 |
| get_latency | uint32_t (*) | 单位:毫秒 |
| set_volume | int (*) | 当使用硬件做混音时用该方法 |
| write | ssize_t (*) | 非阻塞模式,可能返回小于输入量 |
| get_render_position | int (*) | 返回上次退出standby模式后输出的采样数 |
| get_next_write_timestamp | int (*) | 下一帧将输出的时刻,微秒,相对值HAL自定义 |
| set_callback | int (*) | 设置非阻塞模式,有空间时回调 |
| pause | int (*) | |
| resume | int (*) | |
| drain | int (*) | 阻塞,非阻塞 |
| flush | int (*) | 清空缓存,必须先pause |
| get_presentation_position | int (*) | 3.0版本 |
- 输入流audio_stream_in_t,继承audio_stream
| 成员 | 类型 | 说明 |
| set_gain | int (*) | 将来使用 |
| read | ssize_t (*) | 阻塞 |
| get_input_frames_lost | uint32_t (*) | 返回从上次调用该方法后丢弃的采样数 |
- 模块hw_module_t
无特殊成员。
- 设备audio_hw_device_t
| 成员 | 类型 | 说明 |
| get_supported_devices | uint32_t (*) | 返回audio_devices_t为组合。2.0版本开始不实现该方法,提供audio_policy.conf |
| init_check | int (*) | 判断初始化是否完成 |
| set_voice_volume | int (*) | 电话音量,音量值从0.0到1.0 |
| set_master_volume | int (*) | 除电话音量的其他音量,返回非0表示由混音器模拟音量调节 |
| get_master_volume | int (*) | AudioFlinger在启动时查询主音量,用于设置初始化音量,方法可以为NULL表示不支持 |
| set_mode | int (*) | 设置声音模式AUDIO_MODE_NORMAL等 |
| set_mic_mute | int (*) | mic mute |
| get_mic_mute | int (*) | |
| set_parameters | int (*) | 设置全局声音参数 |
| get_parameters | char * (*) | 调用者通过free释放返回的字符串 |
| get_input_buffer_size | size_t (*) | 返回根据配置计算的缓存大小 |
| open_output_stream | int (*) | 打开输出流 |
| close_output_stream | void (*) | 关闭输出流 |
| open_input_stream | int (*) | 打开输入流 |
| close_input_stream | void (*) | 关闭输入流 |
| dump | int (*) | |
| set_master_mute | int (*) | 设置静音状态,返回非0表示由混音器模拟 |
| get_master_mute | int (*) | AudioFlinger在启动时查询主静音状态,用于设置初始化状态,方法可以为NULL表示不支持 |
Default声音
空的声音模块实现,模块名audio.primary.default。
源代码位置:hardware/libhardware/modules/audio/。
Usb声音
简单的USB声音实现,模块名audio.usb.default,依赖tinyalsa。
源代码位置:hardware/libhardware/modules/usbaudio/。
|
struct pcm_config pcm_config = { .channels = 2, .rate = 44100, .period_size = 1024, .period_count = 4, .format = PCM_FORMAT_S16_LE, }; |
设置参数“card”、“device”,作为tinyalsa中pcm_open的card,device参数。
声音输出对应pcm_write。
蓝牙声音
- Bluetooth in Android 4.2 and 4.3(一):综述
- Bluetooth in Android 4.2 and 4.3(二):AVRCP演进
- Bluetooth in Android 4.2 and 4.3(三):Enable Bluetooth
- Bluetooth in Android 4.2 and 4.3(四):Scan remote devices
- Bluetooth资料
源代码位置:external/bluedroid/audio_a2dp_hw。
蓝牙声音模块audio.a2dp.default,采用蓝牙的 A2DP 协议输出声音
|
struct a2dp_audio_device { struct audio_hw_device device; struct a2dp_stream_out *output; }; |
|
static struct hw_module_methods_t hal_module_methods = { .open = adev_open, }; struct audio_module HAL_MODULE_INFO_SYM = { .common = { .tag = HARDWARE_MODULE_TAG, .version_major = 1, .version_minor = 0, .id = AUDIO_HARDWARE_MODULE_ID, .name = "A2DP Audio HW HAL", .author = "The Android Open Source Project", .methods = &hal_module_methods, }, }; |
远程声音
远程声音实现,模块名audio.r_submix.default,通过模拟管道media/nbaio支持一对输入输出声音设备。
源代码位置:hardware/libhardware/modules/audio_remote_submix/。
Legacy声音
升级老的声音策略模块到新框架,这些源文件并没有被编译。
源代码位置:hardware/libhardware_legacy/audio/。
源文件:
- AudioDumpInterface.cpp
将输出的Audio数据写入到文件中,通过sleep模拟写入阻塞。
- AudioHardwareStub.cpp
声音输入输出的空实现,通过sleep模拟读写阻塞。
- AudioHardwareGeneric.cpp
通用的一个Audio硬件抽象层,使用硬件驱动/dev/eac。
- A2dpAudioInterface.cpp
蓝牙声音,包装另一个AudioInterface,非蓝牙设备的请求转给这个AudioInterface。
上面的实现都是基于老的声音设备接口,audio_hw_hal.cpp中的代码实现了将老接口装换为新接口的逻辑。
audio_policy.h
声音策略的类型和枚举值定义在:system/core/include/system/audio_policy.h。
强制使用配置是一个从使用类型(audio_policy_forced_use_t)到配置目标(audio_policy_forced_cfg_t)的映射。
- 配置目标,audio_policy_forced_cfg_t(AUDIO_POLICY_FORCE_*)
用于audio_policy->set_force_use()
| 编号 | 枚举 | 名称 | 说明 |
| 0 | NONE | ||
| 1 | SPEAKER | ||
| 2 | HEADPHONES | ||
| 3 | BT_SCO | ||
| 4 | BT_A2DP | ||
| 5 | WIRED_ACCESSORY | ||
| 6 | BT_CAR_DOCK | ||
| 7 | BT_DESK_DOCK | ||
| 8 | ANALOG_DOCK | ||
| 9 | DIGITAL_DOCK | ||
| 10 | NO_BT_A2DP | ||
| 11 | SYSTEM_ENFORCED | ||
| 12 | CFG_CNT | 共12个选项 | |
| 11 | CFG_MAX | AUDIO_POLICY_FORCE_CFG_CNT - 1 | |
| 0 | DEFAULT | 默认NONE |
- 使用类型,audio_policy_forced_use_t(AUDIO_POLICY_FORCE_*)
用于audio_policy->set_force_use()
| 编号 | 枚举 | 名称 | 说明 |
| 0 | FOR_COMMUNICATION | ||
| 1 | FOR_MEDIA | ||
| 2 | FOR_RECORD | ||
| 3 | FOR_DOCK | ||
| 4 | BT_A2DP | ||
| 5 | FOR_SYSTEM | ||
| 6 | USE_CNT | 共6个选项 | |
| 7 | USE_MAX | AUDIO_POLICY_FORCE_USE_CNT - 1 | |
| 6 | USE_CNT |
- 设备状态audio_policy_dev_state_t(AUDIO_POLICY_DEVICE_STATE_*)
用于audio_policy->set_device_connection_state()
| 编号 | 枚举 | 名称 | 说明 |
| 0 | UNAVAILABLE | ||
| 1 | AVAILABLE | ||
| 2 | CNT | 共2个选项 | |
| 1 | MAX | AUDIO_POLICY_DEVICE_STATE_CNT - 1 |
- audio_policy_tone_t(AUDIO_POLICY_TONE_*)
| 编号 | 枚举 | 名称 | 说明 |
| 0 | IN_CALL_NOTIFICATION | 生成一个TONE通知正在打电话的用户 | |
| 1 | CNT | 共1个选项 | |
| 0 | MAX | AUDIO_POLICY_DEVICE_STATE_CNT - 1 |
audio_policy
模块接口定义在hardware/libhardware/include/hardware/audio_policy.h中。模块ID为“audio_policy”。
类型定义
接口定义
- 策略audio_policy
负责声音路由,音量控制。包括:
- 跟踪系统状态:热插拔设备连接,电话状态,用户请求
- 处理创建AudioTrack时的get_output查询,释放AudioTrack时release_output
- 相似的:get_input() and release_input()
- 处理音量控制请求
| 成员 | 类型 | 说明 |
| set_device_connection_state | int (*) | 通知设备连接状态变化 |
| get_device_connection_state | audio_policy_dev_state_t (*) | 查询设备连接状态 |
| set_phone_state | void (*) | 通知电话状态变化audio_mode_t |
| set_ringer_mode | void (*) | 废弃方法 |
| set_force_use | void (*) | 对应某个使用方式,强制使用指定设备分类 |
| get_force_use | audio_policy_forced_cfg_t (*) | 查询某个使用方式的强制使用设备分类 |
| set_can_mute_enforced_audible | void (*) | 如果可以强行静音,标记为ENFORCED_AUDIBLE的流也可以静音 |
| init_check | int (*) | 检查初始化是否完成 |
| get_output | audio_io_handle_t (*) | 请求建立适应指定流类型和配置的输出句柄 |
| start_output | int (*) | 指示某个输出句柄开始被某个流类型使用 |
| stop_output | int (*) | 指示某个输出句柄停止被某个流类型使用 |
| release_output | void (*) | 释放输出句柄 |
| get_input | audio_io_handle_t (*) | 请求建立适应某个源和配置的输入句柄 |
| start_input | int (*) | 指示某个输入句柄开始被某个源类型使用 |
| stop_input | int (*) | 指示某个输入句柄停止被某个源类型使用 |
| release_input | void (*) | 释放输入句柄 |
| init_stream_volume | void (*) | 初始化流类型的音量索引范围 |
| set_stream_volume_index | int (*) | 设置流的音量索引 |
| get_stream_volume_index | int (*) | 获取流的音量索引 |
| set_stream_volume_index_for_device | int (*) | 设置流的指定设备的音量索引 |
| get_stream_volume_index_for_device | int (*) | 获取流的指定设备的音量索引 |
| get_strategy_for_stream | uint32_t (*) | 获取流的策略 |
| get_devices_for_stream | audio_devices_t (*) | 获取流的设备集 |
| get_output_for_effect | audio_io_handle_t (*) | 用效果获取输出句柄 |
| register_effect | int (*) | |
| unregister_effect | int (*) | |
| set_effect_enabled | int (*) | |
| is_stream_active | bool (*) | |
| is_stream_active_remotely | bool (*) | |
| is_source_active | bool (*) | |
| dump | int (*) | |
| is_offload_supported | bool (*) |
- 策略执行(audio_policy_service_ops),由外部模块实现
| 成员 | 类型 | 说明 |
| open_output | audio_io_handle_t (*) | 用指定参数打开输出句柄,参数可以指示用默认值,返回时参数反映实际值 |
| open_duplicate_output | audio_io_handle_t (*) | 用两个输出句柄创建复制的句柄,由混音线程处理复制 |
| close_output | int (*) | 关闭输出句柄 |
| suspend_output | int (*) | 暂停输出,硬件输出流处于standby,混音线程继续但是输出被丢弃 |
| restore_output | int (*) | 恢复 |
| open_input | audio_io_handle_t (*) | 废弃的,应该使用open_input_on_module |
| close_input | int (*) | 关闭输入句柄 |
| set_stream_volume | int (*) | 一个流在不同输出上有不同音量 |
| set_stream_output | int (*) | 路由流到指定输出句柄上 |
| set_parameters | void (*) | |
| get_parameters | char * (*) | |
| start_tone | int (*) | |
| stop_tone | int (*) | |
| set_voice_volume | int (*) | |
| move_effects | int (*) | |
| load_hw_module | audio_module_handle_t (*) | |
| open_output_on_module | audio_io_handle_t (*) | |
| open_input_on_module | audio_io_handle_t (*) |
- 模块audio_policy_module_t
无特殊成员。
- 设备audio_policy_device
| 成员 | 类型 | 说明 |
| create_audio_policy | int (*) | 返回audio_devices_t为组合。2.0版本开始不实现该方法,提供audio_policy.conf |
| destroy_audio_policy | int (*) | 判断初始化是否完成 |
Null声音策略
空的声音策略模块实现,模块名audio_policy.stub。
源文件:hardware/libhardware/modules/audio/audio_hw.c
Legacy声音策略
升级老的声音策略模块到新框架,模块名audio_policy.default。
源文件:hardware/libhardware_legacy/audio/audio_policy_hal.c
新老类型对应关系:(老的定义在include/hardware_legacy/AudioSystemLegacy.h)
| 新 | 老 | 说明 |
| audio_stream_t | AudioSystem::stream_type | |
| audio_source_t | audio_source | |
| audio_format_t | AudioSystem::audio_format | |
| audio_channel_mask_t | AudioSystem:: audio_channels | |
| audio_in_acoustics_t | AudioSystem::audio_in_acoustics | |
| audio_mode_t | ||
| audio_devices_t | AudioSystem::audio_devices | |
| audio_output_flags_t | AudioSystem::output_flags | |
| audio_policy_forced_cfg_t | AudioSystem::forced_config | |
| audio_policy_force_use_t | AudioSystem::force_use | |
| audio_policy_dev_state_t | AudioSystem::device_connection_state | |
| audio_policy_tone_t |
老的AudioPolicyInterface接口方法:
| 成员 | 类型 | 说明 |
| setDeviceConnectionState | status_t (*) | |
| getDeviceConnectionState | AudioSystem::device_connection_state (*) | |
| setPhoneState | void (*) | |
| setForceUse | void (*) | |
| getForceUse | AudioSystem::forced_config (*) | |
| set_can_mute_enforced_audible | setSystemProperty("ro.camera.sound.forced") | |
| setSystemProperty | void (*) | 没有新的对应方法 |
| initCheck | status_t (*) | |
| getOutput | audio_io_handle_t (*) | |
| startOutput | status_t (*) | |
| stopOutput | status_t (*) | |
| releaseOutput | void (*) | |
| getInput | audio_io_handle_t (*) | |
| startInput | status_t (*) | |
| stopInput | status_t (*) | |
| releaseInput | void (*) | |
| initStreamVolume | void (*) | |
| set_stream_volume_index | setStreamVolumeIndex AUDIO_DEVICE_OUT_DEFAULT | |
| get_stream_volume_index | getStreamVolumeIndex AUDIO_DEVICE_OUT_DEFAULT | |
| setStreamVolumeIndex | status_t (*) | set_stream_volume_index_for_device |
| getStreamVolumeIndex | status_t (*) | get_stream_volume_index_for_device |
| getStrategyForStream | uint32_t (*) | |
| getDevicesForStream | audio_devices_t (*) | |
| getOutputForEffect | audio_io_handle_t (*) | |
| registerEffect | status_t (*) | |
| unregisterEffect | status_t (*) | |
| setEffectEnabled | status_t (*) | |
| isStreamActive | bool (*) | |
| isStreamActiveRemotely | bool (*) | |
| isSourceActive | status_t (*) | |
| dump | int (*) | |
| isOffloadSupported | bool (*) |
AudioPolicyManagerBase::HwModule代表配置文件里的一个模块,包含打开的模块句柄audio_module_handle_t,以及输入输出端口配置(IOProfile)列表。
AudioPolicyManagerBase::IOProfile代表配置文件里的一个输入输出端口。一个端口里面包含多个设备。
AudioPolicyManagerBase::AudioOutputDescriptor表示一个输出端口的使用状态,包括当前连接的设备。
audio_effect
音效模块类似HAL模块结构,导出符号“AELI”。结构为audio_effect_library_t。创建的音效实例为effect_interface_s,句柄定义为effect_handle_t。
接口定义在hardware/libhardware/include/hardware/audio_effect.h中。
本文深入探讨了Android系统的音频框架,涵盖了音频流类型、源类型、模式、设备及输出标志位,详细解析了音频模块接口、声音策略、音效模块以及相关接口定义。此外,还介绍了各种音频设备如默认、USB、蓝牙和远程声音的实现,以及声音策略的转换和升级。
789

被折叠的 条评论
为什么被折叠?



