# testA2Recorder **Repository Path**: songsayit/testA2Recorder ## Basic Information - **Project Name**: testA2Recorder - **Description**: 测试 多路 mic 录音. 需要配合 framework 和 hw alsa 的 修改 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-09-12 - **Last Updated**: 2024-04-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 主要说明 1. A2 硬件上是使用 pdm 录音, 有 4 个 mic; 2. 软件上是要求 `32bit, 32K, 4ch` 数据; 3. 由于 android 11 不支持 多通道录音. 因此只能用"巧方法"; 4. 由于 hw alsa 和 AndroidRecord 之间是隔离的, 目前可以使用 `AudioManager.setParameters` 来配置. ## HW ALSA 端 1. `32bit, 32K, 4ch`需要通过配置 `pcm_config` 来达到 tinycap 的 配置效果, 配置如下 ``` //for iflytek-A2 struct pcm_config pcm_config_in_mic_array = { .channels = 4, .rate = 32000, .period_size = 256, .period_count = 4, .format = PCM_FORMAT_S32_LE, }; ``` 2. 对于普通录音, 他不能使用 `32bit, 32K, 4ch` 的 `pcm_config`, 因此需要做兼容. ### 兼容方法 通过 `AudioManager.setParameters` 来启动使能 mic 矩阵. 需要配置 `android.permission.MODIFY_AUDIO_SETTINGS` 权限. 代码封装如下: ``` public static class MicArrayUtils { ////////////////// private final static String AUDIO_PARAMETER_KEY_MIC_ARRAY = "mic_array"; private final static String AUDIO_PARAMETER_VALUE_ON = "on"; private final static String AUDIO_PARAMETER_VALUE_OFF = "off"; private final static String PARAMETERS_MIC_ARRAY_ON = AUDIO_PARAMETER_KEY_MIC_ARRAY + "=" + AUDIO_PARAMETER_VALUE_ON; private final static String PARAMETERS_MIC_ARRAY_OFF = AUDIO_PARAMETER_KEY_MIC_ARRAY + "=" + AUDIO_PARAMETER_VALUE_OFF; /////////////// public static void setMicArrayEnabled(@NonNull Context context, boolean enabled) { AudioManager audioManager = context.getSystemService(AudioManager.class); audioManager.setParameters(enabled ? PARAMETERS_MIC_ARRAY_ON : PARAMETERS_MIC_ARRAY_OFF); } public static String getParametersOfMicArray(@NonNull Context context) { return context.getSystemService(AudioManager.class).getParameters(AUDIO_PARAMETER_KEY_MIC_ARRAY); } } ``` 1. 在 start 录音前, 调用 `MicArrayUtils.setMicArrayEnabled(context, true)`; 2. 在 stop 录音后, 调用 `MicArrayUtils.setMicArrayEnabled(context, false)`, 以便普通 app 可以获取正确的录音数据; **注意:** 若应用因为某种原因而没有调用 `MicArrayUtils.setMicArrayEnabled(context, false)`, 那么 普通录音app就会获取到不合适的录音数据 #### 获取 mic 矩阵信息 调用 `MicArrayUtils.getParametersOfMicArray(context)` 返回信息 格式是 `channels=%d;rate=%d;format=%d` 比如 `channels=4;rate=32000;format=32`, 表示 `32bit, 32K, 4ch`. 做这个属性的目的是为了考虑后面可能会有 6 个mic的情况. 这样应用可以做适配. ## A2 MIC 矩阵示意图 ![A2 mic](./A2-MIC-layout.png)