新的音频 HAL 不适用于 Nexus 播放器
New audio HAL not working with Nexus player
Android 打开我的音频 HAL 的输入流,然后立即将其关闭。
请帮我找出缺少的内容。
背景
这是在 中讨论的 Nexus 7 平板电脑的后续工作
我能够成功地将 vloop 音频 hal 加载到 Nexus 7 中并向其读写音频。
当前问题的信息:
启动时,或连接内置麦克风(通过调用 setDeviceConnectionState)时,我观察到输入流已打开,读取了一些参数,然后输入流立即关闭。
Google/Youtube 之后无法从我的 HAL 中读取音频。
以下是我的跟踪日志:
11-07 14:05:10.321 277-1263/? E/ATVAudioPolicyManager: setDeviceConnectionState 80000004 1 0
11-07 14:05:10.321 277-1263/? D/audio_vloop: adev_open_input_stream(): 1546
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_sample_rate(): 1008
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_sample_rate(): samprate: 48000
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels(): 1047
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels: 0x0000000C
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format(): 1059
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format: 0x00000001
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format(): 1059
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format: 0x00000001
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels(): 1047
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels: 0x0000000C
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_buffer_size(): 1035
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_buffer_size: 4800
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_buffer_size(): 1035
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_buffer_size: 4800
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format(): 1059
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format: 0x00000001
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_sample_rate(): 1008
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_sample_rate(): samprate: 48000
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels(): 1047
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels: 0x0000000C
11-07 14:05:10.323 277-2820/? I/AudioFlinger: AudioFlinger's thread 0xf314f008 ready to run
11-07 14:05:10.323 277-2820/? D/audio_vloop: in_standby(): 1089
11-07 14:05:10.323 277-2819/? D/audio_vloop: looper_in_thread(): 218: Entered
11-07 14:05:10.324 277-2820/? D/audio_vloop: in_standby(): 1089
11-07 14:05:10.325 277-2820/? D/audio_vloop: in_set_parameters(): 1150: [0]
11-07 14:05:10.325 277-369/? D/audio_vloop: adev_set_parameters(): [0=;connect=-2147483644]
11-07 14:05:10.327 277-1263/? D/audio_vloop: adev_close_input_stream(): 1638
11-07 14:05:10.327 2781-2781/? D/AudioPlayer: ConnectLineIn(): 0
这些只是跟踪日志,告诉我们调用了什么,在某些情况下,我 returned。
我 return 所有这些功能都成功 Android。
在audio_policy.conf中,我添加了这个:
global_configuration {
attached_output_devices AUDIO_DEVICE_OUT_SPEAKER
default_output_device AUDIO_DEVICE_OUT_SPEAKER
attached_input_devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_REMOTE_SUBMIX
}
和
vloop {
inputs {
vloop {
sampling_rates 48000
channel_masks AUDIO_CHANNEL_IN_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_IN_BUILTIN_MIC
}
}
outputs {
vloop {
sampling_rates 48000
channel_masks AUDIO_CHANNEL_OUT_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_OUT_LINE
}
}
}
我意识到这是我 code/conf 之外的问题,所以主要怀疑是音频策略管理器 (APM)。
我检查了 APM 代码,没有发现异常问题。然后我意识到我实际上被 fugu 文件夹中 device.mk
中的 USE_CUSTOM_AUDIO_POLICY
标志搞糊涂了。此标志禁用默认 APM 并启用 Qualcomm APM。 (通过源搜索)
花了一些时间才意识到 fugu 的 APM 不是 Qualcomm APM,但它位于 /device/asus/fugu/libaudio/
修改ATVAudioPolicyManager.cpp
此处以解决问题。
修改如下:
函数中
audio_devices_t ATVAudioPolicyManager::getDeviceForInputSource(audio_source_t inputSource)
在条件中添加以下内容:
else if (availableDeviceTypes & AUDIO_DEVICE_IN_BUILTIN_MIC) {
ALOGV("Use Builtin mic input");
device = AUDIO_DEVICE_IN_BUILTIN_MIC;
}
Android 打开我的音频 HAL 的输入流,然后立即将其关闭。 请帮我找出缺少的内容。
背景
这是在
当前问题的信息:
启动时,或连接内置麦克风(通过调用 setDeviceConnectionState)时,我观察到输入流已打开,读取了一些参数,然后输入流立即关闭。
Google/Youtube 之后无法从我的 HAL 中读取音频。
以下是我的跟踪日志:
11-07 14:05:10.321 277-1263/? E/ATVAudioPolicyManager: setDeviceConnectionState 80000004 1 0
11-07 14:05:10.321 277-1263/? D/audio_vloop: adev_open_input_stream(): 1546
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_sample_rate(): 1008
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_sample_rate(): samprate: 48000
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels(): 1047
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels: 0x0000000C
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format(): 1059
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format: 0x00000001
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format(): 1059
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format: 0x00000001
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels(): 1047
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels: 0x0000000C
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_buffer_size(): 1035
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_buffer_size: 4800
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_buffer_size(): 1035
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_buffer_size: 4800
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format(): 1059
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format: 0x00000001
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_sample_rate(): 1008
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_sample_rate(): samprate: 48000
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels(): 1047
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels: 0x0000000C
11-07 14:05:10.323 277-2820/? I/AudioFlinger: AudioFlinger's thread 0xf314f008 ready to run
11-07 14:05:10.323 277-2820/? D/audio_vloop: in_standby(): 1089
11-07 14:05:10.323 277-2819/? D/audio_vloop: looper_in_thread(): 218: Entered
11-07 14:05:10.324 277-2820/? D/audio_vloop: in_standby(): 1089
11-07 14:05:10.325 277-2820/? D/audio_vloop: in_set_parameters(): 1150: [0]
11-07 14:05:10.325 277-369/? D/audio_vloop: adev_set_parameters(): [0=;connect=-2147483644]
11-07 14:05:10.327 277-1263/? D/audio_vloop: adev_close_input_stream(): 1638
11-07 14:05:10.327 2781-2781/? D/AudioPlayer: ConnectLineIn(): 0
这些只是跟踪日志,告诉我们调用了什么,在某些情况下,我 returned。 我 return 所有这些功能都成功 Android。
在audio_policy.conf中,我添加了这个:
global_configuration {
attached_output_devices AUDIO_DEVICE_OUT_SPEAKER
default_output_device AUDIO_DEVICE_OUT_SPEAKER
attached_input_devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_REMOTE_SUBMIX
}
和
vloop {
inputs {
vloop {
sampling_rates 48000
channel_masks AUDIO_CHANNEL_IN_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_IN_BUILTIN_MIC
}
}
outputs {
vloop {
sampling_rates 48000
channel_masks AUDIO_CHANNEL_OUT_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_OUT_LINE
}
}
}
我意识到这是我 code/conf 之外的问题,所以主要怀疑是音频策略管理器 (APM)。
我检查了 APM 代码,没有发现异常问题。然后我意识到我实际上被 fugu 文件夹中 device.mk
中的 USE_CUSTOM_AUDIO_POLICY
标志搞糊涂了。此标志禁用默认 APM 并启用 Qualcomm APM。 (通过源搜索)
花了一些时间才意识到 fugu 的 APM 不是 Qualcomm APM,但它位于 /device/asus/fugu/libaudio/
修改ATVAudioPolicyManager.cpp
此处以解决问题。
修改如下:
函数中
audio_devices_t ATVAudioPolicyManager::getDeviceForInputSource(audio_source_t inputSource)
在条件中添加以下内容:
else if (availableDeviceTypes & AUDIO_DEVICE_IN_BUILTIN_MIC) {
ALOGV("Use Builtin mic input");
device = AUDIO_DEVICE_IN_BUILTIN_MIC;
}