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

本文介绍了一种设计思路,用于实现在Android设备上通过原生API在高通PMU芯片内置Codec与外部I2S总线连接的两个麦克风之间进行录音源的切换。设计中利用AudioSourceType作为区分点,通过新增usecase和修改音频框架代码,实现了内部与外部Codec麦克风的灵活切换。
最低0.47元/天 解锁文章
2053

被折叠的 条评论
为什么被折叠?



