Android手机现在基本上都有通话录音的功能。那么这个功能的原理是什么呢,
原理:语音通话包含uplink 和downlink数据,因此只要分别获取这两部数据,然后将PCM
格式的语音流转存成其他格式的文件即可,通过Modem To App的某种内存共享机制传输数据;
1. 通过Mic获取uplink data
//The framesize should be indicated by DSP, especially in call record
framesize = SAL_PcmEx_GetBufLen(SAL_PCMEX_BUF_SE);
/* handle uplink data from 1st mic */
dspAddr = SAL_PcmEx_GetBuf(SAL_PCMEX_BUF_SE);
IDMA_ReadFromDSP(buf, dspAddr, (uint32)framesize);
解释: SE负责对uplink data,进行Encrypt和Encode,即以3G,4G的协议编码
2. 获取DSP的downlink Data
// get downlink data
dlFrameSize = SAL_PcmEx_GetBufLen(SAL_PCMEX_BUF_SD);
dspAddr = SAL_PcmEx_GetBuf(SAL_PCMEX_BUF_SD);
IDMA_ReadFromDSP(/*dualMicOrDlTempBuf*/buf+framesize, dspAddr, (uint32)dlFrameSize);
解释: SD负责对网络下行数据进行Decode; 由于每次上下行的数据包都很小,所以在
数据简单的叠加,人耳并不会听出其中有什么延时,能同时听到双方的声音。
3. 发送数据to App
void spc_record_sendPcmData(void)
SpcIO_WriteDataToAp
spcIO_sendDataViaCCCI
4. Android 侧的发起端
audio/common/speech_driver/SpeechDriverNormal.cpp
SpeechDriverNormal::sendSpeechMessageToModem
sendMailbox(&sph_msg, MSG_A2M_RECORD_RAW_PCM_ON, param_16bit, 0);
5. MTK整了M2A之间的机制sendMailbox
sendMailbox