最近遇到一个项目,既用到高通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)