Android通话录音流程

        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

猜你喜欢

转载自blog.csdn.net/junwua/article/details/81901420