经过排查发现camera打开录像的时候,音频相关的log有如下一句:
AudioHardwareTiny: create new input stream for dev(0x00000020)
这个打开的device的设备号是:0x00000020,而我用系统的录音应用打开录音的时候,打印如下:
AudioHardwareTiny: create new input stream for dev(0x00000004)
这个打开的device的设备号是:0x00000004。
根据定义:
AUDIO_DEVICE_IN_BUILTIN_MIC = AUDIO_DEVICE_BIT_IN | 0x4
还有
AUDIO_DEVICE_IN_HDMI = AUDIO_DEVICE_IN_AUX_DIGITAL
AUDIO_DEVICE_IN_AUX_DIGITAL = AUDIO_DEVICE_BIT_IN | 0x20
判断得出camera打开录像的时候实际走的音频通道是HDMI_IN。
再通过打印中的:
alsa_route: route_set_controls() set route 21(这是打开录音时打印的)
alsa_route: route_set_controls() set route 34(这是camera打开录像时打印的)
21对应的route是:MAIN_MIC_CAPTURE_ROUTE
34对应的route是:HDMI_IN_CAPTURE_ROUTE
综上,camera录像时走的是HDMI IN的路径。
解决方法如下:
diff --git a/frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp b/frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp
index 58e198a..9d3bde9 100755
--- a/frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp
+++ b/frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp
@@ -689,7 +689,8 @@ audio_devices_t Engine::getDeviceForInputSource(audio_source_t inputSource) cons
}
break;
case AUDIO_SOURCE_CAMCORDER:
- if (availableDeviceTypes & AUDIO_DEVICE_IN_HDMI) {
+ if ((availableDeviceTypes & AUDIO_DEVICE_IN_HDMI)
+ && property_get_bool("media.audio.hdmiin", false)) {
device = AUDIO_DEVICE_IN_HDMI;
} else if (availableDeviceTypes & AUDIO_DEVICE_IN_BACK_MIC) {
device = AUDIO_DEVICE_IN_BACK_MIC;