作者归档:softsim

NFC SWP SIM卡

SWP(Single Wire Protocol)是物理层和数据链路层协议,提供了基于UICC卡C6触点的定义,电压信号S1、电流信号S2的定义,及数据比特流传输服务、总线管理,并进行错误检测、丢失重发、流量控制等机制

SWP 协议即单线协议(Single Wire Protocol),是目前 在ETSI 已有成熟技术要求和测试方法的一种用于在非接触通信模块(ContactLess Frontend: CLF)与 USIM 卡间传输信息的接口协议,确切来说 SWP 协议定义了 CLF 模块和 USIM 卡内的 SE 芯片传输信息的物理连接形式和底层信号传输要求等(包括物理层、数据链路层)。

ETSI TS 102.613
ETSI TS 102.694-1
ETSI TS 102.694-2

SWP 实现物理层和数据链路层的连接,通过 UICC 上的一个触点 C6 的电流电压变化来传递信息,实现物理数据传输、数据链路层无误传输数据、对接收和发送的数据排序、数据链路层流量控制等功能。

SWP 协议是基于全双工数字传输的模式。S1 信号通过电压的数字调制(L或 H)来传送从 CLF 到 UICC 的信息,S2 信号通过对电流的数据调制(L 或 H)来传送从 UICC 到 CLF 的信号。这样通过一个触点,单线连接即可完成信息的交互,因此,该协议被称之为单线协议。

SWP 接口可工作于两种功耗模式之下:低功耗模式和全功耗模式。如果 UICC卡处于低功耗模式,终端不应激活 YD/T1762.1-2008 的接口;如果 UICC 支持3GPP TS 102 600 中定义的 USB 接口,终端不应执行 USB 接口的附着。如果 UICC卡处于全功耗模式,终端可以独立激活任何其它 UICC 接口。

支持SWP接口,可以在手机关机的情况下,进行刷卡.

为了保证手机没电时移动支付的正常进行,标签模式需要支持无源工作,其工作原理基于电磁感应。阅读器的天线线圈产生高频的强电磁场,这种磁场穿过线圈横截面和线圈周围的空间。发射磁场的一部分磁力线穿过距阅读器线圈有一定距离的应答器的天线线圈。通过感应在天线线圈上产生电压,将其整流后作为电源提供给NFC芯片和SIM卡。为了保证手机没电时移动支付的正常进行,标签模式需要支持无源工作,其工作原理基于电磁感应。阅读器的天线线圈产生高频的强电磁场,这种磁场穿过线圈横截面和线圈周围的空间。发射磁场的一部分磁力线穿过距阅读器线圈有一定距离的应答器的天线线圈。通过感应在天线线圈上产生电压,将其整流后作为电源提供给NFC芯片和SIM卡


NFC终端不同模式下信息路由机制是不同的,在NFC终端工作在卡模拟模式时,外界POS机发送的信号会通过NFC Controller转发到SIM卡中处理,而当NFC终端工作在读写器、点对点模式时,从外部卡片或手机读取的信息将通过NFC Controller转发到NFC协议栈解析,最终转交给操作系统或客户端应用程序处理。

Android手机sim重启

IExtTelephony extPhone = IExtTelephony$Stub.asInterface(ServiceManager.getService(“extphone”));

extPhone.deactivateUiccCard(1)
extPhone.activateUiccCard(1);

com.qti.internal.telephony.ExtTelephonyServiceImpl

public int activateUiccCard(int slotId) {
return this.mCardProvisioner.activateUiccCard(slotId);
}

public int deactivateUiccCard(int slotId) {
return this.mCardProvisioner.deactivateUiccCard(slotId);
}

bindIExtTelephony.Stub(ExtTelephonyServiceImpl.activateUiccCard)

https://android.googlesource.com/device/google/marlin/+/master/telephony/internal/src/org/codeaurora/internal/IExtTelephony.aidl

TelephonyExtUtils extTelephony = TelephonyExtUtils.getInstance(mContext);

TelephonyExtUtils extTelephony = TelephonyExtUtils.getInstance(mContext);
int result = mIsChecked ?
extTelephony.activateUiccCard(mSlotId) :
extTelephony.deactivateUiccCard(mSlotId);
newProvisionedState =
extTelephony.getCurrentUiccCardProvisioningStatus(mSlotId);
return result;

