Появились некоторые сдвиги.
В сети пишут, что модем определяется как 3 виртуальных порта. USB0 и USB2 служат для AT команд, а USB1 для передачи звука.
Через Putty я обнаружил 3 устройства: ttyUSB0, ttyUSB1, ttyUSB2. Команды посылал в USB2, с него же считывал ответ.
Вызов и приём звонков работают.
При входящих в USB2 появляются сообщения RING. Снятие трубки осуществляется записью в этот порт команды АТА. После этого, для того чтобы получить звуковые данные, в этот же порт нужно записать команду AT^DDSETEX=2. После её выполнения, звуковые данные входящего вызова поступают в порт USB1.
В сети есть информация, что звук 3g модема идёт одноканальный, в формате PCM 8кГц, 16 бит, signed.
Чтобы послушать, вместо Putty пришлось писать простенькую консольную программу. Работает она так: создаётся 4 звуковых буфера, размеров 4096 байт, фиксируются в памяти и передаются в поток, где они последовательно заполняются данными с USB1 и передаются в очередь звукового драйвера. В общем, звук появился, но о качестве и говорить не приходится. Слышится какое то жужжанье - скрипение, интенсивность которого явно находится в строгой зависимости от громкости голоса исходящего вызова. Но саму речь разобрать невозможно. Может ошибка в программе, привожу код функции потока, в которой происходит вся обработка
static DWORD __stdcall put_audio(void* param) {
WAVEHDR* whdr = reinterpret_cast<WAVEHDR*>(param);
Telnet* pSOC = reinterpret_cast<Telnet*>(whdr[0].dwUser);
HWAVEOUT* phWO = reinterpret_cast<HWAVEOUT*>(whdr[1].dwUser);
static int n_play=0, n_set=0, pos=0;
static char buffer[BUFFER_LENGTH]; // буфер для чтения данных порта USB
char uu[100];
int ds=0; // число неумещающихся семплов
while(1) {
int n_byte = pSOC->read_data(buffer);
if (n_byte == 0) continue;
_itoa(n_byte,uu,10); // вывод числа считанных бит
printf(uu); printf("/n");
if(n_byte == SOCKET_ERROR)
{puts("\nПроизошёл сброс при чтение данных сервером !!!"); break;}
if (pos+n_byte <= 4096){
memcpy(whdr[n_set].lpData+pos, buffer, n_byte);
pos+=n_byte; if (pos==4096)
{waveOutWrite(*phWO, &whdr[n_set], sizeof(whdr[n_set])); pos=0; n_set++; if (n_set==4) n_set=0; }
}
else {
ds=pos+n_byte-4096;
memcpy(whdr[n_set].lpData+pos, buffer, n_byte-ds);
waveOutWrite(*phWO, &whdr[n_set], sizeof(whdr[n_set]));
n_set++; if (n_set==4) n_set=0;
memcpy(whdr[n_set].lpData, buffer+n_byte-ds, ds);
pos+=n_byte; pos-=4096;
}
if (pos%2!=0) pos--; // контроль чётности
}
return 0U;
}
Но может быть дело и не в программе, а проблемы с кодировкой. В сети пишут, что для передачи звука нужно записывать в USB1 каждые 0,2 сек по 320 байт звука вышеуказанного формата. Этого я понять не могу. Ведь 320/2/0,2=800 Гц, а не 8000. Что же получается, нужно записывать с пропусками, или как? Может тогда и при чтении данные нужно как то модифицировать?