Non-Astro-Related-Links
The qBittorrent project aims to provide an open-source software alternative to µTorrent. Additionally, qBittorrent runs and provides the same features on all major platforms (FreeBSD, Linux, macOS, OS/2, Windows). https://www.qbittorrent.org/
RCA-VOC audio files:
From: https://cybercom.net/~dcoffin/rca/
The RCA RP5022B Digital Voice Recorder is an inexpensive ($31 in the USA) and widely available portable device. It captures 8000 Hz mono audio, compresses it at 700 (Standard Play) or 4000 (High Quality) bytes per second, and saves it to a 64 MB non-removable internal flash memory. When connected to a USB port, it behaves like a USB flash drive, so no special software is needed to copy the recorded files.
Playing them is another matter. These files are not WAV, MP3, OGG, or any other standard format. Despite the .VOC extension, they are not Creative Labs Sound Files. RCA-VOC is an undocumented proprietary format starting with the signature "VCP162_VOC_File", not "Creative Voice File".
On March 28, 2008, I finally solved this format and released a free C program "devoc.c" to convert VOC files into uncompressed 16-bit WAV. Click here for a Windows executable. If you've installed Sound eXchange, "devoc -p *.voc" will play directly to the speakers. If you want your favorite audio software to support RCA-VOC, send the authors a link to this page. Here are some sample recordings they can use for testing.
gcc devoc.c -o devoc
sudo mv devoc /usr/bin
devoc -w *.VOC
Touch me:
find . -exec touch {} \;
http://blog.snapdragon.cc/2015/08/28/shell-function-to-remove-all-metadata-from-pdf/
Shell Function to Remove all Metadata from PDF
A handy function to remove all metadata from a PDF file. When done it will show all the remaining metadata for inspection. Needs pdftk and exiftool installed.
Combines commands from here and here. Good job, guys.
clean_pdf() { pdftk $1 dump_data | \ sed -e 's/\(InfoValue:\)\s.*/\1\ /g' | \ pdftk $1 update_info - output clean-$1 exiftool -all:all= clean-$1 exiftool -all:all clean-$1 exiftool -extractEmbedded -all:all clean-$1 qpdf --linearize clean-$1 clean2-$1 pdftk clean2-$1 dump_data exiftool clean2-$1 pdfinfo -meta clean2-$1 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
clean_pdf() {
pdftk $1 dump_data | \
sed -e 's/\(InfoValue:\)\s.*/\1\ /g' | \
pdftk $1 update_info - output clean-$1
exiftool -all:all= clean-$1
exiftool -all:all clean-$1
exiftool -extractEmbedded -all:all clean-$1
qpdf --linearize clean-$1 clean2-$1
pdftk clean2-$1 dump_data
exiftool clean2-$1
pdfinfo -meta clean2-$1
}
After adding this snippet in ~/.profile or copy and pasting it in the shell, you can just run
http://www.angelfire.com/extreme4/kiddofspeed/cherlinks.html
http://www.deepredmotorhome.com/
1
clean_pdf my-unclean.pdf
devoc.c
/*
devoc.c -- decode VOC files generated by RCA digital voice recorders.
Tested with the RP5022B.
Copyright (c) 2008 Dave Coffin, dcoffin a cybercom o net
Devoc is free software, released under the
GNU General Public License version 2.0.
$Revision: 1.4 $
$Date: 2008/12/13 08:33:00 $
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define SQR(x) ((long long) (x)*(x))
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define LIM(x,min,max) MAX(min,MIN(x,max))
#define SWAP(a,b) { a ^= b; a ^= (b ^= a); }
#define SHL(i,j) ((j) > 0 ? (i) << (j) : (i) >> -(j))
FILE *ifp, *ofp;
char *ifname, *ofname;
int out_mode=3;
union { char c[2]; short s; } bo_test;
int read_cs (unsigned char *in, int len)
{
int zero=0, zbeg, off, i;
while (1) {
if (fread (in, 1, len, ifp) != len) return 0;
for (zbeg=len; !in[zbeg-1] && --zbeg; );
if (zero) {
if (!zbeg) return 0;
for (zero=off=0, i=4; i--; )
off = off << 8 | in[i];
if (off >= 0)
fseek (ifp, off-len, SEEK_CUR);
} else if ((len-zbeg)/20 == 1)
fseek(ifp, -20, SEEK_CUR);
else if (!zbeg) zero = 1;
else return 1;
}
}
int sp_decode()
{
static const short tab7[128][10] =
{ { 1486, 2168, 3751, 9074,12134,13944,17983,19173,21190,21820 },
{ 1730, 2640, 3450, 4870, 6126, 7876,15644,17817,20294,21902 },
{ 1568, 2256, 3088, 4874,11063,13393,18307,19293,21109,21741 },
{ 1733, 2512, 3357, 4708, 6977,10296,17024,17956,19145,20350 },
{ 1744, 2436, 3308, 8731,10432,12007,15614,16639,21359,21913 },
{ 1786, 2369, 3372, 4521, 6795,12963,17674,18988,20855,21640 },
{ 1631, 2433, 3361, 6328,10709,12013,13277,13904,19441,21088 },
{ 1489, 2364, 3291, 6250, 9227,10403,13843,15278,17721,21451 },
{ 1869, 2533, 3475, 4365, 9152,14513,15908,17022,20611,21411 },
{ 2070, 3025, 4333, 5854, 7805, 9231,10597,16047,20109,21834 },
{ 1910, 2673, 3419, 4261,11168,15111,16577,17591,19310,20265 },
{ 1141, 1815, 2624, 4623, 6495, 9588,13968,16428,19351,21286 },
{ 2192, 3171, 4707, 5808,10904,12500,14162,15664,21124,21789 },
{ 1286, 1907, 2548, 3453, 9574,11964,15978,17344,19691,22495 },
{ 1921, 2720, 4604, 6684,11503,12992,14350,15262,16997,20791 },
{ 2052, 2759, 3897, 5246, 6638,10267,15834,16814,18149,21675 },
{ 1798, 2497, 5617,11449,13189,14711,17050,18195,20307,21182 },
{ 1009, 1647, 2889, 5709, 9541,12354,15231,18494,20966,22033 },
{ 3016, 3794, 5406, 7469,12488,13984,15328,16334,19952,20791 },
{ 2203, 3040, 3796, 5442,11987,13512,14931,16370,17856,18803 },
{ 2912, 4292, 7988, 9572,11562,13244,14556,16529,20004,21073 },
{ 2861, 3607, 5923, 7034, 9234,12054,13729,18056,20262,20974 },
{ 3069, 4311, 5967, 7367,11482,12699,14309,16233,18333,19172 },
{ 2434, 3661, 4866, 5798,10383,11722,13049,15668,18862,19831 },
{ 2020, 2605, 3860, 9241,13275,14644,16010,17099,19268,20251 },
{ 1877, 2809, 3590, 4707,11056,12441,15622,17168,18761,19907 },
{ 2107, 2873, 3673, 5799,13579,14687,15938,17077,18890,19831 },
{ 1612, 2284, 2944, 3572, 8219,13959,15924,17239,18592,20117 },
{ 2420, 3156, 6542,10215,12061,13534,15305,16452,18717,19880 },
{ 1667, 2612, 3534, 5237,10513,11696,12940,16798,18058,19378 },
{ 2388, 3017, 4839, 9333,11413,12730,15024,16248,17449,18677 },
{ 1875, 2786, 4231, 6320, 8694,10149,11785,17013,18608,19960 },
{ 679, 1411, 4654, 8006,11446,13249,15763,18127,20361,21567 },
{ 1838, 2596, 3578, 4608, 5650,11274,14355,15886,20579,21754 },
{ 1303, 1955, 2395, 3322,12023,13764,15883,18077,20180,21232 },
{ 1438, 2102, 2663, 3462, 8328,10362,13763,17248,19732,22344 },
{ 860, 1904, 6098, 7775, 9815,12007,14821,16709,19787,21132 },
{ 1673, 2723, 3704, 6125, 7668, 9447,13683,14443,20538,21731 },
{ 1246, 1849, 2902, 4508, 7221,12710,14835,16314,19335,22720 },
{ 1525, 2260, 3862, 5659, 7342,11748,13370,14442,18044,21334 },
{ 1196, 1846, 3104, 7063,10972,12905,14814,17037,19922,22636 },
{ 2147, 3106, 4475, 6511, 8227, 9765,10984,12161,18971,21300 },
{ 1585, 2405, 2994, 4036,11481,13177,14519,15431,19967,21275 },
{ 1778, 2688, 3614, 4680, 9465,11064,12473,16320,19742,20800 },
{ 1862, 2586, 3492, 6719,11708,13012,14364,16128,19610,20425 },
{ 1395, 2156, 2669, 3386,10607,12125,13614,16705,18976,21367 },
{ 1444, 2117, 3286, 6233, 9423,12981,14998,15853,17188,21857 },
{ 2004, 2895, 3783, 4897, 6168, 7297,12609,16445,19297,21465 },
{ 1495, 2863, 6360, 8100,11399,14271,15902,17711,20479,22061 },
{ 2484, 3114, 5718, 7097, 8400,12616,14073,14847,20535,21396 },
{ 2424, 3277, 5296, 6284,11290,12903,16022,17508,19333,20283 },
{ 2565, 3778, 5360, 6989, 8782,10428,14390,15742,17770,21734 },
{ 2727, 3384, 6613, 9254,10542,12236,14651,15687,20074,21102 },
{ 1916, 2953, 6274, 8088, 9710,10925,12392,16434,20010,21183 },
{ 3384, 4366, 5349, 7667,11180,12605,13921,15324,19901,20754 },
{ 3075, 4283, 5951, 7619, 9604,11010,12384,14006,20658,21497 },
{ 1751, 2455, 5147, 9966,11621,13176,14739,16470,20788,21756 },
{ 1442, 2188, 3330, 6813, 8929,12135,14476,15306,19635,20544 },
{ 2294, 2895, 4070, 8035,12233,13416,14762,17367,18952,19688 },
{ 1937, 2659, 4602, 6697, 9071,12863,14197,15230,16047,18877 },
{ 2071, 2663, 4216, 9445,10887,12292,13949,14909,19236,20341 },
{ 1740, 2491, 3488, 8138, 9656,11153,13206,14688,20896,21907 },
{ 2199, 2881, 4675, 8527,10051,11408,14435,15463,17190,20597 },
{ 1943, 2988, 4177, 6039, 7478, 8536,14181,15551,17622,21579 },
{ 1825, 3175, 7062, 9818,12824,15450,18330,19856,21830,22412 },
{ 2464, 3046, 4822, 5977, 7696,15398,16730,17646,20588,21320 },
{ 2550, 3393, 5305, 6920,10235,14083,18143,19195,20681,21336 },
{ 3003, 3799, 5321, 6437, 7919,11643,15810,16846,18119,18980 },
{ 3455, 4157, 6838, 8199, 9877,12314,15905,16826,19949,20892 },
{ 3052, 3769, 4891, 5810, 6977,10126,14788,15990,19773,20904 },
{ 3671, 4356, 5827, 6997, 8460,12084,14154,14939,19247,20423 },
{ 2716, 3684, 5246, 6686, 8463,10001,12394,14131,16150,19776 },
{ 1945, 2638, 4130, 7995,14338,15576,17057,18206,20225,20997 },
{ 2304, 2928, 4122, 4824, 5640,13139,15825,16938,20108,21054 },
{ 1800, 2516, 3350, 5219,13406,15948,17618,18540,20531,21252 },
{ 1436, 2224, 2753, 4546, 9657,11245,15177,16317,17489,19135 },
{ 2319, 2899, 4980, 6936, 8404,13489,15554,16281,20270,20911 },
{ 2187, 2919, 4610, 5875, 7390,12556,14033,16794,20998,21769 },
{ 2235, 2923, 5121, 6259, 8099,13589,15340,16340,17927,20159 },
{ 1765, 2638, 3751, 5730, 7883,10108,13633,15419,16808,18574 },
{ 3460, 5741, 9596,11742,14413,16080,18173,19090,20845,21601 },
{ 3735, 4426, 6199, 7363, 9250,14489,16035,17026,19873,20876 },
{ 3521, 4778, 6887, 8680,12717,14322,15950,18050,20166,21145 },
{ 2141, 2968, 6865, 8051,10010,13159,14813,15861,17528,18655 },
{ 4148, 6128, 9028,10871,12686,14005,15976,17208,19587,20595 },
{ 4403, 5367, 6634, 8371,10163,11599,14963,16331,17982,18768 },
{ 4091, 5386, 6852, 8770,11563,13290,15728,16930,19056,20102 },
{ 2746, 3625, 5299, 7504,10262,11432,13172,15490,16875,17514 },
{ 2248, 3556, 8539,10590,12665,14696,16515,17824,20268,21247 },
{ 1279, 1960, 3920, 7793,10153,14753,16646,18139,20679,21466 },
{ 2440, 3475, 6737, 8654,12190,14588,17119,17925,19110,19979 },
{ 1879, 2514, 4497, 7572,10017,14948,16141,16897,18397,19376 },
{ 2804, 3688, 7490,10086,11218,12711,16307,17470,20077,21126 },
{ 2023, 2682, 3873, 8268,10255,11645,15187,17102,18965,19788 },
{ 2823, 3605, 5815, 8595,10085,11469,16568,17462,18754,19876 },
{ 2851, 3681, 5280, 7648, 9173,10338,14961,16148,17559,18474 },
{ 1348, 2645, 5826, 8785,10620,12831,16255,18319,21133,22586 },
{ 2141, 3036, 4293, 6082, 7593,10629,17158,18033,21466,22084 },
{ 1608, 2375, 3384, 6878, 9970,11227,16928,17650,20185,21120 },
{ 2774, 3616, 5014, 6557, 7788, 8959,17068,18302,19537,20542 },
{ 1934, 4813, 6204, 7212, 8979,11665,15989,17811,20426,21703 },
{ 2288, 3507, 5037, 6841, 8278, 9638,15066,16481,21653,22214 },
{ 2951, 3771, 4878, 7578, 9016,10298,14490,15242,20223,20990 },
{ 3256, 4791, 6601, 7521, 8644, 9707,13398,16078,19102,20249 },
{ 1827, 2614, 3486, 6039,12149,13823,16191,17282,21423,22041 },
{ 1000, 1704, 3002, 6335, 8471,10500,14878,16979,20026,22427 },
{ 1646, 2286, 3109, 7245,11493,12791,16824,17667,18981,20222 },
{ 1708, 2501, 3315, 6737, 8729, 9924,16089,17097,18374,19917 },
{ 2623, 3510, 4478, 5645, 9862,11115,15219,18067,19583,20382 },
{ 2518, 3434, 4728, 6388, 8082, 9285,13162,18383,19819,20552 },
{ 1726, 2383, 4090, 6303, 7805,12845,14612,17608,19269,20181 },
{ 2860, 3735, 4838, 6044, 7254, 8402,14031,16381,18037,19410 },
{ 4247, 5993, 7952, 9792,12342,14653,17527,18774,20831,21699 },
{ 3502, 4051, 5680, 6805, 8146,11945,16649,17444,20390,21564 },
{ 3151, 4893, 5899, 7198,11418,13073,15124,17673,20520,21861 },
{ 3960, 4848, 5926, 7259, 8811,10529,15661,16560,18196,20183 },
{ 4499, 6604, 8036, 9251,10804,12627,15880,17512,20020,21046 },
{ 4251, 5541, 6654, 8318, 9900,11686,15100,17093,20572,21687 },
{ 3769, 5327, 7865, 9360,10684,11818,13660,15366,18733,19882 },
{ 3083, 3969, 6248, 8121, 9798,10994,12393,13686,17888,19105 },
{ 2731, 4670, 7063, 9201,11346,13735,16875,18797,20787,22360 },
{ 1187, 2227, 4737, 7214, 9622,12633,15404,17968,20262,23533 },
{ 1911, 2477, 3915,10098,11616,12955,16223,17138,19270,20729 },
{ 1764, 2519, 3887, 6944, 9150,12590,16258,16984,17924,18435 },
{ 1400, 3674, 7131, 8718,10688,12508,15708,17711,19720,21068 },
{ 2322, 3073, 4287, 8108, 9407,10628,15862,16693,19714,21474 },
{ 2630, 3339, 4758, 8360,10274,11333,12880,17374,19221,19936 },
{ 1721, 2577, 5553, 7195, 8651,10686,15069,16953,18703,19929 } };
static const short tab5[32][10] =
{ { -435, -815, -742, 1033, -518, 582,-1201, 829, 86, 385 },
{ -833, -891, 463, -8,-1251, 1450, 72, -231, 864, 661 },
{ -1021, 231, -306, 321, -220, -163, -526, -754,-1633, 267 },
{ 57, -198, -339, -33,-1468, 573, 796, -169, -631, 816 },
{ 171, -350, 294, 1660, 453, 519, 291, 159, -640,-1296 },
{ -701, -842, -58, 950, 892, 1549, 715, 527, -714, -193 },
{ 584, 31, -289, 356, -333, -457, 612, -283,-1381, -741 },
{ -109, -808, 231, 77, -87, -344, 1341, 1087, -654, -569 },
{ -859, 1236, 550, 854, 714, -543,-1752, -195, -98, -276 },
{ -877, -954,-1248, -299, 212, -235, -728, 949, 1517, 895 },
{ -77, 344, -620, 763, 413, 502, -362, -960, -483, 1386 },
{ -314, -307, -256,-1260, -429, 450, -466, -108, 1010, 2223 },
{ 711, 693, 521, 650, 1305, -28, -378, 744,-1005, 240 },
{ -112, -271, -500, 946, 1733, 271, -15, 909, -259, 1688 },
{ 575, -10, -468, -199, 1101,-1011, 581, -53, -747, 878 },
{ 145, -285,-1280, -398, 36, -498,-1377, 18, -444, 1483 },
{ -1133, -835, 1350, 1284, -95, 1015, -222, 443, 372, -354 },
{ -1459,-1237, 416, -213, 466, 669, 659, 1640, 932, 534 },
{ -15, 66, 468, 1019, -748, 1385, -182, -907, -721, -262 },
{ -338, 148, 1445, 75, -760, 569, 1247, 337, 416, -121 },
{ 389, 239, 1568, 981, 113, 369,-1003, -507, -587, -904 },
{ -312, -98, 949, 31, 1104, 72, -141, 1465, 63, -785 },
{ 1127, 584, 835, 277,-1159, 208, 301, -882, 117, -404 },
{ 539, -114, 856, -493, 223, -912, 623, -76, 276, -440 },
{ 2197, 2337, 1268, 670, 304, -267, -525, 140, 882, -139 },
{ -1596, 550, 801, -456, -56, -697, 865, 1060, 413, 446 },
{ 1154, 593, -77, 1237, -31, 581,-1037, -895, 669, 297 },
{ 397, 558, 203, -797, -919, 3, 692, -292, 1050, 782 },
{ 334, 1475, 632, -80, 48,-1061, -484, 362, -597, -852 },
{ -545, -330, -429, -680, 1133,-1182, -744, 1340, 262, 63 },
{ 1320, 827, -398, -576, 341, -774, -483,-1247, -70, 98 },
{ -163, 674, -11, -886, 531,-1125, -265, -242, 724, 934 } };
static const short tab3[2][4][10] =
{ { { 8421,9109,9175,8965,9034,9057,8765,8775,9106,8673 },
{ 7018,7189,7638,7307,7444,7379,7038,6956,6930,6868 },
{ 5472,4990,5134,5177,5246,5141,5206,5095,4830,5147 },
{ 4056,3031,2614,3024,2916,2713,3309,3237,2857,3473 } },
{ { 7733,7880,8188,8175,8247,8490,8637,8601,8359,7569 },
{ 4210,3031,2552,3473,3876,3853,4184,4154,3909,3968 },
{ 3214,1930,1313,2143,2493,2385,2755,2706,2542,2919 },
{ 3024,1592, 940,1631,1723,1579,2034,2084,1913,2601 } } };
static const short tab1[2][10] =
{ { 7798, 8447, 8205, 8293, 8126, 8477, 8447, 8703, 9043, 8604 },
{ 14585,18333,19772,17344,16426,16459,15155,15220,16043,15708 } };
static const short tab0[10] =
{ 2339, 4679, 7018, 9358,11698,14037,16377,18717,21056,23396 };
static const short stab[64] =
{ 32767, 32729, 32610, 32413, 32138, 31786, 31357, 30853,
30274, 29622, 28899, 28106, 27246, 26320, 25330, 24279,
23170, 22006, 20788, 19520, 18205, 16846, 15447, 14010,
12540, 11039, 9512, 7962, 6393, 4808, 3212, 1608,
0, -1608, -3212, -4808, -6393, -7962, -9512,-11039,
-12540,-14010,-15447,-16846,-18205,-19520,-20788,-22006,
-23170,-24279,-25330,-26320,-27246,-28106,-28899,-29622,
-30274,-30853,-31357,-31786,-32138,-32413,-32610,-32729 };
static const short mtab[64] =
{ -632, -1893, -3150, -4399, -5638, -6863, -8072, -9261,
-10428,-11570,-12684,-13767,-14817,-15832,-16808,-17744,
-18637,-19486,-20287,-21039,-21741,-22390,-22986,-23526,
-24009,-24435,-24801,-25108,-25354,-25540,-25664,-25726,
-25726,-25664,-25540,-25354,-25108,-24801,-24435,-24009,
-23526,-22986,-22390,-21741,-21039,-20287,-19486,-18637,
-17744,-16808,-15832,-14817,-13767,-12684,-11570,-10428,
-9261, -8072, -6863, -5638, -4399, -3150, -1893, -632 };
static const short pulse[61] =
{ 0,70,91,34,-79,-165,-120,78,296,308,0,-451,-634,-245,550,1099,756,-464,
-1666,-1652,0,2259,3130,1211,-2783,-5850,-4402,3143,14701,25207,29443,
25207,14701,3143,-4402,-5850,-2783,1211,3130,2259,0,-1652,-1666,-464,
756,1099,550,-245,-634,-451,0,308,296,78,-120,-165,-79,34,91,70,0 };
static const short pulse2[7][16] =
{ { -40,72,-156,315,-579,1023,-1874,4439,31915,-3390,1595,-887,501,-266,130,-59 },
{ -77,147,-317,631,-1150,2030,-3773,9639,29436,-5579,2727,-1527,859,-453,218,-101 },
{ -106,212,-455,892,-1614,2850,-5392,15206,25569,-6549,3303,-1860,1041,-543,258,-122 },
{ -123,253,-538,1044,-1876,3319,-6414,20676,20676,-6414,3319,-1876,1044,-538,253,-123 },
{ -122,258,-543,1041,-1860,3303,-6549,25569,15206,-5392,2850,-1614,892,-455,212,-106 },
{ -101,218,-453,859,-1527,2727,-5579,29436,9639,-3773,2030,-1150,631,-317,147,-77 },
{ -59,130,-266,501,-887,1595,-3390,31915,4439,-1874,1023,-579,315,-156,72,-40 } };
static const short xtab[12] =
{ 7699,-15398,7699,8192,15836,-7667,1899,-3798,1899,4096,7807,-3733 };
static const short ttab[40] =
{ 1,3,6,8,11,13,16,18,21,23,26,28,31,33,36,38,
0,2,4,5,7,9,10,12,14,15,17,19,20,22,24,25,27,29,30,32,34,35,37,39 };
static const short dtab[] =
{ 30000,26000,21000,15000,8000,0,-8000,-15000,-21000,-26000 };
static const short etab[2][33] =
{ { 0, 1455, 2866, 4236, 5568, 6863, 8124, 9352,10549,11716,12855,
13967,15054,16117,17156,18172,19167,20142,21097,22033,22951,23852,
24735,25603,26455,27291,28113,28922,29716,30497,31266,32023,32767 },
{ 16384,16743,17109,17484,17867,18258,18658,19066,19484,19911,20347,
20792,21247,21713,22188,22674,23170,23678,24196,24726,25268,25821,
26386,26964,27554,28158,28774,29405,30048,30706,31379,32066,32767 } };
static const short ktab[4][8] =
{ { 5849,2929,9425,6068,3617,3171,3915,4987 },
{ 0,3988,4478,7876,10291,10828,11956,16423 },
{ 0,1078,2731,6093, 6747, 9280,12872,22294 },
{ 4175,0,7324,7821,11385,27602,10735,15724 } };
static const short ltab[3][40] =
{ { 14690,11518,1268,-2762,-5672,7514,-36,-2808,-3041,4823,2952,-8425,3785,
1455,2179,-8638,8051,-2104,-1455,777,1108,-2386,2254,-364,-675,-2104,6046,
-5682,1072,3123,-5059,5312,-2330,-3729,6924,-3890,675,-1776,29,10145 },
{ 30274,3831,-4037,2972,-1049,-1003,2477,-3044,2815,-2232,1753,-1612,1714,
-1776,1543,-1009,429,-170,472,-1265,2176,-2707,2523,-1622,344,826,-1530,
1724,-1658,1701,-2064,2644,-3061,2897,-1979,557,780,-1370,842,655 },
{ 32767,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } };
static const short ptab[7][4] =
{ { -188,2873,31650,-1597 }, { -484,7041,28469,-2147 },
{ -933,12266,23705,-1992 }, { -1492,18050,18050,-1492 },
{ -1992,23705,12266,-933 }, { -2147,28469,7041,-484 },
{ -1597,31650,2873,-188 } };
static const short ntab[2] = { 22938, 18022 };
static const short itab[4] = { 5571,4751,2785,1556 };
static const char chlen[10] = { 8,10,8,6,2,5,4,6,2,5 };
unsigned char in[8];
int vtab[4][10], alpha[10], beta[10], gamma[10], delta[3][10];
int iota[4] = { -3670016,-3670016,-3670016,-3670016 };
int ccdh[6] = { 0,0,0,0,0,0 }, ccd=0, dold=0, dcnt=0, eold=0;
int bach[] = { 30,30 }, psig[] = { 0,0,0 }, carry=0x400000;
long long epsilon[2][6], rsum[7][2], sum, psum, pmax, rmax, smax;
long long rssh, osum, prod1, prod2, pssm[] = { 0,0 };
int zeta[2][11], look[240], xi[200], pi[200], phi[20];
int theta[40], kappa[120], lambda[40], mu[40], tau[80], sigma[80];
int diff, back=0, fback, a, b, c, d, e, f, i, j, k, m;
int mant, hi, lo, kasum, nu[2][11], rho[7][41], *chi;
int emax, expo, expo1, expo2, expo3;
short out[80];
memset (look, 0, sizeof look);
memset (kappa, 0, sizeof kappa);
memset (xi, 0, sizeof xi);
memset (tau, 0, sizeof tau);
for (i=0; i < 10; i++) delta[0][i] = dtab[i] << 8;
for (j=0; j < 4; j++)
for (i=0; i < 10; i++)
vtab[j][i] = tab0[i] << 8;
while (read_cs (in, 7)) {
for (b=i=0; i < 10; i++)
for (alpha[i]=j=0; j < chlen[i]; j++, b++)
alpha[i] |= (in[b >> 3] >> (~b & 7) & 1) << j;
for (i=0; i <= 4; i+=4) {
alpha[3+i] = ((alpha[3+i] >> 3) * 24 | (alpha[3+i] & 7)) << 1 | 1;
alpha[5+i] <<= 1;
}
for (i=0; i < 10; i++)
beta[i] = (tab7[alpha[0] & 127][i] +
tab5[alpha[1] >> (5-i/5*5) & 31][i]) << 8;
for (j=2; j > 0; j--)
for (i=0; i < 9; i++)
if ((diff = (beta[i]-beta[i+1] + j*1280) >> 1) > 0) {
beta[i] -= diff;
beta[i+1] += diff;
}
for (i=0; i < 10; i++) {
sum = (long long) tab1[alpha[0] >> 7][i] * beta[i];
for (j=0; j < 4; j++)
sum += (long long) tab3[alpha[0] >> 7][j][i] * vtab[j][i];
gamma[i] = sum >> 15;
}
memmove (vtab+1, vtab, 3 * sizeof *vtab);
memcpy (vtab, beta, sizeof beta);
for (i=0; i < 9; i++)
if (gamma[i] > gamma[i+1])
SWAP(gamma[i],gamma[i+1]);
if (gamma[0] < 10240)
gamma[0] = 10240;
for (i=0; i < 9; i++)
if (gamma[i+1] < gamma[i]+82176)
gamma[i+1] = gamma[i]+82176;
if (gamma[9] > 6574336)
gamma[9] = 6574336;
for (i=0; i < 10; i++) {
j = (long long) gamma[i] * 20861 >> 23;
k = MIN (j >> 8, 63);
delta[2][i] = (stab[k] << 8) + (mtab[k] * (j & 255) >> 4);
delta[1][i] = (delta[0][i] >> 1) + (delta[2][i] >> 1);
}
for (a=0; a < 2; a++) {
for (b=0; b < 2; b++) {
epsilon[b][0] = 0x10000000000LL;
epsilon[b][1] = -0x40000LL * delta[a+1][b];
for (i=1; i < 5; i++) {
epsilon[b][i+1] = epsilon[b][i-1];
for (j=1; j <= i; j++) {
sum = ((epsilon[b][i-j+1] >> 32) * delta[a+1][b+i*2] << 9) +
((0x7fffff & epsilon[b][i-j+1] >> 9) * delta[a+1][b+i*2] >> 14);
epsilon[b][i-j+2] += epsilon[b][i-j] - (sum << 1);
}
epsilon[b][1] -= 0x40000LL * delta[a+1][b+i*2];
}
}
for (i=6; --i; ) {
epsilon[0][i] += epsilon[0][i-1];
epsilon[1][i] -= epsilon[1][i-1];
}
zeta[a][0] = 0x100000;
for (i=1; i < 6; i++) {
zeta[a][i] = (epsilon[0][i] + epsilon[1][i]) >> 21;
zeta[a][11-i] = (epsilon[0][i] - epsilon[1][i]) >> 21;
}
}
memcpy (delta[0], delta[2], sizeof delta[0]);
for (a=0; a < 8; a+=4) {
if (a == (fback = 0)) {
if (alpha[2] < 197) {
back = (alpha[2] + 59) / 3;
fback = alpha[2] + 58 - 3*back;
} else back = alpha[2] - 112;
} else {
back = LIM (back, 25, 139) - 5;
if (alpha[6] < 4) back += alpha[6];
else if (alpha[6] > 11) back += alpha[6] - 6;
else {
back += (alpha[6] + 7) / 3;
fback = (alpha[6] + 1) % 3 - 1;
}
}
bach[a >> 2] = back;
fback = (fback + 2) % 3 + 1;
for (i=0; i < 40; i++) {
for (sum=0, j=-10; j < 10; j++)
sum += (long long) pulse[30+fback+j*3] *
look[160+(fback > 1)+a*10-back+i+j];
look[160+a*10+i] = sum >> 15;
}
ccd = LIM (ccd, 3277, 13017);
memset (theta, 0, sizeof theta);
theta[ttab[ alpha[3+a] & 15 ]] = alpha[4+a] & 1 ? 0x1fff00:-0x200000;
theta[ttab[(alpha[3+a]>>4)+16]] = alpha[4+a] & 2 ? 0x1fff00:-0x200000;
for (i=back; i < 40; i++)
theta[i] += (long long) theta[i-back] * ccd >> 14;
for (sum=i=0; i < 40; i++)
sum += (long long) theta[i]*theta[i];
for (expo=0; sum >> expo > 0; expo++);
i = sum >> (expo-6) & 31;
mant = (((long long) etab[0][i] << 23) +
(SHL(sum,29-expo) & 0x7fffff) * (etab[0][i+1]-etab[0][i])) >> 23;
sum = ((8147LL << 20) - 6165LL * (((expo-16) << 15) + mant)) << 5;
for (i=0; i < 4; i++)
sum += (long long) iota[i] * itab[i];
k = (sum >> 15) * 5439 >> 16;
i = 31 & (k >> 10);
j = 14 - (k >> 15);
k = (etab[1][i] << 8) + ((k & 0x3ff) * (etab[1][i+1]-etab[1][i]) >> 2);
hi = alpha[5+a] >> 3;
lo = alpha[5+a] & 7;
ccd = ktab[0][hi] + ktab[1][lo];
c = ktab[2][hi] + ktab[3][lo];
d = (long long) c * k >> (13+j);
for (i=4; --i; ) iota[i] = iota[i-1];
for (expo=0; c >> expo > 0; expo++);
i = SHL(c,6-expo) & 31;
mant = (((long long) etab[0][i] << 23) + (long long)
(SHL(c,29-expo) & 0x7fffff) * (etab[0][i+1]-etab[0][i])) >> 23;
iota[0] = (((expo-15) << 15) + mant) * 6165 >> 7;
for (i=0; i < 40; i++)
look[160+a*10+i] = (((long long) look[160+a*10+i] * ccd << 8) +
((long long) theta[i] * d)) >> 22;
for (i=6; --i; ) ccdh[i] = ccdh[i-1];
ccdh[0] = ccd;
if (d >> 1 > dold) dcnt = 2;
else if (dcnt) dcnt--;
dold = d;
e = ccd > 14744 ? 2 : ccd > 9830;
for (f=i=0; i < 6; i++)
if (ccdh[i] < 9830) f++;
if (f > 2 && !dcnt) e = 0;
if (e > eold + 1) e--;
if (dcnt && e < 2) e++;
eold = e;
memset (mu, 0, sizeof mu);
for (i=0; i < 40; i++)
if (theta[i])
for (j=0; j < 40; j++)
mu[j] += (long long) theta[i] * ltab[e][(j-i+40)%40] >> 15;
for (i=0; i < 40; i++)
lambda[i] = look[160+a*10+i]
- ((long long) theta[i] * d >> 22)
+ ((long long) mu[i] * d >> 22);
memmove (kappa, kappa+40, 80*sizeof *kappa);
for (kasum=i=0; i < 40; i++) {
kappa[80+i] = -lambda[i];
for (sum=j=0; j < 11; j++)
sum += (long long) zeta[a>>2][j] * kappa[80+i-j];
kasum += abs(kappa[80+i] = -sum >> 20);
}
}
for (sum=i=0; i < 80; i++)
sum += (long long) look[160+i]*look[160+i];
for (expo=0; sum >> expo > 0; expo++);
i = SHL(sum,6-expo) & 31;
mant = (((long long) etab[0][i] << 23) +
(SHL(sum,29-expo) & 0x7fffff) * (etab[0][i+1]-etab[0][i])) >> 23;
memmove (look, look+80, 160*sizeof *look);
for (a=0; a < 2; a++) {
for (b=0; b < 2; b++)
for (c = 1 << 23, i=0; i < 11; i++) {
nu[b][i] = (long long) zeta[a][i] * c >> 23;
c = (long long) c * ntab[b] >> 15;
}
for (i=0; i < 40; i++) {
for (sum=j=0; j < 11; j++)
sum += (long long) nu[1][j] * kappa[(a+1)*40+i-j];
tau[40+i] = xi[160+i] = sum >> 20;
}
for (c=0,i=8; i < 200; i++)
c |= abs(xi[i]);
for (expo1=0; c >> expo1 > 0; expo1++);
for (i=0; i < 200; i++)
pi[i] = SHL(xi[i],20-expo1);
for (psum=i=0; i < 40; i++)
psum += SQR(pi[160+i]);
if (!psum) goto skip;
for (expo=0; psum >> expo > 0; expo++);
psum = SHL(psum,23-expo);
for (smax=-1, j=bach[0]-1; j < bach[0]+2; j++) {
for (sum=i=0; i < 40; i++)
sum += (long long) pi[160+i] * pi[160+i-j];
if (sum < 0) sum = 0;
if (smax < sum) { smax = sum; back = j; }
}
if (!smax) goto skip;
for (pmax=i=0; i < 40; i++)
pmax += SQR(pi[160-back+i]);
for (rmax=i=0; i < 7; i++) {
for (j=0; j < 41; j++) {
for (sum=k=0; k < 4; k++)
sum += (long long) pi[161-back+j-k] * ptab[i][k];
rho[i][j] = sum >> 15;
}
for (sum=0, j=1; j < 40; j++)
sum += SQR(rho[i][j]);
rsum[i][0] = sum + SQR(rho[i][ 0]);
rsum[i][1] = sum + SQR(rho[i][40]);
m = rsum[i][0] < rsum[i][1];
if (rmax < rsum[i][m])
rmax = rsum[i][m];
}
if (!rmax) goto skip;
for (emax=0; rmax >> emax > 0; emax++);
if (emax < expo) emax = expo;
pmax = SHL(pmax,23-emax);
rmax = SHL(rmax,23-emax);
smax = SHL(smax,23-emax);
for (m=-1,i=0; i < 7; i++)
for (j=0; j < 2; j++) {
for (sum=k=0; k < 40; k++)
sum += (long long) pi[160+k] * rho[i][j+k];
sum = MAX (0, SHL(sum,23-emax));
osum = ((sum*sum*2 >> 32) * pmax << 9) +
((sum*sum*2 >> 9 & 0x7fffff) * pmax >> 14);
rssh = SHL(rsum[i][j],23-emax);
if (osum > ((smax*smax*2 >> 32) * rssh << 9) +
((smax*smax*2 >> 9 & 0x7fffff) * rssh >> 14)) {
smax = sum;
pmax = rssh;
m = i*2 + j;
}
}
if (rmax > 1 && smax && smax*smax >> 7 << 8 >= SHL(psum*pmax,expo-emax)) {
chi = xi+160-back;
if (m < 0) goto mlt0;
chi = mu;
back += ~m & 1;
for (i=0; i < 40; i++) {
for (sum=j=0; j < 16; j++)
sum += (long long) pi[168-back+i-j] * pulse2[m/2][j];
chi[i] = sum >> 15;
}
for (osum=i=0; i < 40; i++)
osum += (long long) pi[160+i] * chi[i];
if (osum < 0) osum = 0;
for (expo2=0; osum >> expo2 > 0; expo2++);
if (expo2 < 30) expo2 = 30;
osum >>= expo2-23;
for (psum=i=0; i < 40; i++)
psum += SQR(chi[i]);
for (expo3=0; psum >> expo3 > 0; expo3++);
if (expo3 < 30) expo3 = 30;
psum >>= expo3-23;
prod1 = ((smax*smax*2 >> 32) * psum << 9) +
((smax*smax*2 >> 9 & 0x7fffff) * psum >> 14);
prod2 = ((osum*osum*2 >> 32) * pmax << 9) +
((osum*osum*2 >> 9 & 0x7fffff) * pmax >> 14);
i = (emax*2 + expo3) - (expo2*2 + emax);
if (i < 0) prod1 >>= -i;
else prod2 >>= i;
if (prod1 > prod2)
chi = rho[m >> 1] + (m & 1);
for (i=0; i < 40; i++)
chi[i] = SHL(chi[i],expo1-20);
if (prod1 > prod2) {
mlt0: osum = smax;
psum = pmax;
expo2 = expo3 = emax;
}
osum = SHL(osum,expo2-expo3);
j = (psum > osum) ? (psum << 15)/(psum + osum/2) : 0x5555;
for (i=0; i < 40; i++)
tau[40+i] = ((long long) j * tau[40+i] +
(long long) (0x8000 - j) * chi[i]) >> 15;
}
skip:
for (kasum=i=0; i < 20; i++) {
phi[i] = i < 11 ? -nu[1][i] : 0;
for (sum=j=0; j < 11; j++)
if (i >= j) sum += (long long) nu[0][j] * phi[i-j];
kasum += abs (phi[i] = -sum >> 20);
}
for (psum=i=0; i < 20; i++)
psum += SQR(phi[i]);
for (osum=i=0; i < 19; i++)
osum += (long long) phi[i] * phi[i+1];
for (expo=0; psum >> expo > 0; expo++);
psum = SHL(psum,23-expo);
osum = SHL(osum,23-expo);
b = psum < abs(osum) ? 0 : (osum << 15) / -psum;
if ((kasum >>= 2) > 0x40000) {
c = (1LL << 33) / kasum;
for (i=40; i < 80; i++)
tau[i] = (long long) tau[i] * c >> 15;
}
for (i=40; i < 80; i++) {
tau[i] = -tau[i];
for (sum=j=0; j < 11; j++)
sum += (long long) nu[0][j] * tau[i-j];
tau[i] = -sum >> 20;
}
c = (b > 0 ? 6554:29491) * b >> 7;
b = (b > 0) * 3;
d = (1LL << (34+b)) / (0x800000 - abs(c));
c >>= 1;
for (i=0; i < 40; i++)
sigma[a*40+i] = ((((long long) tau[39+i] * c >> 22) +
tau[40+i] + 128) * d >> (11+b)) + 128;
for (sum=i=0; i < 40; i++)
sum += abs (kappa[(a+1)*40+i]);
for (expo=0; sum >> expo > 0; expo++);
sum = sum << 15 >> expo;
for (osum=i=0; i < 40; i++)
osum += abs (sigma[a*40+i]);
for (emax=0; osum >> emax > 0; emax++);
if ((osum = osum << 15 >> emax)) {
e = ((sum << 15) / osum << (7+expo-emax)) * 205 >> 14;
for (i=0; i < 40; i++) {
carry = (16179LL * carry >> 14) + e;
sigma[a*40+i] = (long long) sigma[a*40+i] * carry >> 22;
}
} else carry = 0;
memmove (xi, xi+40, 160*sizeof *xi);
memcpy (tau, tau+40, 40*sizeof *tau);
}
for (i=0; i < 80; i++) {
for (j=3; --j; ) psig[j] = psig[j-1];
psig[0] = sigma[i];
for (sum=j=0; j < 2; j++)
sum += ((pssm[j] >> 32) * xtab[4+j] << 19) +
((pssm[j] >> 9 & 0x7fffff) * xtab[4+j] >> 4);
for (j=0; j < 3; j++)
sum += (long long) psig[j] * xtab[j] << 9;
sigma[i] = sum >> 21;
pssm[1] = pssm[0];
pssm[0] = sum;
}
for (i=0; i < 80; i++)
out[i] = LIM (sigma[i] >> 8, -32768, 32767);
if (bo_test.c[1] && out_mode == 3)
swab (out, out, sizeof out);
fwrite (out, 2, 80, ofp);
}
return 0;
}
int hq_decode()
{
static const short tab[2][16] =
{ { -2048,4,135,213,273,323,373,425,425,373,323,273,213,135,4,-2048 },
{ -12,18,41,64,112,198,355,1122,1122,355,198,112,64,41,18,-12 } };
int pred[24], nib, map, diff, s, i;
unsigned char in[40];
short out[80];
memset (pred, 0, sizeof pred);
pred[1] = 544;
while (read_cs (in, 40)) {
for (s=0; s < 80; s++) {
nib = in[s >> 1] >> ((s & 1) << 2) & 15;
if (nib == 15) diff = 0;
else {
map = MAX ((pred[1] >> 2) + tab[0][nib], 0);
diff = ((map & 127) + 128) << ((map >> 7 & 15) + 1);
if (nib & 8) diff = -diff;
}
out[s] = LIM ((pred[0] << 2) + (diff >> 6), -32768, 32767);
pred[1] += tab[1][nib] + (-pred[1] >> 5);
pred[1] = LIM (pred[1], 544, 5120);
for (i=24; --i > 12; ) pred[i] = pred[i-1];
pred[17] = diff;
pred[15] = LIM (diff + (pred[2] << 8), -8388608, 8388607);
pred[12] = LIM (diff + (pred[3] << 8), -8388608, 8388607);
pred[5] = ((pred[5] * 32512 -
LIM (pred[4] << 10, -8388608, 8388607) *
((pred[12] ^ pred[13]) >> 31 | 1)) >> 15) +
(((pred[12] ^ pred[14]) >> 31 | 1) << 7);
pred[5] = LIM (pred[5], -12288, 12288);
pred[4] = (pred[4] * 255 >> 8) + 192 *
((pred[12] ^ pred[13]) >> 31 | 1);
pred[4] = LIM (pred[4], -(15360-pred[5]), 15360-pred[5]);
for (i=6; i < 12; i++) {
pred[i] = pred[i] * 255 >> 8;
if (diff) pred[i] += ((diff ^ pred[i+12]) >> 31 | 1) << 7;
pred[i] = LIM (pred[i], -32768, 32767);
}
for (pred[2]=pred[3]=i=0; i < 8; i++)
pred[2 + (i > 1)] += (long long) pred[4+i] * pred[15+i] >> 23 << 1;
pred[0] = pred[2] += pred[3];
}
if (bo_test.c[1] && out_mode == 3)
swab (out, out, sizeof out);
fwrite (out, 2, 80, ofp);
}
return 0;
}
int main (int argc, char **argv)
{
int arg=1, status, size, i;
unsigned char b[32];
char *cp, riff[44]=
"RIFF WAVEfmt \20\0\0\0\1\0\1\0@\37\0\0\200>\0\0\2\0\20\0data";
bo_test.s = 1;
ofp = ifp = 0;
ofname = 0;
ifname = "stdin";
if (argc == 1) {
fprintf (stderr,
"Usage: %s [OPTION] file1.voc file2.voc ...\n\n"
"-i Identify RCA VOC files without decoding\n"
"-c Write 16-bit raw audio to standard output\n"
"-p Play sound (SoX must be installed)\n"
"-w Convert each RCA VOC file to WAV\n", argv[0]);
return 1;
}
for (arg=1; arg < argc && argv[arg][0]=='-'; arg++)
switch (argv[arg][1]) {
case 'i': out_mode = 0; break;
case 'c': out_mode = 1; break;
case 'p': out_mode = 2; break;
case 'w': out_mode = 3; break;
}
if (out_mode == 1 && (ofp = stdout) && isatty(1)) {
fprintf (stderr, "Will not write sound to the terminal!\n");
return 1;
}
if (out_mode == 2 && !(ofp = popen ("play -t raw -s -2 -r 8000 -","w"))) {
perror ("play");
return 1;
}
do {
status = 1;
if (arg < argc) {
if (ifp) fclose(ifp);
if (!(ifp = fopen (ifname = argv[arg],"rb"))) {
perror (ifname);
continue;
}
} else ifp = stdin;
fread (b, 1, 31, ifp);
if (memcmp (b+6, "_VOC_File", 9)) {
fprintf (stderr, "%s is not an RCA VOC file.\n",ifname);
continue;
}
if (out_mode == 0) {
fprintf (stderr, "%s: model %.6s start %d/%02d/%02d %02d:%02d:%02d",
ifname, b, 2000+b[16], b[17], b[18], b[19], b[20], b[21]);
fprintf (stderr, " duration %02d:%02d:%02d.%02d quality %s\n",
b[22], b[23], b[24], b[25], b[26] ? "HQ":"SP");
status = 0;
continue;
}
if (out_mode == 3) {
if (ofname) free(ofname);
if (!(ofname = malloc (strlen(ifname) + 5))) return 1;
strcpy (ofname, ifname);
if ((cp = strrchr (ofname, '.'))) *cp = 0;
strcat (ofname, ".wav");
if (ofp) fclose(ofp);
if (!(ofp = fopen (ofname,"wb"))) perror (ofname);
if (!ofp) continue;
fwrite (riff, 1, 44, ofp);
}
i = b[15] == 12 ? 30 : 254;
while (i--) fread (b, 1, 16, ifp);
switch (b[26]) {
case 0: status = sp_decode(); break;
case 3: status = hq_decode(); break;
default:
fprintf (stderr, "%s: Unsupported compression\n", ifname);
if (ofname) remove (ofname);
continue;
}
if (out_mode == 3) {
size = ftell(ofp);
for (i=0; i < 4; i++) {
riff[i+4 ] = (size - 8) >> i*8;
riff[i+40] = (size - 44) >> i*8;
}
fseek (ofp, 0, SEEK_SET);
fwrite (riff, 1, 44, ofp);
}
} while (++arg < argc);
if (ifp) fclose(ifp);
if (ofp) fclose(ofp);
if (ofname) free(ofname);
return status;
}