最近遇到一个项目,既用到高通PMU芯片内置的Codec接了麦克风,也通过外部I2S总线外接了两个麦克风。

详细沟通后,了解到,在普通录音的使用场景中,客户要求可以通过安卓原生api任意切换内部Codec和外部Codec上的麦克风进行录音。

设计思路:

(1)仿照audio-record这个usecase去新增一个usecase,对应外部Codec

(2)找到内部外部Codec区分点

packages/apps/SoundRecorder/src/com/android/soundrecorder/SoundRecorder.javaif (AUDIO_AMR.equals(mRequestedType)) {mRemainingTimeCalculator.setBitRate(BITRATE_AMR);mRecorder.setChannels(1);mRecorder.setSamplingRate(SAMPLERATE_8000);mRecorder.startRecording(MediaRecorder.OutputFormat.RAW_AMR, ".amr", this, audioSourceType, MediaRecorder.AudioEncoder.AMR_NB);
};

从上述代码段API中找到以下几个区分点

1. 采样率

2.码率

3. 声道数量

4. AudioSourceType

实测下来,只有通过AudioSourceType具有实操性。

以下是完整的验证代码diff文件,自测实现内部外部Codec上麦克风切换设计。

不过mixer_path.xml文件,只是调试时使用的开发板,是不带外部Codec的,这个并不影响该功能开发。

重点关注usecase的切换即可。

