Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何利用语音API使用华为3g调制解调器拨打电话?_Macos_Cocoa_Api_Telephony_3g - Fatal编程技术网

Macos 如何利用语音API使用华为3g调制解调器拨打电话?

Macos 如何利用语音API使用华为3g调制解调器拨打电话?,macos,cocoa,api,telephony,3g,Macos,Cocoa,Api,Telephony,3g,一些华为3g调制解调器(如我的(E1752))能够拨打和接听电话。我相信船上有PCM频道,可以在拨打或接听电话时使用,但我没有关于这方面的更多信息 我正在使用他们名为移动合作伙伴的应用程序,这是一个相当完整的应用程序,支持拨打和接听电话。但我想建立自己的应用程序,将运行在Mac OS X上。但我无法找到任何详细说明语音API和板载PCM频道的文档。如果有人知道这一点,请告诉我 语音的实现如下:-您的调制解调器总共注册了5台设备。音频通过名为“华为移动连接-应用程序接口”的串行端口发送 语音(输入

一些华为3g调制解调器(如我的(E1752))能够拨打和接听电话。我相信船上有PCM频道,可以在拨打或接听电话时使用,但我没有关于这方面的更多信息

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


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

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

读文件或写文件操作(用于COM端口)中语音数据的块大小必须设置为320字节。每次读取文件后都必须执行写文件操作(在其他选项中,缓冲区将溢出,调制解调器将在一段时间后重新启动)。样本:

诸如此类的事。我在网上找不到任何有用的信息,所以所有的推荐都是基于我的实验。我希望这是有用的

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


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

哇,那太好了。这方面缺乏相关文档,我认为逆向工程是唯一的前进方向:(您好,您可以简单地将音频COM端口作为“文件”传递给FFMPEG(ffplay)输入)播放效果很好。设置为1频道、16位带符号的little endian和8kHz。你可以在应用程序中以同样的方式实现。hi-sai可以帮助我理解你的代码。你可以帮助我理解你的答案吗
  wFormatTag = WAVE_FORMAT_PCM;
  nChannels = 1;
  nSamplesPerSec = 8000;
  nAvgBytesPerSec = 16000;
  nBlockAlign = 2;
  wBitsPerSample = 16;
  cbSize = 0;
//   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);
    }
   }