【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.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上的麦克风进行录音呢?相关推荐
- 【Qualcomm高通音频】如何抓去各种音频日志?
1.logcat Log adb logcat -b main -b system -v threadtime > /data/logcat.txt 2.kernel Log / ...
- 【Qualcomm高通音频】如何区分配置ECM驻极体麦克风和MEMS硅麦克风
如何对MEMS麦克风进行调试 如今MEMS麦克风正逐渐取代音频电路中的驻极体电容麦克风(ECM).ECM和MEMS这两种麦克风的功能相同,但各自和系统其余部分之间的连接却不一样.如今MEMS麦克风正逐 ...
- 【Qualcomm高通音频】在设备没有听筒时,如何强制开启免提通话模式?
由于类似平板.贩卖机.车载等产品定义上都没有听筒这种音频设备,因此会经常遇到这样一个需求:强制免提. 以下是修改diff,请参考. 如果只是APK修改的话,可以参考: diff --git a/pac ...
- 【Qualcomm高通音频】外部Codec调试流程_ES7243E
一. 调试大纲 调试正式开始之前,想办法获取以下信息:硬件设计原理图/Codec参考驱动代码/FAE联系方式. 1. 从硬件设计原理图,我们要获取到Codec芯片和CPU通过什么接口连接,包括数据传输 ...
- 【Qualcomm高通音频】MSM8953安卓7如何配置QUIN MI2S为从模式?
1. pinctrl配置 高通平台配置一组I2S一般对应四个或者六个GPIO, QUIN MI2S对应GPIO88 GPIO91 GPIO92 GPIO93 对应代码文件为:kernel/msm-3. ...
- 【Qualcomm高通音频】如何使用QXDM、QCAT、CoolEditor音频日志抓取、解析和分析?
一. 使用QXDM抓取音频日志 使用步骤如下:(已抓取录音日志为例) 确保qxdm和qpst软件已成功安装且qxdm软件已激活成功,把设备连接电脑上. 点击左上角菜单栏Options-->Com ...
- 【Qualcomm高通音频】Microphone 调试记录
1.XML配置 1.1 主MIC的XML路径配置以及对应的原理图 <path name="speaker-mic"> <path name=&qu ...
- 【Qualcomm高通音频】音效调试控件介绍_FENS
一.FENS内部框图 使用QACT音效调试软件打开一套参数,找到MBDRC打开之后看到的界面如下: 其内部功能模块主要是: a. VAD b. Noise Estimation: Stationary ...
- 【Qualcomm高通音频】如何使用QXDM、QCAT音频数据抓取
一.使用qxdm抓取日志和数据 抓取所有日志 1.连接单板 2.打开Item view,Item view是所有的日志 3.选择File中的Load Default Configuration加载默认 ...
最新文章
- 基于CentOS 搭建 FTP 文件服务
- char添加一个字符_C语言动态接收多个字符串
- java 8 lambda sort_Java8 用Lambda表达式给List集合排序的实现|chu
- linux1到10累加,10个有趣的 Linux 命令
- ArcGIS实验教程——实验三十八:基于ArcGIS的等高线、山体阴影、山顶点提取案例教程
- linux shell rman删除归档_我们一起学一学渗透测试——黑客应该掌握的Linux基础
- 如何回答性能优化的问题,才能打动阿里面试官?
- javascript 西瓜一期 05-08 计算机的基本组成
- 中小企业如何搭建数据分析平台?
- 丢失数据文件和控制文件的恢复案例(zt)
- CDR都特价了,你还用破解版?
- 手动给tabcontrol的tabPage加图标图片方法
- 在函数中引用外部数组元素
- Linux操作手机端
- 国产内存真的来了:紫光可提供DDR3、DDR4内存芯片
- Java开发指南!java生成word文档修改样式
- 基于C++的《元素战争》基于win32框架的电脑游戏设计
- 四、Testbench
- RPM软件包和YUM软件仓库的实例
- 如何获得诺贝尔气人奖