From 7ca1f038a41ac01746553504a433f03d9543a00f Mon Sep 17 00:00:00 2001
From: wumanyuan <wumanyuan@meigsmart.com>
Date: Sun, 1 Mar 2020 18:11:24 +0800
Subject: [PATCH] 20200301_aduioSource_diff_two_codecs.diffChange-Id: Ica7ee61b69209649fecd4d54baf1f678407095bc
---.../libmediaplayerservice/StagefrightRecorder.cpp    |  2 +-frameworks/av/services/audioflinger/Threads.cpp      |  1 +.../audiopolicy/enginedefault/src/Engine.cpp         |  1 +.../managerdefault/AudioPolicyManager.cpp            |  2 +-.../audiopolicy/service/AudioPolicyEffects.cpp       |  3 ++-frameworks/base/api/current.txt                      |  1 +frameworks/base/api/system-current.txt               |  1 +frameworks/base/api/test-current.txt                 |  1 +.../media/java/android/media/AudioAttributes.java    |  3 ++-.../android/media/AudioRecordingConfiguration.java   |  2 ++.../base/media/java/android/media/MediaRecorder.java |  5 +++++.../wilhelm/src/android/AudioRecorder_to_android.cpp |  1 +.../audio/configs/msm8953/mixer_paths_qrd_sku3.xml   |  5 +++++hardware/qcom/audio/hal/audio_extn/ssr.c             |  2 +-hardware/qcom/audio/hal/audio_hw.c                   | 20 +++++++++++++-------hardware/qcom/audio/hal/audio_hw.h                   |  1 +hardware/qcom/audio/hal/msm8916/platform.c           | 18 +++++++++++++-----.../src/com/android/soundrecorder/SoundRecorder.java | 16 +++++++++-------system/media/audio/include/system/audio.h            |  1 +.../include/audio_effects/audio_effects_conf.h       |  1 +20 files changed, 63 insertions(+), 24 deletions(-)mode change 100644 => 100755 frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cppmode change 100644 => 100755 frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cppmode change 100644 => 100755 frameworks/av/services/audiopolicy/service/AudioPolicyEffects.cppmode change 100644 => 100755 frameworks/base/media/java/android/media/AudioAttributes.javamode change 100644 => 100755 frameworks/base/media/java/android/media/AudioRecordingConfiguration.javamode change 100644 => 100755 frameworks/wilhelm/src/android/AudioRecorder_to_android.cppmode change 100644 => 100755 hardware/qcom/audio/hal/audio_extn/ssr.cmode change 100644 => 100755 hardware/qcom/audio/hal/audio_hw.cmode change 100644 => 100755 hardware/qcom/audio/hal/audio_hw.hmode change 100644 => 100755 hardware/qcom/audio/hal/msm8916/platform.cmode change 100644 => 100755 system/media/audio/include/system/audio.hdiff --git a/frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp b/frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp
old mode 100644
new mode 100755
index 6b91f9d..723bf44
--- a/frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -118,7 +118,7 @@ sp<IGraphicBufferProducer> StagefrightRecorder::querySurfaceMediaSource() const}status_t StagefrightRecorder::setAudioSource(audio_source_t as) {
-    ALOGV("setAudioSource: %d", as);
+    ALOGE("kjc>>>setAudioSource: %d", as);if (as < AUDIO_SOURCE_DEFAULT ||(as >= AUDIO_SOURCE_CNT && as != AUDIO_SOURCE_FM_TUNER)) {ALOGE("Invalid audio source: %d", as);
diff --git a/frameworks/av/services/audioflinger/Threads.cpp b/frameworks/av/services/audioflinger/Threads.cpp
index b04c797..319114d 100755
--- a/frameworks/av/services/audioflinger/Threads.cpp
+++ b/frameworks/av/services/audioflinger/Threads.cpp
@@ -631,6 +631,7 @@ const char *sourceToString(audio_source_t source)switch (source) {case AUDIO_SOURCE_DEFAULT:              return "default";case AUDIO_SOURCE_MIC:                  return "mic";
+    case AUDIO_SOURCE_SEC_MIC:              return "sec mic";case AUDIO_SOURCE_VOICE_UPLINK:         return "voice uplink";case AUDIO_SOURCE_VOICE_DOWNLINK:       return "voice downlink";case AUDIO_SOURCE_VOICE_CALL:           return "voice call";
diff --git a/frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp b/frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp
index 6db66b0..267a891 100755
--- a/frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp
+++ b/frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp
@@ -589,6 +589,7 @@ audio_devices_t Engine::getDeviceForInputSource(audio_source_t inputSource) conscase AUDIO_SOURCE_DEFAULT:case AUDIO_SOURCE_MIC:
+    case AUDIO_SOURCE_SEC_MIC:if (availableDeviceTypes & AUDIO_DEVICE_IN_BLUETOOTH_A2DP) {device = AUDIO_DEVICE_IN_BLUETOOTH_A2DP;} else if ((mForceUse[AUDIO_POLICY_FORCE_FOR_RECORD] == AUDIO_POLICY_FORCE_BT_SCO) &&
diff --git a/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
old mode 100644
new mode 100755
index f2eb931..3a92ee9
--- a/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -1480,7 +1480,7 @@ status_t AudioPolicyManager::getInputForAttr(const audio_attributes_t *attr,audio_port_handle_t selectedDeviceId,input_type_t *inputType){
-    ALOGV("getInputForAttr() source %d, samplingRate %d, format %d, channelMask %x,"
+    ALOGE("kjc>>>getInputForAttr() source %d, samplingRate %d, format %d, channelMask %x,""session %d, flags %#x",attr->source, samplingRate, format, channelMask, session, flags);diff --git a/frameworks/av/services/audiopolicy/service/AudioPolicyEffects.cpp b/frameworks/av/services/audiopolicy/service/AudioPolicyEffects.cpp
old mode 100644
new mode 100755
index b732b20..92d3ba9
--- a/frameworks/av/services/audiopolicy/service/AudioPolicyEffects.cpp
+++ b/frameworks/av/services/audiopolicy/service/AudioPolicyEffects.cpp
@@ -318,6 +318,7 @@ void AudioPolicyEffects::EffectVector::setProcessorEnabled(bool enabled)/*static*/ const char * const AudioPolicyEffects::kInputSourceNames[AUDIO_SOURCE_CNT -1] = {MIC_SRC_TAG,
+    SEC_MIC_SRC_TAG,VOICE_UL_SRC_TAG,VOICE_DL_SRC_TAG,VOICE_CALL_SRC_TAG,
@@ -334,7 +335,7 @@ void AudioPolicyEffects::EffectVector::setProcessorEnabled(bool enabled)int i;for (i = AUDIO_SOURCE_MIC; i < AUDIO_SOURCE_CNT; i++) {if (strcmp(name, kInputSourceNames[i - AUDIO_SOURCE_MIC]) == 0) {
-            ALOGV("inputSourceNameToEnum found source %s %d", name, i);
+            ALOGE("kjc>>>inputSourceNameToEnum: found source %s %d", name, i);break;}}
diff --git a/frameworks/base/api/current.txt b/frameworks/base/api/current.txt
index 2da365b..a142493 100644
--- a/frameworks/base/api/current.txt
+++ b/frameworks/base/api/current.txt
@@ -21357,6 +21357,7 @@ package android.media {public final class MediaRecorder.AudioSource {field public static final int CAMCORDER = 5; // 0x5field public static final int DEFAULT = 0; // 0x0
+    field public static final int SEC_MIC = 10; // 0xafield public static final int MIC = 1; // 0x1field public static final int REMOTE_SUBMIX = 8; // 0x8field public static final int UNPROCESSED = 9; // 0x9
diff --git a/frameworks/base/api/system-current.txt b/frameworks/base/api/system-current.txt
index a484bc5..abf50b0 100644
--- a/frameworks/base/api/system-current.txt
+++ b/frameworks/base/api/system-current.txt
@@ -22886,6 +22886,7 @@ package android.media {public final class MediaRecorder.AudioSource {field public static final int CAMCORDER = 5; // 0x5field public static final int DEFAULT = 0; // 0x0
+    field public static final int SEC_MIC = 10; // 0xafield public static final int HOTWORD = 1999; // 0x7cffield public static final int MIC = 1; // 0x1field public static final int RADIO_TUNER = 1998; // 0x7ce
diff --git a/frameworks/base/api/test-current.txt b/frameworks/base/api/test-current.txt
index 4e972ba..de486a8 100644
--- a/frameworks/base/api/test-current.txt
+++ b/frameworks/base/api/test-current.txt
@@ -21430,6 +21430,7 @@ package android.media {public final class MediaRecorder.AudioSource {field public static final int CAMCORDER = 5; // 0x5field public static final int DEFAULT = 0; // 0x0
+    field public static final int SEC_MIC = 10; // 0xafield public static final int MIC = 1; // 0x1field public static final int REMOTE_SUBMIX = 8; // 0x8field public static final int UNPROCESSED = 9; // 0x9
diff --git a/frameworks/base/media/java/android/media/AudioAttributes.java b/frameworks/base/media/java/android/media/AudioAttributes.java
old mode 100644
new mode 100755
index 89709ee..647e38e
--- a/frameworks/base/media/java/android/media/AudioAttributes.java
+++ b/frameworks/base/media/java/android/media/AudioAttributes.java
@@ -639,7 +639,7 @@ public final class AudioAttributes implements Parcelable {* Use this audio attributes configuration method when building an {@link AudioRecord}* instance with {@link AudioRecord#AudioRecord(AudioAttributes, AudioFormat, int)}.* @param preset one of {@link MediaRecorder.AudioSource#DEFAULT},
-         *     {@link MediaRecorder.AudioSource#MIC}, {@link MediaRecorder.AudioSource#CAMCORDER},
+         *     {@link MediaRecorder.AudioSource#MIC}, @link MediaRecorder.AudioSource#SEC_MIC}, {@link MediaRecorder.AudioSource#CAMCORDER},*     {@link MediaRecorder.AudioSource#VOICE_RECOGNITION},*     {@link MediaRecorder.AudioSource#VOICE_COMMUNICATION} or*     {@link MediaRecorder.AudioSource#UNPROCESSED}
@@ -650,6 +650,7 @@ public final class AudioAttributes implements Parcelable {switch (preset) {case MediaRecorder.AudioSource.DEFAULT:case MediaRecorder.AudioSource.MIC:
+                case MediaRecorder.AudioSource.SEC_MIC:case MediaRecorder.AudioSource.CAMCORDER:case MediaRecorder.AudioSource.VOICE_RECOGNITION:case MediaRecorder.AudioSource.VOICE_COMMUNICATION:
diff --git a/frameworks/base/media/java/android/media/AudioRecordingConfiguration.java b/frameworks/base/media/java/android/media/AudioRecordingConfiguration.java
old mode 100644
new mode 100755
index 50dbd03..5edded9
--- a/frameworks/base/media/java/android/media/AudioRecordingConfiguration.java
+++ b/frameworks/base/media/java/android/media/AudioRecordingConfiguration.java
@@ -71,6 +71,7 @@ public final class AudioRecordingConfiguration implements Parcelable {@IntDef({MediaRecorder.AudioSource.DEFAULT,MediaRecorder.AudioSource.MIC,
+        MediaRecorder.AudioSource.SEC_MIC,MediaRecorder.AudioSource.VOICE_UPLINK,MediaRecorder.AudioSource.VOICE_DOWNLINK,MediaRecorder.AudioSource.VOICE_CALL,
@@ -88,6 +89,7 @@ public final class AudioRecordingConfiguration implements Parcelable {* Returns the audio source being used for the recording.* @return one of {@link MediaRecorder.AudioSource#DEFAULT},*       {@link MediaRecorder.AudioSource#MIC},
+     *       {@link MediaRecorder.AudioSource#SEC_MIC},*       {@link MediaRecorder.AudioSource#VOICE_UPLINK},*       {@link MediaRecorder.AudioSource#VOICE_DOWNLINK},*       {@link MediaRecorder.AudioSource#VOICE_CALL},
diff --git a/frameworks/base/media/java/android/media/MediaRecorder.java b/frameworks/base/media/java/android/media/MediaRecorder.java
index 47cbd7d..0bed303 100755
--- a/frameworks/base/media/java/android/media/MediaRecorder.java
+++ b/frameworks/base/media/java/android/media/MediaRecorder.java
@@ -42,6 +42,7 @@ import java.lang.ref.WeakReference;** <pre>MediaRecorder recorder = new MediaRecorder();* recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
+ * recorder.setAudioSource(MediaRecorder.AudioSource.SEC_MIC);* recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);* recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);* recorder.setOutputFile(PATH_NAME);
@@ -276,6 +277,9 @@ public class MediaRecorder*  {@link #DEFAULT} otherwise. */public static final int UNPROCESSED = 9;+        /*used for external codec mics*/
+        public static final int SEC_MIC = 10;
+/*** Audio source for capturing broadcast radio tuner output.* @hide
@@ -308,6 +312,7 @@ public class MediaRecorderswitch(source) {case AudioSource.DEFAULT:case AudioSource.MIC:
+        case AudioSource.SEC_MIC:case AudioSource.VOICE_UPLINK:case AudioSource.VOICE_DOWNLINK:case AudioSource.VOICE_CALL:
diff --git a/frameworks/wilhelm/src/android/AudioRecorder_to_android.cpp b/frameworks/wilhelm/src/android/AudioRecorder_to_android.cpp
old mode 100644
new mode 100755
index 361499d..bd4903f
--- a/frameworks/wilhelm/src/android/AudioRecorder_to_android.cpp
+++ b/frameworks/wilhelm/src/android/AudioRecorder_to_android.cpp
@@ -117,6 +117,7 @@ SLresult audioRecorder_getPreset(CAudioRecorder* ar, SLuint32* pPreset) {switch (ar->mRecordSource) {case AUDIO_SOURCE_DEFAULT:case AUDIO_SOURCE_MIC:
+    case AUDIO_SOURCE_SEC_MIC:*pPreset = SL_ANDROID_RECORDING_PRESET_GENERIC;break;case AUDIO_SOURCE_VOICE_UPLINK:
diff --git a/hardware/qcom/audio/configs/msm8953/mixer_paths_qrd_sku3.xml b/hardware/qcom/audio/configs/msm8953/mixer_paths_qrd_sku3.xml
index 34f7d2e..f923881 100755
--- a/hardware/qcom/audio/configs/msm8953/mixer_paths_qrd_sku3.xml
+++ b/hardware/qcom/audio/configs/msm8953/mixer_paths_qrd_sku3.xml
@@ -112,6 +112,7 @@<ctl name="PRI_MI2S_RX Audio Mixer MultiMedia5" value="0" /><ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia5" value="0" /><ctl name="MultiMedia1 Mixer TERT_MI2S_TX" value="0" />
+    <ctl name="MultiMedia2 Mixer TERT_MI2S_TX" value="0" /><ctl name="MultiMedia5 Mixer TERT_MI2S_TX" value="0" /><ctl name="MultiMedia1 Mixer INTERNAL_BT_SCO_TX" value="0" /><ctl name="PRI_MI2S_RX_Voice Mixer CSVoice" value="0" />
@@ -425,6 +426,10 @@<ctl name="MultiMedia1 Mixer TERT_MI2S_TX" value="1" /></path>+    <path name="audio-record-kjc">
+        <ctl name="MultiMedia1 Mixer TERT_MI2S_TX" value="1" />
+    </path>
+<path name="audio-record bt-sco"><ctl name="MultiMedia1 Mixer INTERNAL_BT_SCO_TX" value="1" /></path>
diff --git a/hardware/qcom/audio/hal/audio_extn/ssr.c b/hardware/qcom/audio/hal/audio_extn/ssr.c
old mode 100644
new mode 100755
index f55f3ce..2f4bfee
--- a/hardware/qcom/audio/hal/audio_extn/ssr.c
+++ b/hardware/qcom/audio/hal/audio_extn/ssr.c
@@ -343,7 +343,7 @@ int audio_extn_ssr_check_and_set_usecase(struct stream_in *in)* only AUDIO_DEVICE_IN_BUILTIN_MIC, AUDIO_DEVICE_IN_BACK_MIC supports 3 mics */if (audio_extn_ssr_get_enabled() &&((channel_count == 2) || (channel_count == 6)) &&
-           ((AUDIO_SOURCE_MIC == source) || (AUDIO_SOURCE_CAMCORDER == source)) &&
+           ((AUDIO_SOURCE_MIC == source) || (AUDIO_SOURCE_CAMCORDER == source) || (AUDIO_SOURCE_SEC_MIC == source)) &&((AUDIO_DEVICE_IN_BUILTIN_MIC == devices) || (AUDIO_DEVICE_IN_BACK_MIC == devices)) &&(in->format == AUDIO_FORMAT_PCM_16_BIT)) {diff --git a/hardware/qcom/audio/hal/audio_hw.c b/hardware/qcom/audio/hal/audio_hw.c
old mode 100644
new mode 100755
index 6f42944..145bfd7
--- a/hardware/qcom/audio/hal/audio_hw.c
+++ b/hardware/qcom/audio/hal/audio_hw.c
@@ -37,8 +37,8 @@#define LOG_TAG "audio_hw_primary"#define ATRACE_TAG (ATRACE_TAG_AUDIO|ATRACE_TAG_HAL)
-/*#define LOG_NDEBUG 0*/
-/*#define VERY_VERY_VERBOSE_LOGGING*/
+#define LOG_NDEBUG 0
+#define VERY_VERY_VERBOSE_LOGGING#ifdef VERY_VERY_VERBOSE_LOGGING#define ALOGVV ALOGV#else
@@ -225,6 +225,7 @@ const char * const use_case_table[AUDIO_USECASE_MAX] = {[USECASE_AUDIO_PLAYBACK_OFFLOAD9] = "compress-offload-playback9",[USECASE_AUDIO_RECORD] = "audio-record",
+    [USECASE_AUDIO_RECORD_KJC] = "audio-record-kjc",[USECASE_AUDIO_RECORD_COMPRESS] = "audio-record-compress",[USECASE_AUDIO_RECORD_LOW_LATENCY] = "low-latency-record",[USECASE_AUDIO_RECORD_FM_VIRTUAL] = "fm-virtual-record",
@@ -1292,7 +1293,7 @@ int select_devices(struct audio_device *adev, audio_usecase_t uc_id)if (adev->active_input &&(adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION ||(adev->mode == AUDIO_MODE_IN_COMMUNICATION &&
-                     adev->active_input->source == AUDIO_SOURCE_MIC)) &&
+                     ((adev->active_input->source == AUDIO_SOURCE_MIC) || (adev->active_input->source == AUDIO_SOURCE_SEC_MIC)) )) &&adev->primary_output && !adev->primary_output->standby) {out_device = adev->primary_output->devices;platform_set_echo_reference(adev, false, AUDIO_DEVICE_NONE);
@@ -4237,9 +4238,8 @@ static int adev_open_input_stream(struct audio_hw_device *dev,return -ENOMEM;}-    ALOGD("%s: enter: sample_rate(%d) channel_mask(%#x) devices(%#x)\
-        stream_handle(%p) io_handle(%d) source(%d) format %x",__func__, config->sample_rate,
-        config->channel_mask, devices, &in->stream, handle, source, config->format);
+    ALOGE("kjc>>>%s: enter: sample_rate(%d) channel_mask(%#x) devices(%#x) stream_handle(%p) io_handle(%d) source(%d) AUDIO_SOURCE_SEC_MIC(%d) format %x",__func__, config->sample_rate,
+        config->channel_mask, devices, &in->stream, handle, source, AUDIO_SOURCE_SEC_MIC, config->format);pthread_mutex_init(&in->lock, (const pthread_mutexattr_t *) NULL);pthread_mutex_init(&in->pre_lock, (const pthread_mutexattr_t *) NULL);@@ -4268,7 +4268,13 @@ static int adev_open_input_stream(struct audio_hw_device *dev,in->flags = flags;/* Update config params with the requested sample rate and channels */
-    in->usecase = USECASE_AUDIO_RECORD;
+    if(in->source == AUDIO_SOURCE_SEC_MIC){
+        in->usecase = USECASE_AUDIO_RECORD_KJC;
+        ALOGE("kjc>>>%s: @@@@@ USECASE_AUDIO_RECORD_KJC @@@@@\n", __func__);
+    }else{
+        in->usecase = USECASE_AUDIO_RECORD;
+        ALOGE("kjc>>>%s: @@@@@ USECASE_AUDIO_RECORD @@@@@\n", __func__);
+    }if (config->sample_rate == LOW_LATENCY_CAPTURE_SAMPLE_RATE &&(flags & AUDIO_INPUT_FLAG_FAST) != 0) {is_low_latency = true;
diff --git a/hardware/qcom/audio/hal/audio_hw.h b/hardware/qcom/audio/hal/audio_hw.h
old mode 100644
new mode 100755
index ee28157..8bd847f
--- a/hardware/qcom/audio/hal/audio_hw.h
+++ b/hardware/qcom/audio/hal/audio_hw.h
@@ -109,6 +109,7 @@ enum {/* Capture usecases */USECASE_AUDIO_RECORD,
+    USECASE_AUDIO_RECORD_KJC,USECASE_AUDIO_RECORD_COMPRESS,USECASE_AUDIO_RECORD_LOW_LATENCY,USECASE_AUDIO_RECORD_FM_VIRTUAL,
diff --git a/hardware/qcom/audio/hal/msm8916/platform.c b/hardware/qcom/audio/hal/msm8916/platform.c
old mode 100644
new mode 100755
index f958ab2..e8e3075
--- a/hardware/qcom/audio/hal/msm8916/platform.c
+++ b/hardware/qcom/audio/hal/msm8916/platform.c
@@ -280,6 +280,7 @@ int pcm_device_table[AUDIO_USECASE_MAX][2] = {[USECASE_AUDIO_PLAYBACK_OFFLOAD9] = {-1, -1},[USECASE_AUDIO_PLAYBACK_ULL] = {MULTIMEDIA3_PCM_DEVICE, MULTIMEDIA3_PCM_DEVICE},[USECASE_AUDIO_RECORD] = {AUDIO_RECORD_PCM_DEVICE, AUDIO_RECORD_PCM_DEVICE},
+    [USECASE_AUDIO_RECORD_KJC] = {AUDIO_RECORD_PCM_DEVICE, AUDIO_RECORD_PCM_DEVICE},[USECASE_AUDIO_RECORD_COMPRESS] = {COMPRESS_CAPTURE_DEVICE, COMPRESS_CAPTURE_DEVICE},[USECASE_AUDIO_RECORD_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,LOWLATENCY_PCM_DEVICE},
@@ -699,6 +700,7 @@ static struct name_to_index usecase_name_index[AUDIO_USECASE_MAX] = {{TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD9)},{TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_ULL)},{TO_NAME_INDEX(USECASE_AUDIO_RECORD)},
+    {TO_NAME_INDEX(USECASE_AUDIO_RECORD_KJC)},{TO_NAME_INDEX(USECASE_AUDIO_RECORD_LOW_LATENCY)},{TO_NAME_INDEX(USECASE_VOICE_CALL)},{TO_NAME_INDEX(USECASE_VOICE2_CALL)},
@@ -3095,8 +3097,7 @@ snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_dsnd_device_t snd_device = SND_DEVICE_NONE;int channel_count = popcount(channel_mask);-    ALOGV("%s: enter: out_device(%#x) in_device(%#x) channel_count (%d) channel_mask (0x%x)",
-          __func__, out_device, in_device, channel_count, channel_mask);
+    ALOGE("kjc>>>%s: enter: out_device(%#x) in_device(%#x) channel_count (%d) channel_mask (0x%x)", __func__, out_device, in_device, channel_count, channel_mask);if (my_data->external_mic) {if ((out_device != AUDIO_DEVICE_NONE) && ((mode == AUDIO_MODE_IN_CALL) ||voice_extn_compress_voip_is_active(adev) || audio_extn_hfp_is_active(adev))) {
@@ -3365,10 +3366,13 @@ snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_d} else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&(my_data->source_mic_type & SOURCE_DUAL_MIC)) {snd_device = SND_DEVICE_IN_HANDSET_DMIC;
-                    platform_set_echo_reference(adev, true, out_device);}}}
+    } else if (source == AUDIO_SOURCE_SEC_MIC) {
+        snd_device = SND_DEVICE_IN_HANDSET_DMIC;
+        ALOGE("kjc>>>%s: @@@@@ SND_DEVICE_IN_HANDSET_DMIC @@@@@\n", __func__);
+        platform_set_echo_reference(adev, true, out_device);} else if (source == AUDIO_SOURCE_FM_TUNER) {snd_device = SND_DEVICE_IN_CAPTURE_FM;} else if (source == AUDIO_SOURCE_DEFAULT) {
@@ -3391,8 +3395,10 @@ snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_delse if ((my_data->fluence_type & (FLUENCE_DUAL_MIC | FLUENCE_QUAD_MIC)) &&(channel_count == 2) && (my_data->source_mic_type & SOURCE_DUAL_MIC))snd_device = SND_DEVICE_IN_HANDSET_STEREO_DMIC;
-            else
+            else{snd_device = SND_DEVICE_IN_HANDSET_MIC;
+                ALOGE("kjc>>>%s: @@@@@ SND_DEVICE_IN_HANDSET_MIC @@@@@\n", __func__);
+            }} else if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {snd_device = SND_DEVICE_IN_SPEAKER_MIC;} else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
@@ -3462,7 +3468,7 @@ snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_d}}exit:
-    ALOGV("%s: exit: in_snd_device(%s)", __func__, device_table[snd_device]);
+    ALOGE("kjc>>>%s: exit: in_snd_device(%s)", __func__, device_table[snd_device]);return snd_device;}@@ -3918,6 +3924,7 @@ bool platform_listen_usecase_needs_event(audio_usecase_t uc_id)/* concurrent capture usecases, no event, capture handled by device*  USECASE_AUDIO_RECORD:
+    *  USECASE_AUDIO_RECORD_KJC:*  USECASE_AUDIO_RECORD_COMPRESS:*  USECASE_AUDIO_RECORD_LOW_LATENCY:@@ -3981,6 +3988,7 @@ bool platform_sound_trigger_usecase_needs_event(audio_usecase_t uc_id)/* concurrent capture usecases, no event, capture handled by device*  USECASE_AUDIO_RECORD:
+    *  USECASE_AUDIO_RECORD_KJC:*  USECASE_AUDIO_RECORD_COMPRESS:*  USECASE_AUDIO_RECORD_LOW_LATENCY:diff --git a/packages/apps/SoundRecorder/src/com/android/soundrecorder/SoundRecorder.java b/packages/apps/SoundRecorder/src/com/android/soundrecorder/SoundRecorder.java
index cd575ea..8c36662 100755
--- a/packages/apps/SoundRecorder/src/com/android/soundrecorder/SoundRecorder.java
+++ b/packages/apps/SoundRecorder/src/com/android/soundrecorder/SoundRecorder.java
@@ -348,6 +348,7 @@ public class SoundRecorder extends Activityprivate boolean mWAVSupport = false;int mAudioSourceType = MediaRecorder.AudioSource.MIC;
+    int mAudioSourceType_ExtMic = MediaRecorder.AudioSource.SEC_MIC;static int mOldCallState = TelephonyManager.CALL_STATE_IDLE;WakeLock mWakeLock;String mRequestedType = AUDIO_ANY;
@@ -674,18 +675,19 @@ public class SoundRecorder extends Activity//                        if(mTelephonyManager.getCallState() != TelephonyManager.CALL_STATE_IDLE){//                            Toast.makeText(this, R.string., Toast.LENGTH_LONG).show();//                        }
-
+int audioSourceType = mAudioSourceType;
-                       if ((mAudioManager.getMode() == AudioManager.MODE_IN_CALL) &&
-                           (mAudioSourceType == MediaRecorder.AudioSource.MIC)) {
+                      int audioSourceType_ExtMic = mAudioSourceType_ExtMic;
+                      if ((mAudioManager.getMode() == AudioManager.MODE_IN_CALL) && (mAudioSourceType == MediaRecorder.AudioSource.MIC)) {audioSourceType = MediaRecorder.AudioSource.VOICE_UPLINK;Log.e(TAG, "Selected Voice Tx only Source: sourcetype" + audioSourceType);}if (AUDIO_AMR.equals(mRequestedType)) {
+                            Log.e(TAG, "kjc>>>startRecording: amr source AUDIO_SOURCE_SEC_MIC\n");mRemainingTimeCalculator.setBitRate(BITRATE_AMR);mRecorder.setChannels(1);mRecorder.setSamplingRate(SAMPLERATE_8000);
-                           mRecorder.startRecording(MediaRecorder.OutputFormat.RAW_AMR, ".amr", this, audioSourceType, MediaRecorder.AudioEncoder.AMR_NB);
+                          mRecorder.startRecording(MediaRecorder.OutputFormat.RAW_AMR, ".amr", this, audioSourceType_ExtMic, MediaRecorder.AudioEncoder.AMR_NB);} else if (AUDIO_EVRC.equals(mRequestedType)) {mRemainingTimeCalculator.setBitRate(BITRATE_EVRC);mRecorder.setSamplingRate(SAMPLERATE_8000);
@@ -695,6 +697,7 @@ public class SoundRecorder extends ActivitymRecorder.setSamplingRate(SAMPLERATE_8000);mRecorder.startRecording(MediaRecorder.OutputFormat.QCP, ".qcp", this, audioSourceType, MediaRecorder.AudioEncoder.QCELP);} else if (AUDIO_3GPP.equals(mRequestedType)) {
+                            Log.e(TAG, "kjc>>>startRecording: 3gpp source AUDIO_SOURCE_MIC\n");mRemainingTimeCalculator.setBitRate(BITRATE_3GPP);mRecorder.setChannels(1);mRecorder.startRecording(MediaRecorder.OutputFormat.THREE_GPP, ".3gpp", this, audioSourceType, MediaRecorder.AudioEncoder.AMR_NB);
@@ -724,17 +727,16 @@ public class SoundRecorder extends Activity}} else if (AUDIO_WAVE_2CH_LPCM.equals(mRequestedType)) {//WAVE LPCM  2-channel recording
+                          Log.e(TAG, "kjc>>>startRecording: wav channel_count=2\n");mRemainingTimeCalculator.setBitRate(BITRATE_3GPP);mRecorder.setChannels(2);mRecorder.setSamplingRate(SAMPLERATE_MULTI_CH);mAudioSourceType = MediaRecorder.AudioSource.MIC;
-                           mRecorder.startRecording(MediaRecorder.OutputFormat.WAVE,
-                                   ".wav", this, mAudioSourceType, MediaRecorder.AudioEncoder.LPCM);
+                          mRecorder.startRecording(MediaRecorder.OutputFormat.WAVE, ".wav", this, mAudioSourceType, MediaRecorder.AudioEncoder.LPCM);} else if (AUDIO_AMR_WB.equals(mRequestedType)) {mRemainingTimeCalculator.setBitRate(BITRATE_AMR_WB);mRecorder.setSamplingRate(BITRATE_AMR_WB);mRecorder.startRecording(mAudioOutputFormat, mAmrWidebandExtension, this, audioSourceType, MediaRecorder.AudioEncoder.AMR_WB);
-   } else {throw new IllegalArgumentException("Invalid output file type requested");}
diff --git a/system/media/audio/include/system/audio.h b/system/media/audio/include/system/audio.h
old mode 100644
new mode 100755
index fa80a45..b629662
--- a/system/media/audio/include/system/audio.h
+++ b/system/media/audio/include/system/audio.h
@@ -159,6 +159,7 @@ typedef enum {AUDIO_SOURCE_UNPROCESSED         = 9, /* Source for unprocessed sound.Usage examples include level measurement and rawsignal analysis. */
+    AUDIO_SOURCE_SEC_MIC             = 10, /*used for external codec mics*/AUDIO_SOURCE_CNT,AUDIO_SOURCE_MAX                 = AUDIO_SOURCE_CNT - 1,AUDIO_SOURCE_FM_TUNER            = 1998,
diff --git a/system/media/audio_effects/include/audio_effects/audio_effects_conf.h b/system/media/audio_effects/include/audio_effects/audio_effects_conf.h
index 79f08a6..e13968e 100755
--- a/system/media/audio_effects/include/audio_effects/audio_effects_conf.h
+++ b/system/media/audio_effects/include/audio_effects/audio_effects_conf.h
@@ -45,6 +45,7 @@// audio_source_t#define MIC_SRC_TAG "mic"                           // AUDIO_SOURCE_MIC
+#define SEC_MIC_SRC_TAG "sec_mic"                   // AUDIO_SOURCE_MIC#define VOICE_UL_SRC_TAG "voice_uplink"             // AUDIO_SOURCE_VOICE_UPLINK#define VOICE_DL_SRC_TAG "voice_downlink"           // AUDIO_SOURCE_VOICE_DOWNLINK#define VOICE_CALL_SRC_TAG "voice_call"             // AUDIO_SOURCE_VOICE_CALL
--
2.7.4

自测logcat log信息如下:

file_type    audiosource                    usercase                                               device

3gpp         AUDIO_SOURCE_MIC               USECASE_AUDIO_RECORD-->audio-record                    SND_DEVICE_IN_HANDSET_MIC(handset-mic)

amr          AUDIO_SOURCE_EXT_MIC           USECASE_AUDIO_RECORD_KJC-->audio-record-kjc            SND_DEVICE_IN_HANDSET_DMIC(dmic-endfire)

【Qualcomm高通音频】当内部Codec和外部Codec上都有麦克风输入,如何做到灵活切换内部外部Codec上的麦克风进行录音呢?相关推荐

  1. 【Qualcomm高通音频】如何抓去各种音频日志?

    1.logcat Log     adb logcat -b main -b system -v threadtime > /data/logcat.txt 2.kernel Log     / ...

  2. 【Qualcomm高通音频】如何区分配置ECM驻极体麦克风和MEMS硅麦克风

    如何对MEMS麦克风进行调试 如今MEMS麦克风正逐渐取代音频电路中的驻极体电容麦克风(ECM).ECM和MEMS这两种麦克风的功能相同,但各自和系统其余部分之间的连接却不一样.如今MEMS麦克风正逐 ...

  3. 【Qualcomm高通音频】在设备没有听筒时,如何强制开启免提通话模式?

    由于类似平板.贩卖机.车载等产品定义上都没有听筒这种音频设备,因此会经常遇到这样一个需求:强制免提. 以下是修改diff,请参考. 如果只是APK修改的话,可以参考: diff --git a/pac ...

  4. 【Qualcomm高通音频】外部Codec调试流程_ES7243E

    一. 调试大纲 调试正式开始之前,想办法获取以下信息:硬件设计原理图/Codec参考驱动代码/FAE联系方式. 1. 从硬件设计原理图,我们要获取到Codec芯片和CPU通过什么接口连接,包括数据传输 ...

  5. 【Qualcomm高通音频】MSM8953安卓7如何配置QUIN MI2S为从模式?

    1. pinctrl配置 高通平台配置一组I2S一般对应四个或者六个GPIO, QUIN MI2S对应GPIO88 GPIO91 GPIO92 GPIO93 对应代码文件为:kernel/msm-3. ...

  6. 【Qualcomm高通音频】如何使用QXDM、QCAT、CoolEditor音频日志抓取、解析和分析?

    一. 使用QXDM抓取音频日志 使用步骤如下:(已抓取录音日志为例) 确保qxdm和qpst软件已成功安装且qxdm软件已激活成功,把设备连接电脑上. 点击左上角菜单栏Options-->Com ...

  7. 【Qualcomm高通音频】Microphone 调试记录

    1.XML配置 1.1 主MIC的XML路径配置以及对应的原理图 <path name="speaker-mic">         <path name=&qu ...

  8. 【Qualcomm高通音频】音效调试控件介绍_FENS

    一.FENS内部框图 使用QACT音效调试软件打开一套参数,找到MBDRC打开之后看到的界面如下: 其内部功能模块主要是: a. VAD b. Noise Estimation: Stationary ...

  9. 【Qualcomm高通音频】如何使用QXDM、QCAT音频数据抓取

    一.使用qxdm抓取日志和数据 抓取所有日志 1.连接单板 2.打开Item view,Item view是所有的日志 3.选择File中的Load Default Configuration加载默认 ...

最新文章

  1. 基于CentOS 搭建 FTP 文件服务
  2. char添加一个字符_C语言动态接收多个字符串
  3. java 8 lambda sort_Java8 用Lambda表达式给List集合排序的实现|chu
  4. linux1到10累加,10个有趣的 Linux 命令
  5. ArcGIS实验教程——实验三十八:基于ArcGIS的等高线、山体阴影、山顶点提取案例教程
  6. linux shell rman删除归档_我们一起学一学渗透测试——黑客应该掌握的Linux基础
  7. 如何回答性能优化的问题,才能打动阿里面试官?
  8. javascript 西瓜一期 05-08 计算机的基本组成
  9. 中小企业如何搭建数据分析平台?
  10. 丢失数据文件和控制文件的恢复案例(zt)
  11. CDR都特价了,你还用破解版?
  12. 手动给tabcontrol的tabPage加图标图片方法
  13. 在函数中引用外部数组元素
  14. Linux操作手机端
  15. 国产内存真的来了:紫光可提供DDR3、DDR4内存芯片
  16. Java开发指南!java生成word文档修改样式
  17. 基于C++的《元素战争》基于win32框架的电脑游戏设计
  18. 四、Testbench
  19. RPM软件包和YUM软件仓库的实例
  20. 如何获得诺贝尔气人奖

热门文章

  1. 黑莓为何放弃治疗 已无人可用
  2. 如何快速分析出城市人口流动数量?
  3. 【转】一个网站都需要哪些备案
  4. python绘制饼状图图例_Python图表绘制很简单,一文带你学会如何生成带图例的饼图...
  5. 使用Mitmproxy工具进行小姐姐图片(不管什么网站,只要是.jpg格式的图片都可自动下载)的批量下载
  6. Simcom 5G模块调试记录
  7. 创凡PC120的系统安装三步曲
  8. 论文投稿目录(电子,计算机,IT)
  9. 通达信接口怎么连接主机?
  10. 解决Windows d3dx9_30.dll找不到问题