https://gitlab.e.foundation/e/os/android_packages_apps_Settings/blob/v1-pie/src/com/android/settings/sim/SimSettings.java

mExtTelephony = IExtTelephony.Stub.asInterface(ServiceManager.getService(“extphone”));

ARR实例分析

Access Rule Reference 讲述了一些基本规则

ICCID的访问规则
800101900080017AA40683010A950108FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

80 (AM_TAG) 01 (Length) 01( AM_VALUE) 90 (SC_TAG) 00 (Length) 表示读和搜索,总是允许
80 01 7A (删除,终止,激活,取消,更新等操作)
A4 (根据CRT用途,要求认证) 06 83 (密钥引用标签)01 0A (ADM-1) 95 ( 使用限定标签)01 08

规则解释:
读和搜索,总是允许
删除,终止,激活,取消,更新 等操作,需要ADM-1

IMSI的访问规则
800111A40683010195010880016AA40683010A950108FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

80 01 11 (激活 和 读) A4 06 83 01 01(PIN-1) 95 01 08
80 01 6A(删除,终止,取消,更新) A4 06 83 01 0A (ADM-1) 95 01 08

800101A40683010195010880011AA40683010A950108FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

80 01 01 (读取) A4 06 83 01 01 95 01 08
80 01 1A ( 激活,取消,更新,) A4 06 83 01 0A (ADM-1)95 01 08

Ki的规则

80 01 01 (读取) 9700 (禁止)
80 01 1A (激活,取消,更新) A4 06 83 01 0A (ADM-1)950108

Opc 的规则

80 01 7B(删除,终止,激活,取消,更新,读)A4 06 83 01 0A(ADM-1) 950108

ARR自己的规则,同ICCID

ACC 同 IMSI-4

FPLMN的规则
80 01 03( 更新,读) A4 06 83 01 01 (PIN-1) 95 01 08
80 01 78(删除,终止,激活,取消) A4 06 83 01 0A (ADM-1)950108

SPN同ICCID

LOCI同FPLMN

EHPLMN同IMSI

EPS_LOCI同FPLMN
EPS_NSC同FPLMN

GSM PLMNSel同FPLMN

动态更新文件,需要修改IMSI, ICCID, Ki, OPC四个文件的访问规则)

将 1
4
7
A
F 的ARR记录内容改为
800103A406830101950108800178A40683010A950108FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
即可

Access Rule Reference

EF_ARR (Access Rule Reference)
文件 ID为 2F06 或 6F06

2F06 是 根目录下的 ARR
6F06 是 ADF目录下的ARR

如果一个EF文件的FCP(File Control Parameter)的安全属性(Security Attribute安全特性标签)为 8B(索引到扩展模式),说明EF_ARR里有对应的访问规则

所有的ARR的值,都是 TLV编码(Tag-Length-Value), 未用到的字节为FF
内容为 访问模式(Access Mode) + 安全条件(Security Condition)

访问模式数据对象(Access Mode Data Object) AM_DO, 主要描述该EF文件有哪些访问模式– 也就是有那些访问指令可以用于该文件—读,写,激活,取消等等。

安全条件数据对象(Security Condition Data Object) SC_DO, 主要描述,在使用访问指令访问该文件时, 那些相关的安全条件/过程应该被满足,这些安全条件可以用 逻辑 AND OR来联合。

AM_DO 的 TLV格式的 Tag
80— 用于DF文件, 或者 不支持Increase的EF文件
84—用于设置其他命令的访问模式
如果84后面的Value为32, 表示设置 INS(指令码)为32的指令(Increase)的访问模式

用于EF的AM值
B7 B6 B5 B4 B3 B2 B1 B0 解释
 0  –  –  –  –  –  –  –  b6-b0按照本表进行解释
 1  –  –  –  –  –  –  –  b6-b3用于厂家的专有用途,b2-b0按照本表进行解释
 –  1  –  –  –  –  –  –  删除文件
 –  – 1  –  –  –  –  –  终止文件
 –  –  –  1  –  –  –  –  激活文件
 –  –  –  –  1  –  –  –  取消文件
 –  –  –  –  –  1  –  –  写二进制,写记录,添加记录
 –  –  –  –  –  –  1  –  更新二进制,更新记录,擦除二进制
 –  –  –  –  –  –  –  1  读二进制,读记录,搜索二进制,搜索记录
