参考链接: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

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

被折叠的 条评论
为什么被折叠?



