【问题标题】:How make use of the Voice API to make calls using Huawei 3g Modems?华为 3g Modem 如何使用 Voice API 拨打电话?
【发布时间】:2012-01-12 03:55:14
【问题描述】:

像我的(E1752)这样的一些华为 3g 调制解调器可以拨打和接听电话。我相信板载有 PCM 频道可以在拨打或接听电话时使用,但我没有更多信息。

我正在使用他们的名为 Mobile Partner 的应用程序,这是一个相当完整的应用程序,支持拨打和接听电话。但是我想构建自己的应用程序,它将在 Mac OS X 上运行。但我无法找到任何详细说明语音 API 和板载 PCM 通道的文档。如果有人知道这一点,请告诉我。

【问题讨论】:

  • 你能帮我理解你的答案吗

标签: macos cocoa api telephony 3g


【解决方案1】:

语音实现如下:- 您的调制解调器总共注册 5 个设备。音频通过名为“Huawei Mobile Connect - 应用程序接口”的串行端口发送。

语音(输入|输出)数据格式:

  wFormatTag = WAVE_FORMAT_PCM;
  nChannels = 1;
  nSamplesPerSec = 8000;
  nAvgBytesPerSec = 16000;
  nBlockAlign = 2;
  wBitsPerSample = 16;
  cbSize = 0;

ReadFile 或 WriteFile 操作中语音数据的块大小(对于 COM 端口)必须设置为 320 字节。在每个 ReadFile 之后必须是 WriteFile 操作(在其他选择缓冲区将溢出,调制解调器将在一段时间后重新启动)。示例:

//   BlockSize - size of buff for wave in|out operations (in my case 320*4 bytes)

   while (!bAllRead) {
    if (cInfo->hCom == INVALID_HANDLE_VALUE) {
     SetVoiceClosed(cInfo);//exit from thread
     return 0;
    }

    BOOL isRead = ReadFile(cInfo->hCom, cInfo->Header[counter].lpData + currBlocLength, 320, &nActualRead, &cInfo->o);
    if (isRead || (GetLastError() == ERROR_IO_PENDING && GetOverlappedResult(cInfo->hCom, &cInfo->o, &nActualRead, TRUE))) {
     if (nActualRead > 0) {
      // обратка
      nActualWrite = 0;
      int nActualWriteAll = 0;
      BOOL isWrite = WriteFile(cInfo->hCom, CurrBuffPtr + currBlocLength, nActualRead, &nActualWrite, &cInfo->oVoiceOut);
      while (isWrite || (GetLastError() == ERROR_IO_PENDING && GetOverlappedResult(cInfo->hCom, &cInfo->oVoiceOut, &nActualWrite, TRUE))) {
       nActualWriteAll += nActualWrite;
       if (nActualWriteAll >= nActualRead)
        break;
      }
      currBlocLength += nActualRead;
      if (currBlocLength >= BlockSize)
       bAllRead = true;
     }
     else {
      Sleep(25);// wait for voice data (resync)
      PurgeComm(cInfo->hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
     }
    }
    else {
     bAllRead = true;// there are no active call
     PurgeComm(cInfo->hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
    }
   }

类似的东西)))。我在 Internet 上找不到任何有用的信息,所以所有这些建议都是基于我的实验。我希望这很有用。

PS:希望wave in|out 操作不会对你造成问题。

PS2:对不起我的英语,我来自乌克兰。

【讨论】:

  • 哇,那太好了。缺乏这方面的文档,我认为逆向工程是唯一的出路:(
  • 您好,您可以简单地将音频 COM 端口作为“文件”传递给 FFMPEG(ffplay),它可以正常播放。设置为 1 通道、16 位有符号小端和 8kHz。您可以在应用中以相同的方式实现它。
  • hi sai 可以帮助我理解你的代码。
猜你喜欢
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
相关资源
最近更新 更多