Android 源码分析 - 声音 - HAL层

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|)
  3. 输出标志位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。

蓝牙声音

        源代码位置: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/。

        源文件:

  1. AudioDumpInterface.cpp

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

  1. AudioHardwareStub.cpp

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

  1. AudioHardwareGeneric.cpp

        通用的一个Audio硬件抽象层,使用硬件驱动/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中。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android TIF (TV Input Framework) HALAndroid系统中专门用于电视输入设备的HAL,它提供了与电视输入设备交互的接口。本文将从以下几个方面对Android TIF HAL进行分析: 1. TIF HAL的结构 TIF HAL的结构主要包括以下几个部分: - TIF HAL接口:包含了TIF HAL与上应用交互的接口,包括初始化、搜索电视节目、设置电视节目等接口。 - TIF HAL实现:包含了TIF HAL的具体实现,与具体的电视输入设备相关。 - TIF HAL框架:包含了TIF HAL的框架代码,用于管理TIF HAL的实现。 2. TIF HAL的初始化 TIF HAL的初始化主要包括以下几个步骤: - 加载TIF HAL库:系统在启动时会自动加载TIF HAL库。 - 查找TIF HAL接口:系统通过dlsym函数查找TIF HAL接口。 - 初始化TIF HAL实现:系统调用TIF HAL接口中的初始化函数初始化TIF HAL实现。 3. TIF HAL与电视输入设备的交互 TIF HAL与电视输入设备的交互主要包括以下几个步骤: - 搜索电视节目:应用调用TIF HAL接口中的搜索电视节目函数,TIF HAL实现会向电视输入设备发送搜索电视节目的指令,并接收电视输入设备返回的电视节目信息。 - 设置电视节目:应用调用TIF HAL接口中的设置电视节目函数,TIF HAL实现会向电视输入设备发送设置电视节目的指令,并等待电视输入设备返回设置结果。 4. TIF HAL的实现 TIF HAL的具体实现与电视输入设备相关,不同的电视输入设备需要实现不同的TIF HAL。TIF HAL的实现需要遵循Android HAL的规范,包括实现HAL接口、定义HAL结构体等。 总的来说,Android TIF HAL是一个用于电视输入设备的HAL,它提供了与电视输入设备交互的接口,其具体实现与电视输入设备相关。在使用Android TIF HAL时,需要遵循Android HAL的规范,并根据实际的电视输入设备进行相应的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值