用于DF的AM值
B7 B6 B5 B4 B3 B2 B1 B0 解释
 0  –  –  –  –  –  –  –  b6-b0按照本表进行解释
 1  –  –  –  –  –  –  –  b6-b3用于厂家的专有用途,b2-b0按照本表进行解释
 –  1  –  –  –  –  –  –  删除文件(self)–删除自己
 –  – 1  –  –  –  –  –  终止文件,如果针对MF操作,就是终止卡的使用
 –  –  –  1  –  –  –  –  激活文件
 –  –  –  –  1  –  –  –  取消文件
 –  –  –  –  –  1  –  –  创建文件–DF创建
 –  –  –  –  –  –  1  – 创建文件–EF创建
 –  –  –  –  –  –  –  1  删除文件(child)–删除子目录和子文件
安全条件SC_DO
TAG标签 L长度 VALUE 解释
 90  00  –  总是允许
 97  00  –  总是禁止
 A4  x  CRT  根据CRT的用途,要求认证(外部认证或者用户认证)
 A0  x  SC_DO   多个SC_DO进行  逻辑OR操作
 AF  x  SC_DO  多个SC_DO进行  逻辑AND操作

CRT(Control Reference Template )控制引用模版
SC_DO通过 编码为CRT的扩展格式,也就是使用标签 A4 来 完成扩展

PIN 到 密钥的映射
CRT标签 长度 *密钥引用标签 *长度 *值 -使用限定标签 -长度 -值 访问条件 级别
90  00  –  –  –  –  –  –  总是允许  0
A4  06  83  01  01  95  01  08  PIN -1  1
 A4  06  83  01  08  95  01  08  PIN-8
 A4  06  83  01  09  95  01  08  RFU
 A4  06  83  01  0A  95  01  08  ADM-1  5
 A4  06  83  01  0E  95  01  08  ADM-5
 A4  06  83  01 11  95  01  08  PIN Universal  1
 A4  06  83  01  81  95  01 08  Second PIN-1  2
 A4  06  83  01  8A  95  01  08  ADM-6  6
 A4  06  83  01  8E  95  01  08  ADM-10
 XX  06  83  01  90-9E  95  01  08  RFI3(Local)  4
 97  00  –  –  –  –  –  –   总是禁止  7

83 表示密钥应用

菲律宾Globe卡

1/4 Welcome to China! Great stories are waiting so travla with data romaing for as low as P99/day! Choose from Viber, Instangram, Facebook with Messenger or

2/4 all-access data roaming packs. Take your pick from promos that you can use for 1,3 or 5 days! Dial *143# and select Roaming and Intl to register.Please

3/4 ensure you’re connected to China Unicom and your phone’s APN is set to internet.globe.com.ph. For assistance, call +6327301212 toll-free using your Globe

4/4 phone.

============

1/4 Maligayang pagdating sa China! Pwede mo nang i-share ang experience mo abroad with data roaming for as low as P99/day! Pwede mong pagilian and FB w/

2/4 Messenger, Instagram, Viber o all-access data roaming packs. I-dial ang *143# at piliin ang Roaming para mag-register. Siguraduhing naka-connect ka sa

3/4 China Unicom GSM at ang APN setting ng iyong phone ay internet.globe.com.ph. Maaari ding tumawag sa +6327301212 toll-free gamit ang iyong TM phone for

4/4 more info.

充值卡使用方法:

  1. 手机拨打*143#,选择MyAccount(选择对应的数字,按回复)
  2. 选择 Load Call Card
  3. 先输入10位的call card number,再输入6位的PIN
  4. 充值成功后会有短信通知

菲律宾globe电话卡可以在中国大陆使用,漫游后的服务商为中国联通

无月租费,不使用不要钱.接收短信免费。充值后有效期为一年,充值10P可延长一年。当手机卡内余额多于60P时,在国内才可以被拨通;当余额多于120P时才可以拨出电话。

手机拨打*143#,选择MyAccount(选择对应的数字,按回复),然后再回复2,继续回复1即可查询本机号码余额及有效期

手机卡背面”9″开头的10位数字就是电话号码,也可以插卡后查本机号码。

现在拨打 *143# 可以直接显示余额

查有效期,只能去Globe One App

联通卡写入移动数据后

6FD9(EHPLMN) 64F010FFFFFFFFFFFFFFFFFF => 64F000FFFFFFFFFFFFFFFFFF
6F7B(FPLMN) 64F00064F02064F04064F07064F08064F03064F011FFFFFF =>
64F01064F06064F09064F03064F011FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

