Come utilizzare l'API vocale per effettuare chiamate usando i modem Huawei 3G?
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.
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.