Как использовать Voice API для звонков с помощью модемов Huawei 3g? - PullRequest
6 голосов
/ 03 декабря 2011

Некоторые модемы Huawei 3g, такие как мой (E1752), имеют возможность совершать и принимать звонки.Я считаю, что на борту есть канал PCM, который можно использовать во время совершения или приема звонков, но у меня нет больше информации об этом.

Я использую их приложение под названием Mobile Partner, которое является довольно полным приложением, котороеподдерживает совершение и прием звонков.Но я хочу создать собственное приложение, которое будет работать на Mac OS X. Но я не могу найти какие-либо документы, детализирующие Voice API и встроенный канал PCM.Если кто-нибудь знает об этом, пожалуйста, дайте мне знать.

Спасибо, Гаррид Mobile Partner app with support for Voice Calls

1 Ответ

9 голосов
/ 14 декабря 2011

Голос реализован следующим образом: - Ваш модем регистрирует всего 5 устройств. Звук передается через последовательный порт с именем «Huawei Mobile Connect - Application Interface».

Формат голосовых (in | out) данных:

  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);
    }
   }

Как то так))).Я не нахожу никакой полезной информации в Интернете, поэтому все эти рекомендации основаны на моих экспериментах.Я надеюсь, что это было полезно.

PS: Я надеюсь, что операции с выходом волны не будут для вас проблемой.

PS2: Извините за мой английский, я из Украины.

...