From 69a7c557dc1aa1b7c501f0b0723b009eb7ef69a7 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 5 Feb 2019 07:58:38 +0000 Subject: [PATCH] Add more IMBE audio processing. --- P25Gateway/Audio/de_DE.indx | 44 +++++++ P25Gateway/Audio/dk_DK.indx | 44 +++++++ P25Gateway/Audio/en_GB.indx | 44 +++++++ P25Gateway/Audio/en_US.indx | 44 +++++++ P25Gateway/Audio/es_ES.indx | 44 +++++++ P25Gateway/Audio/fr_FR.indx | 44 +++++++ P25Gateway/Audio/it_IT.indx | 44 +++++++ P25Gateway/Audio/no_NO.indx | 44 +++++++ P25Gateway/Audio/pl_PL.indx | 44 +++++++ P25Gateway/Audio/se_SE.indx | 44 +++++++ P25Gateway/P25Gateway.vcxproj | 23 +--- P25Gateway/P25Gateway.vcxproj.filters | 73 ++---------- P25Gateway/Voice.cpp | 163 ++++++++++++++++++++++---- P25Gateway/Voice.h | 1 + 14 files changed, 594 insertions(+), 106 deletions(-) create mode 100644 P25Gateway/Audio/de_DE.indx create mode 100644 P25Gateway/Audio/dk_DK.indx create mode 100644 P25Gateway/Audio/en_GB.indx create mode 100644 P25Gateway/Audio/en_US.indx create mode 100644 P25Gateway/Audio/es_ES.indx create mode 100644 P25Gateway/Audio/fr_FR.indx create mode 100644 P25Gateway/Audio/it_IT.indx create mode 100644 P25Gateway/Audio/no_NO.indx create mode 100644 P25Gateway/Audio/pl_PL.indx create mode 100644 P25Gateway/Audio/se_SE.indx diff --git a/P25Gateway/Audio/de_DE.indx b/P25Gateway/Audio/de_DE.indx new file mode 100644 index 0000000..0f9fcdd --- /dev/null +++ b/P25Gateway/Audio/de_DE.indx @@ -0,0 +1,44 @@ +0 78 24 +1 121 24 +2 163 25 +3 202 28 +4 248 30 +5 295 27 +6 340 32 +7 391 32 +8 440 25 +9 484 32 +alpha 533 25 +bravo 576 31 +charlie 629 26 +delta 676 30 +A 725 19 +B 769 21 +C 818 27 +D 870 23 +E 917 23 +F 965 23 +G 1014 22 +H 1060 24 +I 1109 18 +J 1151 26 +K 1207 26 +L 1258 23 +M 1305 21 +N 1351 25 +O 1401 19 +P 1446 19 +Q 1493 24 +R 1543 23 +S 1591 21 +T 1644 23 +U 1693 22 +V 1740 19 +W 1784 22 +X 1831 24 +Y 1883 34 +Z 1943 25 +linkedto 1995 40 +notlinked 2088 50 +linkingto 2158 44 +isbusy 2268 40 diff --git a/P25Gateway/Audio/dk_DK.indx b/P25Gateway/Audio/dk_DK.indx new file mode 100644 index 0000000..ba64aa4 --- /dev/null +++ b/P25Gateway/Audio/dk_DK.indx @@ -0,0 +1,44 @@ +0 82 21 +1 120 15 +2 160 19 +3 198 22 +4 236 35 +5 288 24 +6 329 31 +7 378 27 +8 422 27 +9 466 24 +alpha 506 32 +bravo 558 27 +charlie 604 38 +delta 663 27 +A 710 18 +B 754 16 +C 796 20 +D 843 16 +E 885 14 +F 923 18 +G 967 13 +H 1005 19 +I 1049 13 +J 1087 23 +K 1137 20 +L 1180 20 +M 1224 19 +N 1268 17 +O 1310 16 +P 1352 15 +Q 1395 17 +R 1437 18 +S 1480 19 +T 1525 19 +U 1569 18 +V 1611 17 +W 1655 34 +X 1714 20 +Y 1759 19 +Z 1802 23 +linkedto 1852 37 +notlinked 1928 50 +linkingto 1998 34 +isbusy 2071 40 diff --git a/P25Gateway/Audio/en_GB.indx b/P25Gateway/Audio/en_GB.indx new file mode 100644 index 0000000..ea3889d --- /dev/null +++ b/P25Gateway/Audio/en_GB.indx @@ -0,0 +1,44 @@ +0 85 41 +1 144 24 +2 186 25 +3 229 30 +4 278 35 +5 331 35 +6 384 39 +7 441 34 +8 494 29 +9 541 35 +alpha 595 31 +bravo 646 33 +charlie 700 31 +delta 753 30 +A 804 24 +B 850 33 +C 898 23 +D 933 33 +E 990 34 +F 1041 34 +G 1093 34 +H 1145 40 +I 1204 30 +J 1253 35 +K 1307 33 +L 1358 30 +M 1406 28 +N 1452 30 +O 1500 23 +P 1541 32 +Q 1592 39 +R 1648 23 +S 1689 33 +T 1742 32 +U 1791 35 +V 1845 33 +W 1896 38 +X 1953 35 +Y 2007 28 +Z 2060 37 +linked 2124 19 +notlinked 2194 44 +linking 2258 31 +isbusy 2350 33 diff --git a/P25Gateway/Audio/en_US.indx b/P25Gateway/Audio/en_US.indx new file mode 100644 index 0000000..040e476 --- /dev/null +++ b/P25Gateway/Audio/en_US.indx @@ -0,0 +1,44 @@ +0 89 39 +1 146 34 +2 202 22 +3 246 31 +4 294 34 +5 345 46 +6 409 39 +7 466 37 +8 521 29 +9 568 35 +alpha 621 26 +bravo 669 34 +charlie 726 34 +delta 781 31 +A 833 19 +B 870 24 +C 938 27 +D 1009 24 +E 1076 28 +F 1148 29 +G 1221 24 +H 1290 31 +I 1363 29 +J 1432 33 +K 1510 25 +L 1578 22 +M 1644 28 +N 1715 28 +O 1785 27 +P 1858 24 +Q 1927 25 +R 1993 26 +S 2063 29 +T 2139 25 +U 2208 25 +V 2273 27 +W 2344 33 +X 2421 24 +Y 2489 26 +Z 2561 32 +linked 2637 20 +notlinked 2710 49 +linking 2779 25 +isbusy 2872 34 diff --git a/P25Gateway/Audio/es_ES.indx b/P25Gateway/Audio/es_ES.indx new file mode 100644 index 0000000..e8d62c8 --- /dev/null +++ b/P25Gateway/Audio/es_ES.indx @@ -0,0 +1,44 @@ +0 83 31 +1 128 32 +2 174 33 +3 226 30 +4 273 36 +5 323 42 +6 379 37 +7 430 37 +8 480 35 +9 529 34 +alpha 578 34 +bravo 628 36 +charlie 682 43 +delta 742 38 +A 798 26 +B 836 22 +C 881 22 +D 923 24 +E 967 17 +F 1004 31 +G 1053 26 +H 1097 35 +I 1150 20 +J 1189 34 +K 1246 22 +L 1287 30 +M 1337 30 +N 1388 33 +O 1439 22 +P 1480 21 +Q 1524 26 +R 1571 32 +S 1622 31 +T 1675 22 +U 1718 23 +V 1756 28 +W 1804 52 +X 1876 28 +Y 1925 17 +Z 1961 35 +linkedto 2017 64 +notlinked 2133 68 +linkingto 2217 66 +isbusy 2364 58 diff --git a/P25Gateway/Audio/fr_FR.indx b/P25Gateway/Audio/fr_FR.indx new file mode 100644 index 0000000..f67b54a --- /dev/null +++ b/P25Gateway/Audio/fr_FR.indx @@ -0,0 +1,44 @@ +0 94 29 +1 140 16 +2 173 20 +3 215 19 +4 255 24 +5 298 29 +6 344 34 +7 398 25 +8 440 24 +9 481 23 +alpha 521 29 +bravo 568 27 +charlie 615 30 +delta 666 30 +A 714 21 +B 753 27 +C 796 34 +D 848 30 +E 895 23 +F 936 27 +G 982 27 +H 1026 30 +I 1075 20 +J 1113 29 +K 1162 22 +L 1201 28 +M 1248 28 +N 1295 28 +O 1341 23 +P 1386 21 +Q 1426 23 +R 1466 28 +S 1511 31 +T 1567 21 +U 1606 22 +V 1646 30 +W 1693 46 +X 1756 31 +Y 1806 21 +Z 1844 14 +linkedto 1858 35 +notlinked 1941 46 +linkingto 2008 38 +isbusy 2091 47 diff --git a/P25Gateway/Audio/it_IT.indx b/P25Gateway/Audio/it_IT.indx new file mode 100644 index 0000000..a94e2ea --- /dev/null +++ b/P25Gateway/Audio/it_IT.indx @@ -0,0 +1,44 @@ +0 86 33 +1 136 27 +2 180 30 +3 231 17 +4 270 38 +5 328 38 +6 383 31 +7 431 36 +8 485 33 +9 535 39 +alpha 591 34 +bravo 644 35 +charlie 701 35 +delta 757 34 +A 810 12 +B 840 19 +C 883 17 +D 923 17 +E 965 14 +F 1001 34 +G 1058 20 +H 1100 32 +I 1155 14 +J 1192 43 +K 1263 30 +L 1316 34 +M 1373 30 +N 1426 29 +O 1477 13 +P 1519 15 +Q 1559 16 +R 1598 28 +S 1649 30 +T 1699 20 +U 1741 12 +V 1775 21 +W 1819 47 +X 1888 25 +Y 1936 43 +Z 2002 35 +linkedto 2064 48 +notlinked 2154 65 +linkingto 2239 41 +isbusy 2321 51 diff --git a/P25Gateway/Audio/no_NO.indx b/P25Gateway/Audio/no_NO.indx new file mode 100644 index 0000000..a3548c0 --- /dev/null +++ b/P25Gateway/Audio/no_NO.indx @@ -0,0 +1,44 @@ +0 67 28 +1 102 29 +2 137 27 +3 170 25 +4 199 36 +5 238 30 +6 272 38 +7 314 31 +8 349 34 +9 386 28 +alpha 418 36 +bravo 472 30 +charlie 519 34 +delta 569 34 +A 622 23 +B 665 24 +C 710 24 +D 758 21 +E 803 28 +F 856 24 +G 903 32 +H 955 31 +I 1007 18 +J 1045 30 +K 1100 28 +L 1152 19 +M 1196 20 +N 1241 17 +O 1282 27 +P 1332 24 +Q 1378 24 +R 1426 19 +S 1470 31 +T 1524 24 +U 1572 23 +V 1616 20 +W 1658 40 +X 1722 32 +Y 1779 24 +Z 1823 29 +linkedto 1882 40 +notlinked 1966 49 +linkingto 2034 40 +isbusy 2148 38 diff --git a/P25Gateway/Audio/pl_PL.indx b/P25Gateway/Audio/pl_PL.indx new file mode 100644 index 0000000..9f41cf0 --- /dev/null +++ b/P25Gateway/Audio/pl_PL.indx @@ -0,0 +1,44 @@ +0 99 36 +1 163 38 +2 229 29 +3 290 31 +4 351 37 +5 420 42 +6 490 41 +7 559 43 +8 630 34 +9 692 50 +alpha 771 30 +bravo 820 32 +charlie 873 35 +delta 931 34 +A 987 17 +B 1012 30 +C 1070 25 +D 1118 27 +E 1169 29 +F 1221 36 +G 1281 30 +H 1333 26 +I 1383 18 +J 1425 32 +K 1485 23 +L 1532 26 +M 1581 26 +N 1629 24 +O 1676 18 +P 1724 23 +Q 1773 20 +R 1817 23 +S 1863 35 +T 1926 25 +U 1975 22 +V 2021 28 +W 2070 15 +X 2107 31 +Y 2161 39 +Z 2226 12 +linkedto 2263 45 +notlinked 2360 51 +linkingto 2433 45 +isbusy 2559 59 diff --git a/P25Gateway/Audio/se_SE.indx b/P25Gateway/Audio/se_SE.indx new file mode 100644 index 0000000..1f78bef --- /dev/null +++ b/P25Gateway/Audio/se_SE.indx @@ -0,0 +1,44 @@ +0 83 35 +1 138 33 +2 188 32 +3 240 28 +4 286 41 +5 345 30 +6 393 43 +7 451 34 +8 505 35 +9 555 28 +alpha 603 35 +bravo 660 35 +charlie 716 32 +delta 768 48 +A 836 30 +B 894 28 +C 946 33 +D 1005 22 +E 1053 34 +F 1115 20 +G 1160 36 +H 1223 30 +I 1280 27 +J 1333 35 +K 1393 29 +L 1453 25 +M 1507 26 +N 1560 20 +O 1607 26 +P 1657 28 +Q 1714 34 +R 1781 23 +S 1833 30 +T 1890 25 +U 1943 23 +V 1989 35 +W 2050 47 +X 2126 27 +Y 2178 19 +Z 2223 45 +linkedto 2298 39 +notlinked 2390 51 +linkingto 2461 36 +isbusy 2577 54 diff --git a/P25Gateway/P25Gateway.vcxproj b/P25Gateway/P25Gateway.vcxproj index 04912b8..899a12b 100644 --- a/P25Gateway/P25Gateway.vcxproj +++ b/P25Gateway/P25Gateway.vcxproj @@ -153,32 +153,13 @@ - - - - - - - - - - - - - - - - - - - - + @@ -188,12 +169,12 @@ - + diff --git a/P25Gateway/P25Gateway.vcxproj.filters b/P25Gateway/P25Gateway.vcxproj.filters index 31f95d1..2974070 100644 --- a/P25Gateway/P25Gateway.vcxproj.filters +++ b/P25Gateway/P25Gateway.vcxproj.filters @@ -29,6 +29,9 @@ Header Files + + Header Files + Header Files @@ -47,67 +50,7 @@ Header Files - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - + Header Files @@ -130,6 +73,9 @@ Source Files + + Source Files + Source Files @@ -145,10 +91,7 @@ Source Files - - Source Files - - + Source Files diff --git a/P25Gateway/Voice.cpp b/P25Gateway/Voice.cpp index c595991..66ab80b 100644 --- a/P25Gateway/Voice.cpp +++ b/P25Gateway/Voice.cpp @@ -102,6 +102,7 @@ m_timer(1000U, 1U), m_stopWatch(), m_sent(0U), m_n(0x62U), +m_dstId(0U), m_imbe(NULL), m_voiceData(NULL), m_voiceLength(0U), @@ -119,7 +120,7 @@ m_positions() #endif // Approximately 10 seconds worth - m_voiceData = new unsigned char[120U * NXDN_FRAME_LENGTH]; + m_voiceData = new unsigned char[10U * 50U * IMBE_LENGTH]; } CVoice::~CVoice() @@ -144,14 +145,14 @@ bool CVoice::open() struct stat statStruct; int ret = ::stat(m_imbeFile.c_str(), &statStruct); if (ret != 0) { - LogError("Unable to stat the AMBE file - %s", m_imbeFile.c_str()); + LogError("Unable to stat the IMBE file - %s", m_imbeFile.c_str()); ::fclose(fpindx); return false; } FILE* fpimbe = ::fopen(m_imbeFile.c_str(), "rb"); if (fpimbe == NULL) { - LogError("Unable to open the AMBE file - %s", m_imbeFile.c_str()); + LogError("Unable to open the IMBE file - %s", m_imbeFile.c_str()); ::fclose(fpindx); return false; } @@ -217,6 +218,8 @@ void CVoice::unlinked() void CVoice::createVoice(unsigned int tg, const std::vector& words) { + m_dstId = tg; + m_voiceLength = 0U; for (std::vector::const_iterator it = words.begin(); it != words.end(); ++it) { if (m_positions.count(*it) > 0U) { @@ -231,6 +234,11 @@ void CVoice::createVoice(unsigned int tg, const std::vector& words) m_voiceLength += SILENCE_LENGTH * IMBE_LENGTH; m_voiceLength += SILENCE_LENGTH * IMBE_LENGTH; + // Round to the next highest LDU frame length + unsigned int n = (m_voiceLength / IMBE_LENGTH) % 9U; + if (n > 0U) + m_voiceLength += (9U - n) * IMBE_LENGTH; + // Fill the IMBE data with silence unsigned int offset = 0U; for (unsigned int i = 0U; i < (m_voiceLength / IMBE_LENGTH); i++, offset += IMBE_LENGTH) @@ -256,25 +264,140 @@ unsigned int CVoice::read(unsigned char* data) if (m_status != VS_SENDING) return 0U; - unsigned int count = m_stopWatch.elapsed() / P25_FRAME_TIME; - - if (m_sent < count) { - unsigned int offset = m_sent * NXDN_FRAME_LENGTH; - ::memcpy(data, m_voiceData + offset, NXDN_FRAME_LENGTH); - - offset += NXDN_FRAME_LENGTH; - m_sent++; - - if (offset >= m_voiceLength) { - m_timer.stop(); - m_voiceLength = 0U; - m_status = VS_NONE; - } - - return NXDN_FRAME_LENGTH; + if ((m_sent * IMBE_LENGTH) >= m_voiceLength) { + ::memcpy(data, REC80, 17U); + m_timer.stop(); + m_voiceLength = 0U; + m_status = VS_NONE; + return 17U; } - return 0U; + unsigned int count = m_stopWatch.elapsed() / P25_FRAME_TIME; + + unsigned int length = 0U; + + if (m_sent < count) { + switch (m_n) { + case 0x62U: + ::memcpy(data, REC62, 22U); + ::memcpy(data + 10U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 22U; + m_n = 0x63U; + break; + case 0x63U: + ::memcpy(data, REC63, 14U); + ::memcpy(data + 1U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 14U; + m_n = 0x64U; + break; + case 0x64U: + ::memcpy(data, REC64, 17U); + ::memcpy(data + 5U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 17U; + m_n = 0x65U; + break; + case 0x65U: + ::memcpy(data, REC65, 17U); + data[1U] = (m_dstId >> 16) & 0xFFU; + data[2U] = (m_dstId >> 8) & 0xFFU; + data[3U] = (m_dstId >> 0) & 0xFFU; + ::memcpy(data + 5U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 17U; + m_n = 0x66U; + break; + case 0x66U: + ::memcpy(data, REC66, 17U); + data[1U] = (m_srcId >> 16) & 0xFFU; + data[2U] = (m_srcId >> 8) & 0xFFU; + data[3U] = (m_srcId >> 0) & 0xFFU; + ::memcpy(data + 5U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 17U; + m_n = 0x67U; + break; + case 0x67U: + ::memcpy(data, REC67, 17U); + ::memcpy(data + 5U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 17U; + m_n = 0x68U; + break; + case 0x68U: + ::memcpy(data, REC68, 17U); + ::memcpy(data + 5U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 17U; + m_n = 0x69U; + break; + case 0x69U: + ::memcpy(data, REC69, 17U); + ::memcpy(data + 5U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 17U; + m_n = 0x6AU; + break; + case 0x6AU: + ::memcpy(data, REC6A, 16U); + ::memcpy(data + 4U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 16U; + m_n = 0x6BU; + break; + case 0x6BU: + ::memcpy(data, REC6B, 22U); + ::memcpy(data + 10U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 22U; + m_n = 0x6CU; + break; + case 0x6CU: + ::memcpy(data, REC6C, 14U); + ::memcpy(data + 1U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 14U; + m_n = 0x6DU; + break; + case 0x6DU: + ::memcpy(data, REC6D, 17U); + ::memcpy(data + 5U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 17U; + m_n = 0x6EU; + break; + case 0x6EU: + ::memcpy(data, REC6E, 17U); + ::memcpy(data + 5U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 17U; + m_n = 0x6FU; + break; + case 0x6FU: + ::memcpy(data, REC6F, 17U); + ::memcpy(data + 5U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 17U; + m_n = 0x70U; + break; + case 0x70U: + ::memcpy(data, REC70, 17U); + ::memcpy(data + 5U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 17U; + m_n = 0x71U; + break; + case 0x71U: + ::memcpy(data, REC71, 17U); + ::memcpy(data + 5U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 17U; + m_n = 0x72U; + break; + case 0x72U: + ::memcpy(data, REC72, 17U); + ::memcpy(data + 5U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 17U; + m_n = 0x73U; + break; + default: + ::memcpy(data, REC73, 16U); + ::memcpy(data + 4U, m_voiceData + (m_sent * IMBE_LENGTH), IMBE_LENGTH); + length = 16U; + m_n = 0x62U; + break; + } + + m_sent++; + } + + return length; } void CVoice::eof() diff --git a/P25Gateway/Voice.h b/P25Gateway/Voice.h index 91d619b..1d2fa22 100644 --- a/P25Gateway/Voice.h +++ b/P25Gateway/Voice.h @@ -63,6 +63,7 @@ private: CStopWatch m_stopWatch; unsigned int m_sent; unsigned int m_n; + unsigned int m_dstId; unsigned char* m_imbe; unsigned char* m_voiceData; unsigned int m_voiceLength;