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

本文介绍了一种设计思路,用于实现在Android设备上通过原生API在高通PMU芯片内置Codec与外部I2S总线连接的两个麦克风之间进行录音源的切换。设计中利用AudioSourceType作为区分点,通过新增usecase和修改音频框架代码,实现了内部与外部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,
                                 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值