6F62(HPLMNwact) 64F010400064F090400064F010800064F0908000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000 =>

6F61(OPLMNwact) 64F010400064F090400064F010800064F0908000FFFFFF0000

FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000

FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000

FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000

FFFFFF0000FFFFFF0000FFFFFF0000

FFFFFF0000FFFFFF0000FFFFFF0000

FFFFFF0000FFFFFF0000FFFFFF0000

FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000

       改成   64F000400064F020400064F000800064F0208000FFFFFF0000

6F60 (PLMNwact) 64F010400064F090400064F010800064F0908000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000

          改成 64F000400064F020400064F000800064F0208000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000

7F20_6F30 64F010FFFFFFFFFFFFFFFFFFFFFFFFFF

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

FFFFFFFFFFFFFFFFFFFFFFFFFF

FFFFFFFFFFFFFFFFFFFFFFFFFFFFF
改成 64F000FFFFF

mtk Helio A22音频驱动

Helio A22

/dev/snd

pcmC0D10p pcmC0D14p pcmC0D17p pcmC0D1c  pcmC0D23p pcmC0D26c pcmC0D28p pcmC0D30c pcmC0D32c pcmC0D5c pcmC0D7p sequencer  
pcmC0D11p pcmC0D15c pcmC0D18c pcmC0D20p pcmC0D24p pcmC0D26p pcmC0D29p pcmC0D30p pcmC0D3c  pcmC0D5p pcmC0D8p sequencer2 
controlC0 pcmC0D12c pcmC0D16c pcmC0D18p pcmC0D21p pcmC0D25c pcmC0D27c pcmC0D2c  pcmC0D31c pcmC0D3p  pcmC0D6c pcmC0D9c timer      
pcmC0D0p  pcmC0D13c pcmC0D17c pcmC0D19p pcmC0D22c pcmC0D25p pcmC0D28c pcmC0D2p  pcmC0D31p pcmC0D4p  pcmC0D6p seq  

/vendor/lib/hw/audio.primary.mt6765.so
setBGSDlMute
setBGSUlMute

platform/common/hardware/audio/V3/aud_drv/AudioALSAHardware.cpp

...
// Set BGS Mute
static String8 keySet_BGS_DL_Mute = String8("Set_BGS_DL_Mute");
static String8 keySet_BGS_UL_Mute    = String8("Set_BGS_UL_Mute");
// Set Phone Call Mute
static String8 keySet_SpeechCall_DL_Mute = String8("Set_SpeechCall_DL_Mute");
static String8 keySet_SpeechCall_UL_Mute = String8("Set_SpeechCall_UL_Mute");

...


    // Set BGS DL Mute (true) / Unmute(false)
    if (param.getInt(keySet_BGS_DL_Mute, value) == NO_ERROR)
    {
        param.remove(keySet_BGS_DL_Mute);
        ALOGD("%s(), %s", __FUNCTION__, keyValuePairs.string());
        mStreamManager->setBGSDlMute((bool)value);
    }

    // Set BGS UL Mute (true) / Unmute(false)
    if (param.getInt(keySet_BGS_UL_Mute, value) == NO_ERROR)
    {
        param.remove(keySet_BGS_UL_Mute);
        ALOGD("%s(), %s", __FUNCTION__, keyValuePairs.string());
        mStreamManager->setBGSUlMute((bool)value);
    }

    // Set SpeechCall DL Mute (true) / Unmute(false)
    if (param.getInt(keySet_SpeechCall_DL_Mute, value) == NO_ERROR)
    {
        param.remove(keySet_SpeechCall_DL_Mute);
        ALOGD("%s(), %s", __FUNCTION__, keyValuePairs.string());
        mSpeechPhoneCallController->setDlMute((bool)value);
    }

    // Set SpeechCall UL Mute (true) / Unmute(false)
    if (param.getInt(keySet_SpeechCall_UL_Mute, value) == NO_ERROR)
    {
        param.remove(keySet_SpeechCall_UL_Mute);
        ALOGD("%s(), %s", __FUNCTION__, keyValuePairs.string());
        mSpeechPhoneCallController->setUlMute((bool)value);
    }

platform/mt6735/hardware/audio/aud_drv/AudioALSAStreamOut.cpp

