audio.h

        声音的类型和枚举值定义在:system/core/include/system/audio.h。

  1. 输入输出端口(audio_io_handle_t)


typedef int audio_io_handle_t;


  1. 流类型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

  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



  1. 模式audio_mode_t(AUDIO_MODE_*)
  2. 设备audio_devices_t(AUDIO_DEVICE_*)
  1. 输出(AUDIO_DEVICE_OUT_*)
  2. 输入(AUDIO_DEVICE_IN_*,AUDIO_DEVICE_BIT_IN|)
  1. 输出标志位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”。

类型定义

接口定义

  1. 流配置,用于打开流程的配置参数


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;


  1. 流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 (*)


  1. 输出流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版本

  1. 输入流audio_stream_in_t,继承audio_stream

成员

类型

说明

set_gain

int (*)

将来使用

read

ssize_t (*)

阻塞

get_input_frames_lost

uint32_t (*)

返回从上次调用该方法后丢弃的采样数

  1. 模块hw_module_t

        无特殊成员。

  1. 设备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 协议输出声音


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/。

        源文件:

  1. AudioDumpInterface.cpp

        将输出的Audio数据写入到文件中,通过sleep模拟写入阻塞。

  1. AudioHardwareStub.cpp

        声音输入输出的空实现,通过sleep模拟读写阻塞。

  1. AudioHardwareGeneric.cpp

/dev/eac。

  1. 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)的映射。

  1. 配置目标,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

  1. 使用类型,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



  1. 设备状态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

  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”。

类型定义

接口定义

  1. 策略audio_policy

        负责声音路由,音量控制。包括:

  1. 跟踪系统状态:热插拔设备连接,电话状态,用户请求
  2. 处理创建AudioTrack时的get_output查询,释放AudioTrack时release_output
  3. 相似的:get_input() and release_input()
  4. 处理音量控制请求

成员

类型

说明

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 (*)


  1. 策略执行(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 (*)


  1. 模块audio_policy_module_t

        无特殊成员。

  1. 设备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中。