略
AF 查找HW DEV可以看出,优先PRIMARY接口
- AudioFlinger.cpp
-
- 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理解为接受端
为了从设备获取超过两个声道的音频,使用一个通到索引掩码: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定义如下:

AAudio 是Android为解决声音延时的高效Native接口,Andriod系统标配,目前大量使用在公网对讲机,语音对讲,Voip,RTC项目中。
- #include
-
- 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;
- }