Android Audio HAL 接口介绍之 adev_set_parameters()和out_set_parameters()

前言

这几天一直再解决BUG,是两个usease同时存在的场景,插入耳机来实现音频切换的问题。有Recroding+HFP_Call场景,有两个Recording同时存在的场景。当插入有线耳机后,音频设备切换出现问题。由于有HFP Call,所有就涉及了 adev_set_parameters(),HFP的开始和停止都是通过它来控制的。插入耳机后,音频设备切换时通过out_set_parameters()来控制的。之前没怎么太注意,为了解决BUG,详细的跟踪这两个接口的实现和调用流程。

1. adev_set_parameters()

在HAL模块在AudioFlinger里被加载时,在adev_open()中实现和AudioFlinger中set_parameters()关联的。如果应用程序中要调用set_parameters()接口,需要导入AudioManager。他们供应用程序调用的标准接口。这个接口一般被用来控制feature的打开和关闭。我们可以根据自己项目的需求来定制自己的功能控制。在我所经历的项目中,这个接口使用的频率是很高的,如果想控制某些功能的关闭和打开,推荐使用这个接口。具体的代码就不贴在这里,太多了影响阅读效率,可以自己找资源查看。

static struct hw_module_methods_t hal_module_methods = {
    .open = adev_open,
};
    adev->device.init_check = adev_init_check;
    adev->device.set_voice_volume = adev_set_voice_volume;
    adev->device.set_master_volume = adev_set_master_volume;
    adev->device.get_master_volume = adev_get_master_volume;
    adev->device.set_master_mute = adev_set_master_mute;
    adev->device.get_master_mute = adev_get_master_mute;
    adev->device.set_mode = adev_set_mode;
    adev->device.set_mic_mute = adev_set_mic_mute;
    adev->device.get_mic_mute = adev_get_mic_mute;
    adev->device.set_parameters = adev_set_parameters;
    adev->device.get_parameters = adev_get_parameters;
    adev->device.get_input_buffer_size = adev_get_input_buffer_size;
    adev->device.open_output_stream = adev_open_output_stream;
    adev->device.close_output_stream = adev_close_output_stream;
    adev->device.open_input_stream = adev_open_input_stream;
    adev->device.close_input_stream = adev_close_input_stream;
    adev->device.dump = adev_dump;

2.out_set_parameters()

这个接口主要是在AudioPolicyManager中被调用,在有新设备被连接后,在AudioPolicyManager会为所有的输出和输入流做设备切换,如果需要做设备切换就调用set_parameters()接口。在Thread.cpp中会调用到audio HAL层去切换音频设备。这接口第三方应用软件是无法使用的。

AudioParameter inputCmd = AudioParameter();
ALOGV("%s: inform input %d of device:%d", __func__,
                      inputDescriptor->mIoHandle, device);
inputCmd.addInt(String8(AudioParameter::keyRouting),device);
                mpClientInterface->setParameters(inputDescriptor->mIoHandle,inputCmd.toString(),delayMs);
AudioParameter param = AudioParameter(String8(address));
free(address);
param.addInt(String8(AUDIO_PARAMETER_STREAM_ROUTING), (int)type);
status = mOutput->stream->common.set_parameters(&mOutput->stream->common,param.toString().string());
*out = (struct stream_out *)calloc(1, sizeof(struct stream_out));*
*out->stream.common.set_parameters = out_set_parameters;*
  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值