[RK3399][Android7.1]修改系统配置同时输出Speaker和USB音频

这篇博客介绍了在Android7.1中如何修改音频控制策略,以实现在Speaker和USB音频设备间切换。作者提供了两种方法:一种是通过修改硬件层的Audio_hw.c文件,另一种是在Framework层的AudioPolicyManager.cpp中进行修改。在修改后,需要注意可能产生的声音卡顿问题,并进行了相应调整。更新后的代码确保了媒体、闹钟和铃声都通过USB音频输出。

 

参考链接:Android7.1 音频声音控制策略

参考文中给了两种方法,第一种没有成功,第二种成功了。第一种可能是参数给错了,例子给的是Speaker和耳机,我需要的是Speaker和USB音频。

 

第一种:

文件路径:hardware\qcom\audio\hal\Audio_hw.c

int start_output_stream(struct stream_out *out)
{
	...
	// Jon Add Begin
	out->devices = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
	// End
	...
	uc_info->devices = out->devices;
	...
	//完成声卡和路由的切换和打开
	select_devices(adev, out->usecase);
	...
}

git比较如下:

ubt@ubt-ThinkPad-E470:~/proj/firefly-rk3399$ git diff hardware/qcom/audio/hal
diff --git a/hardware/qcom/audio/hal/audio_hw.c b/hardware/qcom/audio/hal/audio_hw.c
index 0a5bccb..bc0683d 100644
--- a/hardware/qcom/audio/hal/audio_hw.c
+++ b/hardware/qcom/audio/hal/audio_hw.c
@@ -1645,6 +1645,9 @@ int start_output_stream(struct stream_out *out)
         goto error_config;
     }
 
+       // dlc-add 20210223
+       //out->devices = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
+
     uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase));
     uc_info->id = out->usecase;
     uc_info->type = PCM_PLAYBACK;

其中  SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES  在platform.h 音频设备定义,下面仅列举一部分:

/* Sound devices specific to the platform
 * The DEVICE_OUT_* and DEVICE_IN_* should be mapped to these sound
 * devices to enable corresponding mixer paths
 */
enum {
    SND_DEVICE_NONE = 0,
 
    /* Playback devices */
    SND_DEVICE_MIN,
    SND_DEVICE_OUT_BEGIN = SND_DEVICE_MIN,
    SND_DEVICE_OUT_HANDSET = SND_DEVICE_OUT_BEGIN,
    SND_DEVICE_OUT_SPEAKER,
    SND_DEVICE_OUT_HEADPHONES,
    SND_DEVICE_OUT_HEADPHONES_DSD,
    SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES,
    SND_DEVICE_OUT_SPEAKER_AND_LINE,
    SND_DEVICE_OUT_VOICE_HANDSET,
    SND_DEVICE_OUT_VOICE_SPEAKER,
    SND_DEVICE_OUT_VOICE_HEADPHONES,
    SND_DEVICE_OUT_VOICE_LINE,
    SND_DEVICE_OUT_HDMI,
    SND_DEVICE_OUT_DISPLAY_PORT,
    SND_DEVICE_OUT_BT_SCO,
    SND_DEVICE_OUT_BT_A2DP,
    SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP,
    SND_DEVICE_OUT_AFE_PROXY,
    SND_DEVICE_OUT_USB_HEADSET,
    SND_DEVICE_OUT_USB_HEADPHONES,
    SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET,
    SND_DEVICE_OUT_SPEAKER_PROTECTED,
    SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED,
    SND_DEVICE_OUT_END,
 
    /* Capture devices */
    SND_DEVICE_IN_BEGIN = SND_DEVICE_OUT_END,
    SND_DEVICE_IN_HANDSET_MIC  = SND_DEVICE_IN_BEGIN, // 58
    SND_DEVICE_IN_SPEAKER_MIC,
    SND_DEVICE_IN_HEADSET_MIC,
    SND_DEVICE_IN_VOICE_SPEAKER_MIC,
    SND_DEVICE_IN_VOICE_HEADSET_MIC,
    SND_DEVICE_IN_BT_SCO_MIC,
    SND_DEVICE_IN_CAMCORDER_MIC,
    SND_DEVICE_IN_END,
 
    SND_DEVICE_MAX = SND_DEVICE_IN_END,
};

根据需求配置,如果需要Speaker和USB,则应使用  SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET  ,这个我没有测试,大家有时间可以试试。

 

第二种方式:

在Framework中修改,路径如下:frameworks\av\services\audiopolicy\managerdefault\AudioPolicyMan

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值