Domanda

Alcuni modem Huawei 3G come Mine (E1752) hanno la capacità di effettuare e ricevere chiamate. Credo che a bordo ci sia un canale PCM che può essere utilizzato durante la produzione o la ricezione delle chiamate, ma non ho ulteriori informazioni al riguardo.

Sto usando la loro app chiamata partner mobile, che è un'app abbastanza completa che supporta le chiamate. Ma voglio costruire la mia app che verrà eseguita su Mac OS X. Ma non sono in grado di individuare alcun documento che dettaglia l'API vocale e il canale PCM a bordo. Se qualcuno ne è a conoscenza, fammelo sapere.

Mobile Partner app with support for Voice Calls

È stato utile?

Soluzione

La voce è implementata come segue: - Il tuo modem registra un totale di 5 dispositivi. L'audio viene inviato attraverso la porta seriale denominata "Huawei Mobile Connect - Interfaccia dell'applicazione".

Format of Voice (in | out) Dati:

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

È necessario impostare la dimensione del blocco dei dati vocali nelle operazioni di readfile o writefile (per porta com) 320 byte. Dopo che ogni readfile deve essere l'operazione WriteFile (in altri buffer di scelta sarà troppo pieno e il modem si riavvierà dopo un po 'di tempo). Campione:

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

Qualcosa del genere))). Non trovo informazioni utili in Internet, quindi tutte le raccomandazioni basate sui miei esperimenti. Spero che sia stato utile.

PS: spero che Wave in | Out Operations non sarà un problema per te.

PS2: Scusa per il mio inglese, vengo dall'Ucraina.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top