开启通话背景音:
  Set_BGS_UL_Mute=0 关闭背景音上行的静音, 也就是让对方能听到
  Set_SpeechCall_UL_Mute=1 打开mic上行的静音, 也就是让对方听不到这边mic的声音
  Set_BGS_DL_Mute=1 开启背景音下行静音, 让自己听不到背景音

platform/mt6735/hardware/audio/aud_drv/AudioALSAStreamManager.cpp


AudioALSAStreamManager::AudioALSAStreamManager() :
    mStreamOutIndex(0),
    mStreamInIndex(0),
    mPlaybackHandlerIndex(0),
    mCaptureHandlerIndex(0),
    mSpeechPhoneCallController(AudioALSASpeechPhoneCallController::getInstance()),
    mFMController(AudioALSAFMController::getInstance()),
    mAudioALSAVolumeController(AudioVolumeFactory::CreateAudioVolumeController()),
    mSpeechDriverFactory(SpeechDriverFactory::GetInstance()),
    mAudioSpeechEnhanceInfoInstance(AudioSpeechEnhanceInfo::getInstance()),
    mMicMute(false),
    mAudioMode(AUDIO_MODE_NORMAL),
    mFilterManagerNumber(0),
    mBesLoudnessStatus(false),
    mBesLoudnessControlCallback(NULL),
//#ifdef MTK_VOW_SUPPORT  
    mAudioALSAVoiceWakeUpController(AudioALSAVoiceWakeUpController::getInstance()),
