static const char * const audio_interfaces[] = {     AUDIO_HARDWARE_MODULE_ID_PRIMARY,     AUDIO_HARDWARE_MODULE_ID_A2DP,     AUDIO_HARDWARE_MODULE_ID_USB,

配置Configure文件路径: /vendor/etc/audio/audio_policy_configuration.xml

为什么是这个文件名称,APM代码有描述:

APM_AudioPolicyManager.cpp:
#define AUDIO_POLICY_XML_CONFIG_FILE_PATH_MAX_LENGTH 128
#define AUDIO_POLICY_XML_CONFIG_FILE_NAME "audio_policy_configuration.xml"
static status_t deserializeAudioPolicyXmlConfig(AudioPolicyConfig &config) {
    char audioPolicyXmlConfigFile[AUDIO_POLICY_XML_CONFIG_FILE_PATH_MAX_LENGTH];
    std::vector<const char*> fileNames;
    status_t ret;
    if (property_get_bool("ro.bluetooth.a2dp_offload.supported", false)) {
        if (property_get_bool("persist.bluetooth.bluetooth_audio_hal.disabled", false) &&
            property_get_bool("persist.bluetooth.a2dp_offload.disabled", false)) {
            // Both BluetoothAudio@2.0 and BluetoothA2dp@1.0 (Offlaod) are disabled, and uses
            // the legacy hardware module for A2DP and hearing aid.
            fileNames.push_back(AUDIO_POLICY_BLUETOOTH_LEGACY_HAL_XML_CONFIG_FILE_NAME);
        } else if (property_get_bool("persist.bluetooth.a2dp_offload.disabled", false)) {
            // A2DP offload supported but disabled: try to use special XML file
            fileNames.push_back(AUDIO_POLICY_A2DP_OFFLOAD_DISABLED_XML_CONFIG_FILE_NAME);
    } else if (property_get_bool("persist.bluetooth.bluetooth_audio_hal.disabled", false)) {
        fileNames.push_back(AUDIO_POLICY_BLUETOOTH_LEGACY_HAL_XML_CONFIG_FILE_NAME);
    fileNames.push_back(AUDIO_POLICY_XML_CONFIG_FILE_NAME);

2.2  修改

如上可以看出channelMasks 配置缺少多声道

修改后://增加四声道

注: source 理解为发送端, sink 理解为接受端

3. APP方法

3.1 使用 AudioRecord 原生接口:

为了从设备获取超过两个声道的音频,使用一个通到索引掩码: channelIndexMask

final AudioFormat audioFormat=new AudioFormat.Builder()
    .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
    .setSampleRate(44100)
    .setChannelIndexMask(0xf/*4 channels,0...3*/)
    .build();
final AudioRecord audioRecord = new AudioRecord.Builder()
    .setAudioFormat(audioFormat)
    .build();

AudioFormat.java  代码setChannelIndexMask 接口如下:

注意:当setChannelMask和setChannelIndexMask都设置的时候,AudioRecord只是用setChannleMask的值(最大为两个通道)。

System/media/audio/include/system/audio-base.h针对AUDIO_CHANNEL_INDEX定义如下:

3.2 使用 AAudio 接口:

AAudio 是Android为解决声音延时的高效Native接口,Andriod系统标配,目前大量使用在公网对讲机,语音对讲,Voip,RTC项目中。

#include <aaudio/AAudio.h>
result = AAudio_createStreamBuilder(&inputBuilder);
if (result != AAUDIO_OK) {
    LOGE("%s create Stream inputBuilder failed", __func__);
AAudioStreamBuilder_setDirection(inputBuilder, AAUDIO_DIRECTION_INPUT); //设置流的方向
AAudioStreamBuilder_setDeviceId(inputBuilder, AAUDIO_UNSPECIFIED);
AAudioStreamBuilder_setSampleRate(inputBuilder, 48000);
AAudioStreamBuilder_setChannelCount(inputBuilder, 4);//设置channel->4
AAudioStreamBuilder_setFormat(inputBuilder, AAUDIO_FORMAT_PCM_I16);
AAudioStreamBuilder_setPerformanceMode(inputBuilder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
//数据回调
AAudioStreamBuilder_setDataCallback(inputBuilder, inDataCallback, this);
//create input stream
result = AAudioStreamBuilder_openStream(inputBuilder, &inputStream);
if (result != AAUDIO_OK) {
    LOGE("%s open inputStream failed", __func__);
result = AAudioStream_requestStart(inputStream);
if (result != AAUDIO_OK) {
    LOGE("%s inputStream request Start failed", __func__);
//数据分析:
aaudio_data_callback_result_t inDataCallback(
        AAudioStream *stream,
        void *userData,
        void *audioData,
        int32_t numFrames) {
//note 1. 16bit->2bytes * channel->4,所以这里每帧是8个字节
    memcpy(buffer, audioData, numFrames *8);//AudioCapure数据
    return AAUDIO_CALLBACK_RESULT_CONTINUE;
                    注意:当setChannelMask和setChannelIndexMask都设置的时候,AudioRecord只是用setChannleMask的值(最大为两个通道)。AAudio 是Android为解决声音延时的高效Native接口,Andriod系统标配,目前大量使用在公网对讲机,语音对讲,Voip,RTC项目中。配置Configure文件路径: /vendor/etc/audio/audio_policy_configuration.xml。修改后://增加四声道。......
				
原生Android支持2 channel的录音。可是偏偏会有多mic的需求,比如说语音识别。目前已知TDM协议可以将多mic数据从kernel送到hal,从内核空间搬运到用户空间中。可是原生AudioRecord接口是完全不支持多channel录音数据的采集的,怎么修改,才能让原生进行支持呢? 我们就从AudioRecord的构造函数开始往下研究。无论行不行,都要研究出个所以然来!​我们如果写...
public AudioTrack(AudioAttributes attributes, AudioFormat format, int bufferSizeInBytes, int mode, int sessionId) throws IllegalArgumentE private native final int native_setup(Object audiorecord_this, Object /*AudioAttributes*/ attributes, 可以使用掩码格式只获取第二个通道数据 此时如果指定多通道录音,则打开设备时候会出错。 (录音阶段,会根据App 指定的参数打开对应的设备,设备为 4 ,可以使用8通道来录,设备为 2 ,不可以使用多通道来录) 这个需要研究一下。。。 如果机器支持六通道录音,那是不是可以通过掩码格式获取特定通道数据 当两个接口都进行了指定,是不是通道数就仅限定只能最多获取两个通道的数据了? -》 是的。 之前我们使用了MediaRecorder录制了音频和视频,虽然API使用简便,但是欠缺灵活,例如直播中的混音,变声等等,有些我们需要边录制边处理,MediaRecorder已经满足不了这些更高的需求,这个时候就需要使用AudioRecord。 使用AudioRecord录制的是pcm原始音频,具体的概念这里就不多说了,如果你需要MP3,3gp可以自行转换。也就是说录制之后的文件基本上不...
Android Automotive是谷歌推出的一种基于Android操作系统的汽车娱乐和信息娱乐系统。与普通的Android系统不同,Android Automotive是专门为汽车而设计的,并提供了与车辆控制系统的连接和通信,以实现更好的驾驶体验和安全性能。Android Automotive系统支持多种语音助手和应用程序,包括导航、音乐、通讯等,通过车辆的中控屏幕和车载音响等设备提供给驾驶者和乘客使用。Android Automotive支持无线连接,可以连接到智能手机或其他设备,以获取更多的内容和功能。目前,Android Automotive已经被多家汽车制造商采用,包括宝马、福特、沃尔沃等。