经调查发现camera打开视频时,与音频相关log下一句: AudioHardwareTiny: create new input stream for dev(0x00000020) 这个打开的device设备号为:0x当我用系统的录音应用程序打开录音时,打印如下: 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;