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。
蓝牙声音
蓝牙声音模块audio.a2dp.default,采用蓝牙的 A2DP 协议输出声音
|
|
远程声音
远程声音实现,模块名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
/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中。