//#endif   
    mVoiceWakeUpNeedOn(false),
    mForceDisableVoiceWakeUpForSetMode(false),
    mBypassPostProcessDL(false),
    mHeadsetChange(false),
    mBGSDlGain(0xFF),
    mBGSUlGain(0),
    mBypassDualMICProcessUL(false)
{

....

mBGSDlGain 下行增益, 影响到 自己这边听到的声音大小, 最大值是0xFF(256),
mBGSUlGain 上行增益, 影响到 对方听到的声音大小, 最小值是0

所以,默认设置是 自己听得到, 对方听不到

status_t AudioALSAStreamManager::setBGSDlMute(const bool mute_on)
{
    if (mute_on)
    {
        mBGSDlGain = 0;
    }
    else
    {
        mBGSDlGain = 0xFF;
    }
    ALOGD("%s(), mute_on: %d, mBGSDlGain=0x%x", __FUNCTION__, mute_on, mBGSDlGain);

    return NO_ERROR;
}

...

status_t AudioALSAStreamManager::setBGSUlMute(const bool mute_on)
{
    if (mute_on)
    {
        mBGSUlGain = 0;
    }
    else
    {
        mBGSUlGain = 0xFF;
    }
    ALOGD("%s(), mute_on: %d, mBGSUlGain=0x%x", __FUNCTION__, mute_on, mBGSUlGain);

    return NO_ERROR;
}


可以通过 setBGSDlMute 函数来设置 mBGSDlGain变量的大小

hardware/audio/speech_driver/AudioALSASpeechPhoneCallController.cpp


void AudioALSASpeechPhoneCallController::setDlMute(const bool mute_on)
{

    ALOGD("%s(), new mute_on = %d, old mDlMute = %d", __FUNCTION__, mute_on, mDlMute);
    AudioAutoTimeoutLock _l(mLock);

    mSpeechDriverFactory->GetSpeechDriver()->SetDownlinkMute(mute_on);

    property_set(PROPERTY_KEY_DL_MUTE_ON, (mute_on == false) ? "0" : "1");
    mDlMute = mute_on;
}

void AudioALSASpeechPhoneCallController::setUlMute(const bool mute_on)
{
    ALOGD("+%s(), new mute_on = %d, old mULMute = %d", __FUNCTION__, mute_on, mUlMute);
    AudioAutoTimeoutLock _l(mLock);

    mSpeechDriverFactory->GetSpeechDriver()->SetUplinkSourceMute(mute_on);

    property_set(PROPERTY_KEY_UL_MUTE_ON, (mute_on == false) ? "0" : "1");
    mUlMute = mute_on;
}


 

platform/common/hardware/audio/V3/aud_drv/AudioALSAPlaybackHandlerVoice.cpp


...
status_t AudioALSAPlaybackHandlerVoice::open()
{
    ALOGD("+%s(), audio_mode = %d, u8BGSUlGain = %d, u8BGSDlGain = %d", __FUNCTION__, mStreamAttributeSource->audio_mode, mStreamAttributeSource->u8BGSUlGain, mStreamAttributeSource->u8BGSDlGain);

    ALOGD("%s() mStreamAttributeSource->audio_format =%d", __FUNCTION__,mStreamAttributeSource->audio_format);

    // debug pcm dump
    OpenPCMDump(LOG_TAG);


    // HW attribute config // TODO(Harvey): query this
    mStreamAttributeTarget.audio_format = AUDIO_FORMAT_PCM_16_BIT;
    mStreamAttributeTarget.audio_channel_mask = mStreamAttributeSource->audio_channel_mask; // same as source stream
    mStreamAttributeTarget.num_channels = android_audio_legacy::AudioSystem::popCount(mStreamAttributeTarget.audio_channel_mask);
    mStreamAttributeTarget.sample_rate = ChooseTargetSampleRate(mStreamAttributeSource->sample_rate); // same as source stream
    ALOGD("mStreamAttributeTarget sample_rate = %d mStreamAttributeSource sample_rate = %d",mStreamAttributeTarget.sample_rate,mStreamAttributeSource->sample_rate);
    mStreamAttributeTarget.u8BGSDlGain = mStreamAttributeSource->u8BGSDlGain;
    mStreamAttributeTarget.u8BGSUlGain = mStreamAttributeSource->u8BGSUlGain;

    // bit conversion
    initBitConverter();


    // open background sound
    mBGSPlayer->mBGSMutex.lock();

    if (mStreamAttributeTarget.num_channels > 2)
    {
        mBGSPlayer->CreateBGSPlayBuffer(
            mStreamAttributeTarget.sample_rate,
            2,
            mStreamAttributeTarget.audio_format);

    }
    else
    {
        mBGSPlayer->CreateBGSPlayBuffer(
            mStreamAttributeTarget.sample_rate,
            mStreamAttributeTarget.num_channels,
            mStreamAttributeTarget.audio_format);
    }
    mBGSPlayer->Open(SpeechDriverFactory::GetInstance()->GetSpeechDriver(), mStreamAttributeTarget.u8BGSUlGain, mStreamAttributeTarget.u8BGSDlGain);

    mBGSPlayer->mBGSMutex.unlock();

    ALOGD("-%s()", __FUNCTION__);
    return NO_ERROR;
}
....


可以看到 上下行增益 怎么传递过来的

mtk通话背景音

vendor/mediatek/proprietary/platform/common/hardware/audio/V3/aud_drv/AudioALSAPlaybackHandlerVoice.cpp

vendor/mediatek/proprietary/platform/common/hardware/audio/V3/speech_driver/SpeechMessengerEVDO.cpp

vendor/mediatek/proprietary/platform/common/hardware/audio/V3/speech_driver/SpeechMessengerDSDA.cpp

vendor/mediatek/proprietary/platform/common/hardware/audio/V3/speech_driver/SpeechMessengerECCCI.cpp

vendor/mediatek/proprietary/platform/common/hardware/audio/V2/speech_driver/SpeechMessengerCCCI.cpp

vendor/mediatek/proprietary/platform/common/hardware/audio/V2/speech_driver/SpeechMessengerEEMCS.cpp

vendor/mediatek/proprietary/platform/common/hardware/audio/speech_driver/SpeechBGSPlayer.cpp

vendor/mediatek/proprietary/platform/mt6735/hardware/audio/speech_driver/AudioALSASpeechPhoneCallController.cpp

vendor/mediatek/proprietary/platform/common/hardware/audio/V3/include/SpeechMessengerDSDA.h

vendor/mediatek/proprietary/platform/common/hardware/audio/V3/include/SpeechMessengerECCCI.h

vendor/mediatek/proprietary/platform/common/hardware/audio/V3/include/AudioALSAPlaybackHandlerVoice.h

vendor/mediatek/proprietary/platform/common/hardware/audio/V2/include/SpeechMessengerCCCI.h

vendor/mediatek/proprietary/platform/common/hardware/audio/include/SpeechBGSPlayer.h

vendor/mediatek/proprietary/platform/common/hardware/audio/include/SpeechMessengerInterface.h

———————

vendor/mediatek/proprietary/platform/mt6735/hardware/audio/aud_drv/AudioALSAStreamOut.cpp

status_t AudioALSAStreamOut::setParameters(const String8 &keyValuePairs)