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

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

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

 

设计思路:

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

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

packages/apps/SoundRecorder/src/com/android/soundrecorder/SoundRecorder.java
 	                    if (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.diff

Change-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.cpp
 mode change 100644 => 100755 frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
 mode change 100644 => 100755 frameworks/av/services/audiopolicy/service/AudioPolicyEffects.cpp
 mode change 100644 => 100755 frameworks/base/media/java/android/media/AudioAttributes.java
 mode change 100644 => 100755 frameworks/base/media/java/android/media/AudioRecordingConfiguration.java
 mode change 100644 => 100755 frameworks/wilhelm/src/android/AudioRecorder_to_android.cpp
 mode change 100644 => 100755 hardware/qcom/audio/hal/audio_extn/ssr.c
 mode change 100644 => 100755 hardware/qcom/audio/hal/audio_hw.c
 mode change 100644 => 100755 hardware/qcom/audio/hal/audio_hw.h
 mode change 100644 => 100755 hardware/qcom/audio/hal/msm8916/platform.c
 mode change 100644 => 100755 system/media/audio/include/system/audio.h

diff --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) cons
 
     case 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; // 0x5
     field public static final int DEFAULT = 0; // 0x0
+    field public static final int SEC_MIC = 10; // 0xa
     field public static final int MIC = 1; // 0x1
     field public static final int REMOTE_SUBMIX = 8; // 0x8
     field 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; // 0x5
     field public static final int DEFAULT = 0; // 0x0
+    field public static final int SEC_MIC = 10; // 0xa
     field public static final int HOTWORD = 1999; // 0x7cf
     field public static final int MIC = 1; // 0x1
     field 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; // 0x5
     field public static final int DEFAULT = 0; // 0x0
+    field public static final int SEC_MIC = 10; // 0xa
     field public static final int MIC = 1; // 0x1
     field public static final int REMOTE_SUBMIX = 8; // 0x8
     field 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 MediaRecorder
         switch(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_d
     snd_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_d
             else 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 Activity
     private 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 Activity
 	                        mRecorder.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 raw
                                              signal 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)

 

 

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值