powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / В код надо добавить кейс чтоб не было преобр. формата 8000 Hz 16-Bit <> 8000 Hz 8-Bit
12 сообщений из 12, страница 1 из 1
В код надо добавить кейс чтоб не было преобр. формата 8000 Hz 16-Bit <> 8000 Hz 8-Bit
    #38920596
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть виртуальный голосовой модем, с т.зрения программ, которые должны с ним работать он поддерживат аудио-форматы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
at+vsm=?
1,"UNSIGNED PCM",8,0,(8000),(0),(0)
4,"ULAW",8,0,(8000),(0),(0)
5,"ALAW",8,0,(8000),(0),(0)
128,"8-BIT LINEAR",8,0,(8000),(0),(0)
129,"ADPCM (NOT USED)",0,0,(0),(0),(0)
130,"UNSIGNED PCM",8,0,(8000),(0),(0)
131,"ULAW",8,0,(8000),(0),(0)
132,"ALAW",8,0,(8000),(0),(0)


Суть в том что все эти форматы - 8 bit 8000Hz.
Хочется добавить стандартный формат:
"PCM",16,0,(8000),(0),(0)
Т.е. 16 bit 8000Hz.

Место кода, которое занимается преобразованием "туда-обратно" мне известно.
Мне нужно добавить case, который вообще не делает никакого преобразования, но я туплю, плаваю в C++:
Вот код, думаю выписал все необходимое:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
    case stRecv:
      {
        BYTE Buf[1024];
        int count;
...
                const PInt16 *ps = (const PInt16 *)Buf;
                signed char *pb = (signed char *)Buf;

                count /= sizeof(*ps);

                switch (P.Vcml()) {
                  case 0:
                    while (count--)
                      *pb++ = (signed char)((*ps++)/256);
                  break;
                  case 1:
                  case 128:
                  case 130:
                    while (count--)
                      *pb++ = (signed char)((*ps++ + 0x8000)/256);
                    break;

...

        case stSend:
...
            int dt = dataType;
            BYTE Buf[1024];

           for(;;) {
              int count = dleData.GetData(Buf, sizeof(Buf));
...
                      const signed char *pb = (const signed char *)Buf;
                      PInt16 Buf2[sizeof(Buf)];
                      PInt16 *ps = Buf2;

                      switch (P.Vcml()) {
                        case 0:
                          while (count--)
                            *ps++ = (PInt16)((PInt16)(*pb++)*256);
                          break;
                        case 1:
                        case 128:
                        case 130:
                          while (count--)
                            *ps++ = (PInt16)((PInt16)(*pb++)*256 - 0x8000);
                          break;
...
                      count = int(pb - (const signed char *)Buf);

                      currentClassEngine->Send(Buf2, count*sizeof(*ps));



case 0: -это SIGNED PCM 8bits 8000Hz
case 1,128,130 -это UNSIGNED PCM 8bits 8000Hz
Если я правильно секу то код как раз делает преобразование между 16bit 8000Hz и 8bits 8000Hz(в 2-х вариантах).
Остальные варианты linear-ulaw, linear-alaw приводить не стал, дабы не запутывать.

Дык вот мне надо добавить кейс, где преобразование полностью отсутствует, т.е. ps=pb (Buf=Buf2)

Как сделать?

Проблема связана с желанием использовать модем под TAPI-драйвер, а он завязан на "Wave Unimodem transform module" .

XformID (NT Wavedriver)


Так вот, на всех системах Виста и выше "Wave Unimodem transform module" с XformID=8, 10 и 11 (т.е. как раз все форматы 8-bit 8000 Hz) имеет брак, т.е. PlayBack просто не работает (звук в одну сторону). На XP кстати работает.

На >=Vista Работает
Код: plaintext
1.
HKR, WaveDriver,    XformID       , 1,  04, 00

(ADPCM) -но там очень сложный кодер/декодер - не вариант

На >=Vista Работает

Код: plaintext
1.
HKR, WaveDriver,    XformID       , 1,  00, 00 

(Null transform, no conversion.)
Вот этим и хочу воспользоваться.
Но для этого надо убрать преобразование аудиоданных в коде самого модема (почему 16-bit-ный формат отсутствует, хз, но видимо дань традиции).
...
Рейтинг: 0 / 0
В код надо добавить кейс чтоб не было преобр. формата 8000 Hz 16-Bit <> 8000 Hz 8-Bit
    #38920644
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попытался сделать тест

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
                 case 1:
                    while (count--)
                      *pb++ = (signed char)(*ps++);
                    break;


...
                        case 1:
                          while (count--)
                            *ps++ = (PInt16)(*pb++);
                          break;



Не угадал. Шипит только гад, говорить не хочет.
...
Рейтинг: 0 / 0
В код надо добавить кейс чтоб не было преобр. формата 8000 Hz 16-Bit <> 8000 Hz 8-Bit
    #38920733
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя приёмный буфер 8-битный, туда 16-битный PCM не положить. Нужно аккуратно увеличить разрядность буфера.
...
Рейтинг: 0 / 0
В код надо добавить кейс чтоб не было преобр. формата 8000 Hz 16-Bit <> 8000 Hz 8-Bit
    #38920735
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolf,

т.е. не буфера, а указателя, что бежит по буферу.
...
Рейтинг: 0 / 0
В код надо добавить кейс чтоб не было преобр. формата 8000 Hz 16-Bit <> 8000 Hz 8-Bit
    #38920809
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не на тот код посмотрел — перепутал источник с приёмником. В общем, что-то вроде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 count /= sizeof(*ps);

...

case 1:
{
                          const PInt16 *pb = (const PInt16 *)Buf;
                          while (count--)
                            *ps++ = *pb++;
                          break;
}
...
Рейтинг: 0 / 0
В код надо добавить кейс чтоб не было преобр. формата 8000 Hz 16-Bit <> 8000 Hz 8-Bit
    #38920866
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolf,

Ну, есть некий прогресс (методом тыка скорее).

По части stSend вроде как достаточно переслать то что приняли:
Код: plaintext
1.
2.
3.
4.
5.
6.
            BYTE Buf[1024];

            for(;;) {
              int count = dleData.GetData(Buf, sizeof(Buf));
...
                      currentClassEngine->Send(Buf, count);



Т.е. дозвонившись до модема, я слышу четкое приветствие автоответчика, beep
после чего он переключается на режим записи сообщения.

А с записью (дублируеся в динамики компа)
И здесь фигня пока (если идти тем же путем):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
     case stRecv:
      {
       BYTE Buf[1024];
        int count;

        for(;;) {
          count = currentClassEngine->Recv(Buf, sizeof(Buf));
...
                dleData.PutData(Buf, count);


Т.е. слышать то я слышу, но первые фразы, потом тишина вперемежку с шумом.
Формат угадал, буфер ни фига.

Оригинальный код так понимаю 16bit->8bit такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
     case stRecv:
      {
       BYTE Buf[1024];
        int count;

        for(;;) {
          count = currentClassEngine->Recv(Buf, sizeof(Buf));
...
                 const PInt16 *ps = (const PInt16 *)Buf;
                signed char *pb = (signed char *)Buf;

                count /= sizeof(*ps);
                  while (count--)
                    *pb++ = (signed char)((*ps++)/256);
                  break;
                count = int(pb - (signed char *)Buf);


               dleData.PutData(Buf, count);



Под спойлером чуть больше оригинального кода положил, если это поможет.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
   case stRecv:
      {
        BYTE Buf[1024];
        int count;

        for(;;) {
          if (!currentClassEngine) {
            if (P.ModemClassId() != EngineBase::mcAudio)
              dleData.SetDiag(EngineBase::diagError);

            dleData.PutEof();
            count = -1;
            break;
          }

          count = currentClassEngine->Recv(Buf, sizeof(Buf));

          switch (count) {
            case -1:
              if (P.ModemClassId() == EngineBase::mcAudio) {
                dleData.PutEof();
              } else {
                int diag = currentClassEngine->RecvDiag();

                if (dataType == EngineBase::dtHdlc) {
                  Buf[0] = BYTE(fcs >> 8);
                  Buf[1] = BYTE(fcs);
                  if (diag & EngineBase::diagErrorMask)
                     Buf[0]++;
                  dleData.PutData(Buf, 2);
                }
                dleData.SetDiag(diag).PutEof();
              }

              currentClassEngine->RecvStop();

              if (dataCount == 0 && P.ModemClassId() == EngineBase::mcFax)
                dleData.GetDleData(Buf, sizeof(Buf));	// discard ...<DLE><ETX>
              break;
            case 0:
              break;
            default:
              if (P.ModemClassId() == EngineBase::mcFax) {
                dleData.PutData(Buf, count);

                switch (dataType) {
                case EngineBase::dtHdlc:
                  fcs.build(Buf, count);
                  break;
                case EngineBase::dtRaw:
                  if (!dataCount) {
                    int dms = P.DelayFrmConnect();

                    if (dms) {
                      Mutex.Signal();
                      PThread::Sleep(dms * 10);
                      Mutex.Wait();
                    }

                    // send CONNECT just before data for AT+FRM command

                    PString _resp = RC_PREF() + RC_CONNECT();

                    PBYTEArray _bresp((const BYTE *)(const char *)_resp, _resp.GetLength());

                    myPTRACE(1, "<-- " << PRTHEX(_bresp));
                    bresp.Concatenate(_bresp);
                  }
                  break;
                default:
                  myPTRACE(1, "Unexpected dataType=" << dataType);
                }
							} else {
                const PInt16 *ps = (const PInt16 *)Buf;
                signed char *pb = (signed char *)Buf;

                count /= sizeof(*ps);

                switch (P.Vcml()) {
//                case 0:
//                  while (count--)
//                    *pb++ = (signed char)((*ps++)/256);
//                  break;
                  case 1:
                    //while (count--)
                    //  *pb++ = (signed char)(*ps++);
                    //break;
                  case 128:
                  case 130:
                    while (count--)
                      *pb++ = (signed char)((*ps++ + 0x8000)/256);
                    break;
                  case 4:
                  case 131:
                    while (count--)
                      *pb++ = (signed char)linear2ulaw(*ps++);
                    break;
                  case 5:
                  case 132:
                    while (count--)
                      *pb++ = (signed char)linear2alaw(*ps++);
                    break;
                }

                count = int(pb - (signed char *)Buf);

                dleData.PutData(Buf, count);
              }

              dataCount += count;
          }
          if (count <= 0)
            break;
        }

        if (P.ModemClassId() == EngineBase::mcAudio) {
          if (count < 0) {
            PBYTEArray _bresp((const BYTE *)"\x10" "b", 2);	// <DLE>b
            bresp.Concatenate(_bresp);
            myPTRACE(2, "<-- DLE " << PRTHEX(_bresp));
          }
        }



Если я правильно понимаю, то

1) stSend делает
Формат данных модема (8 бит в оригинале) -> PCM16
2) stReceive делает
PCM16 -> Формат данных модема (8 бит в оригинале)

А мне надо подогнать под (Null transform, no conversion.) TAPI формат.

Т.е. надо то всего-то

PCM16(на входе Wave Transform модуля)<>PCM16(на входе в модем, формат данных модема) <>PCM16(на выходе из модема)

По сути 8-битное звено мне не нужно (т.е. я через TAPI уже вгоняю в модем чистый 16-битный звук).
...
Рейтинг: 0 / 0
В код надо добавить кейс чтоб не было преобр. формата 8000 Hz 16-Bit <> 8000 Hz 8-Bit
    #38921768
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77А с записью (дублируеся в динамики компа)
И здесь фигня пока (если идти тем же путем):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
     case stRecv:
      {
       BYTE Buf[1024];
        int count;

        for(;;) {
          count = currentClassEngine->Recv(Buf, sizeof(Buf));
...
                dleData.PutData(Buf, count);


Т.е. слышать то я слышу, но первые фразы, потом тишина вперемежку с шумом.
Да не, правильный путь.
Проверил на программе, которая не использует TAPI (Ventafax) -все прекрасно "пишется и слышится" этим кодом в 16-битном формате.
А гадит только TAPI Wave Transform драйвер (периодический шум на XP, но при этом слышно дальше, а вот на 8.1 после "шума" как правило дохнет).

Попытался углубиться в код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
       count = currentClassEngine->Recv(Buf, sizeof(Buf));
        PTRACE(4, "<-- Count(0) " << count);
        for(;;) {
          count = currentClassEngine->Recv(Buf, sizeof(Buf));
...
                dleData.PutData(Buf, count);
          if (count <= 0)
            break;
...
        for(;;) {
          count = dleData.GetDleData(Buf, sizeof(Buf));

              PBYTEArray _bresp(PBYTEArray(Buf, count));
          PTRACE(4, "<-- Count(2) " << count);
                   PTRACE(4, "<-- DLE(3) " << count << " bytes");
               bresp.Concatenate(_bresp);



Сначала все идет похоже на правду:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
2015/03/31 00:14:45.963	       Media Patch:2252	ModemEngineBody::OnEngineCallback AudioEngine cbp4 (4, stRecv)
2015/03/31 00:14:45.963	          (e):1350	<-- Count(0) 320
2015/03/31 00:14:45.963	          (e):1350	<-- Count(0) 0
2015/03/31 00:14:45.963	          (e):1350	<-- Count(2) 320
2015/03/31 00:14:45.963	          (e):1350	<-- DLE(3) 320 bytes
2015/03/31 00:14:45.963	       Media Patch:2252	ModemEngineBody::OnEngineCallback AudioEngine cbp4 (4, stRecv)
2015/03/31 00:14:45.963	          (e):1350	<-- Count(0) 320
2015/03/31 00:14:45.963	          (e):1350	<-- Count(0) 0
2015/03/31 00:14:45.963	          (e):1350	<-- Count(2) 320
2015/03/31 00:14:45.963	          (e):1350	<-- DLE(3) 320 bytes
2015/03/31 00:14:45.979	       Media Patch:2252	ModemEngineBody::OnEngineCallback AudioEngine cbp4 (4, stRecv)



А потом начинаются какие-то непонятки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
2015/03/31 00:14:46.182	          (e):1350	<-- Count(0) 320
2015/03/31 00:14:46.182	          (e):1350	<-- Count(0) 0
2015/03/31 00:14:46.182	          (e):1350	<-- Count(2) 321
2015/03/31 00:14:46.182	          (e):1350	<-- DLE(3) 321 bytes
2015/03/31 00:14:46.197	       Media Patch:2252	ModemEngineBody::OnEngineCallback AudioEngine cbp4 (4, stRecv)
2015/03/31 00:14:46.197	          (e):1350	<-- Count(0) 320
2015/03/31 00:14:46.197	          (e):1350	<-- Count(0) 0
2015/03/31 00:14:46.197	          (e):1350	<-- Count(2) 320
2015/03/31 00:14:46.197	          (e):1350	<-- DLE(3) 320 bytes
2015/03/31 00:14:46.229	       Media Patch:2252	ModemEngineBody::OnEngineCallback AudioEngine cbp4 (4, stRecv)
2015/03/31 00:14:46.229	          (e):1350	<-- Count(0) 320
2015/03/31 00:14:46.229	          (e):1350	<-- Count(0) 0
2015/03/31 00:14:46.229	          (e):1350	<-- Count(2) 323
2015/03/31 00:14:46.229	          (e):1350	<-- DLE(3) 323 bytes
2015/03/31 00:14:46.244	       Media Patch:2252	ModemEngineBody::OnEngineCallback AudioEngine cbp4 (4, stRecv)
2015/03/31 00:14:46.244	          (e):1350	<-- Count(0) 320
2015/03/31 00:14:46.244	          (e):1350	<-- Count(0) 0
2015/03/31 00:14:46.244	          (e):1350	<-- Count(2) 324
2015/03/31 00:14:46.244	          (e):1350	<-- DLE(3) 324 bytes



Т.е. dleData.GetDleData возвращает какие-то лишние байты относительно того что было положено через dleData.PutData
Откуда берутся не понял, но думаю что именно они кладут TAPI-драйвер, а если напрямую то не влияют.
Причем нечетные числа так понимаю могут полностью разрушить аудио (16 бит это 2 байта).

Обратный код похоже что-то докладывает, а мне то надо просто линейно передать 16-битное аудио.
...
Рейтинг: 0 / 0
В код надо добавить кейс чтоб не было преобр. формата 8000 Hz 16-Bit <> 8000 Hz 8-Bit
    #38921808
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже пора завязывать с этим делом.

Взял железный модем, убедился что он поддерживает PCM 16 Bit 8000Hz.

Пришлось подрисовать его драйвер на поддержку этого дела (цифровая подпись у меня есть, поэтому подписать тьфу-тьфу не проблема):

Код: plaintext
1.
2.
3.
HKR, WaveDriver,    XformID       , 1,  00, 00
HKR,  LineSetPlayFormat,      1,,   "at+vsm=133,8000,0,0<cr>"
HKR,  LineSetRecordFormat,    1,,   "at+vsm=133,8000,0,0<cr>"



(133-это специфическое для этого модема, в виртуальном сделал в итоге 0, но это не суть)

Ну, и те же яйца. Playback-OK. Recording - с шумихой.
Т.е. я все правильно сделал.

Unimodem Transform Driver (это кусок виндов) - это похоже полная задница на любых ОС старше висты.

У меня только 2 идеи:

1. Писать PCM-ADPCM кодер-декодер (кажется единственное что точно работает в Unimodem в обе стороны).
Но боюсь, непосильная задача, при моих то знаниях по C/C++. Т.е. коды то я в интернете видел, но непонятно как втыкать в приведенные.

2. Интересно, а возможно ли использовать разные XformID для Playback/Recording.
Т.е. разные команды я прописать например могу:
Код: plaintext
1.
2.
HKR,  LineSetPlayFormat,      1,,   "at+vsm=0,8000,0,0<cr>"
HKR,  LineSetRecordFormat,    1,,   "at+vsm=1,8000,0,0<cr>"


А как прописать разные XformID?

Код: plaintext
1.
2.
HKR, WaveDriver,    XformID       , 1,  00, 00 <---Playback
HKR, WaveDriver,    XformID       , 1,  08, 00 <---Recording
...
Рейтинг: 0 / 0
В код надо добавить кейс чтоб не было преобр. формата 8000 Hz 16-Bit <> 8000 Hz 8-Bit
    #38927392
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос снимаю.
Мне удалось вылечить Unimodem драйвер на Vista-Win8.1.
Теперь стандартные 8-битные форматы нормально работают и на PlayBack и на Recording.

1,"UNSIGNED PCM",8,0,(8000),(0),(0)
Код: plaintext
1.
HKR, WaveDriver,    XformID       , 1,  08, 00



Причина почему шумит при Recording 16bit PCM 8000Hz скорее всего в следующем.
Для комфортной передачи голоса по этому формату нужна скорость COM-порта 254000 (в голосовом режиме модема),
стабильная же работа по спецификации это максимум 115200. (для данных и факсов обычно инициализируют на 19200 с автоматическим увеличением до требуемой).
Программы типа Вентафакс с этим справляются.
TAPI Драйвер Unimodem скорее всего компенсационных механизмов не имеет и не факт что там вообще предусмотрено более 115200
Во всех поголовно драйверах модемов вот это , т.е. 115200
Код: plaintext
1.
HKR,,VoiceBaudRate               ,1, 00, C2, 01, 00


При большой интенсивности PCM16 звука драйвер просто начинает сходить с ума периодически транслируя беспорядочную последовательность байтов (шум).
При PlayBack шума нет видимо за счет грамотной буферизации в модеме (железном или виртуальном).

Поэтому и стремятся в модемах использовать именно 8-битный PCM (Conexant/Rockwell) или 4-битный ADPCM (напр. Zyxel), и последнее кстати значительно хуже по качеству.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
В код надо добавить кейс чтоб не было преобр. формата 8000 Hz 16-Bit <> 8000 Hz 8-Bit
    #39272779
mak601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77,
 Приветствую!
Если воспоминания еще живы, как Вам удалось вылечить unimodem драйвер?
У меня такая же проблема на Win 8.1, тишина на playback, в inf к модему следующее:

HKR, WaveDriver, XformID , 1, 08, 00
HKR, LineSetPlayFormat, 1,, "at+vsm=1,8000,0,0<cr>"

at+vls=?
0," ",0000000000,0000000000,B084008000
1,"T",0B8418E000,0FE418E000,0B8419E000
4,"S",0084008000,0484008000,3084018000
5,"ST",0B8418E000,0FE418E000,0B8419E000
6,"M",0084008000,04E4008000,3084008000
8,"S1",0084008000,0484008000,3084018000
9,"S1T",0B8418E000,0FE418E000,0B8419E000
11,"M1",0084008000,04E4008000,3084008000
13,"M1S1T",0B8418E000,0FE418E000,0B8419E000
OK

Каким образом починить преобразование ?
Спасибо/
...
Рейтинг: 0 / 0
В код надо добавить кейс чтоб не было преобр. формата 8000 Hz 16-Bit <> 8000 Hz 8-Bit
    #39272780
mak601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77,

at+vsm=?
0,"SIGNED PCM",8,0,8000,0,0
1,"UNSIGNED PCM",8,0,8000,0,0
129,"IMA ADPCM",4,0,8000,0,0
130,"UNSIGNED PCM",8,0,8000,0,0
131,"Mu-Law",8,0,8000,0,0
132,"A-Law",8,0,8000,0,0
133,"14 bit PCM",14,0,8000,0,0
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
В код надо добавить кейс чтоб не было преобр. формата 8000 Hz 16-Bit <> 8000 Hz 8-Bit
    #39504749
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mak601Если воспоминания еще живы, как Вам удалось вылечить unimodem драйвер?
У меня такая же проблема на Win 8.1, тишина на playback, в inf к модему следующее:
Ух как я плохо форум отслеживаю.
Но мож кому пригодится.

Описание проблемы:
Voice Modem problems with Unimodem Transform Module (Conexant USB modem)
(проблема создана в висте и в MS не решена до сих пор)

Ключ к решению(в драйвере inf-файле любого голосового модема)
Код: plaintext
1.
2.
3.
[Wave]
...
HKR, WaveDriver,  XformModule    , , "umdmxfrm.dll"



Решение простое (от криворукого дядь Димы):
C:\Windows\System32\umdmxfrm.dll
C:\Windows\SysWOW64\umdmxfrm.dll
Эти файлы тупо выдираются из XP/2003 (32-битный и 64-битный) и муваются на целевую Vista/Win7/8.1/10 взамен неработоспособных "родных".
Минус: перезапишутся при каком-нибудь обновлении

Решение более грамотное (от криворукого дядь Димы):
Файлы выдранные из XP/2003 переименовываются в umdmx MY _X86.dll и umdmx MY _X64.dll.
inf-файл модема переписывается.
Типа так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
[Wave]
...
HKR, WaveDriver,  XformModule    , , "umdmxMY.dll"


[TheModem]
...
CopyFiles=UMDMXMY_X86.CopyFiles, UMDMXMY_X64.CopyFiles

[DestinationDirs]
UMDMXMY_X86.CopyFiles=10,SysWow64 ; x64-specific
UMDMXMY_X64.CopyFiles=11 ; System32 on x64

[UMDMXMY_X86.CopyFiles]
umdmxMY.dll,umdmxMY_x86.dll

[UMDMXMY_X64.CopyFiles]
umdmxMY.dll,umdmxMY_x64.dll


Драйвер после этого необходимо переподписать цифровой подписью Microsoft Code Signing (либо EV),
делается это через файл каталога (.cat), куда включен .inf
(как вариант просто мувнуть ручками с другим именем в System32/SysWow64, но переподписывать все равно придется - из-за правки имени dll в верхней строчке).
Этот вариант не затрагивает "системные" файлы, поэтому никакое обновление назад не испортит.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / В код надо добавить кейс чтоб не было преобр. формата 8000 Hz 16-Bit <> 8000 Hz 8-Bit
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]