рдХрд▓, рдЬрдм рдореБрдЭреЗ рдЕрдкрдиреЗ рдирдП рд▓реИрдкрдЯреЙрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдПрд╕реАрдкреАрдЖрдИ рдХреЛ рд░реЛрдХрдиреЗ / рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдХрдЪрд░реЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рддреЛ рдореИрдВрдиреЗ рдлрд┐рд░ рд╕реЗ рдЦреБрдж рдХреЛ рдЙрд╕ рдкрд╛рдЧрд▓ рд▓рдбрд╝рдХреЗ рдХреЛ рдХреЛрд╕рддреЗ рд╣реБрдП рдкрд╛рдпрд╛ рдЬрд┐рд╕рдиреЗ рд╣рдорд╛рд░реЗ рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯреНрд╕ рдХреЛ рд▓реИрдкрдЯреЙрдк рд╕реЗ тАЛтАЛрд╣рдЯрд╛ рджрд┐рдпрд╛ рдерд╛ред
рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рд╕реЛрдЪрд╛ рдФрд░ рдпрд╣ рдЕрдЪрд╛рдирдХ рдореБрдЭ рдкрд░ рдЫрд╛ рдЧрдпрд╛: рд╕рднреА рдЖрдзреБрдирд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рдПрд╕реА 97 рдСрдбрд┐рдпреЛ рдЙрдкрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд░реНрдерди рд╣реИ, рдЬреЛ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдмреИрдВрдбрд╡рд┐рдбреНрде рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдЖрдЬ рд╕реБрдмрд╣ рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдпреЛрдЧ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ ? Google рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдХреЗрд╡рд▓ рдРрд╕рд╛ рдЙрддреНрддрд░ рджреЗрддреА рд╣реИрдВ - рд▓рдЧрднрдЧ рдЕрдиреБрд╡рд╛рджред)ред
рдореИрдВрдиреЗ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛: рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдмрдврд╝рдд, рдФрд░ рдлрд┐рд░ рдПрди рдЕрд╕рддрдд, рдлрд┐рд░ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдмрдврд╝рддред рдЪрд░рд┐рддреНрд░ рдХреЗ ASCII рдореВрд▓реНрдп + рдЫреЛрдЯреЗ рд╕реНрдерд┐рд░ред
рдореИрдВ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдХреЛрдб рд╕рдВрд▓рдЧреНрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдореВрд▓ - рд▓рдЧрднрдЧ рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рдкреНрд░реВрдл-рдСрдл-рдХреЙрдиреНрд╕реЗрдкреНрдЯ ред), рдЬреЛ рдПрдХ рдЕрдВрддрд░ рдЬреЛрдбрд╝реА рдкрд░ рджреЛ рд╕реНрдЯреАрд░рд┐рдпреЛ рдЪреИрдирд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдпрджрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ)ред
рдкрд╣рд▓реЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ, рдореИрдВ 1% рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд▓рдЧрднрдЧ 320 рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред
рдХреНрдпрд╛ рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИ:
* рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рд╕реНрдХреАрдо рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░реЗрдВред
рдпрд╣ рджреЛ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ, рдПрдХ рдЬреИрдХ-рдЗрди-рдЬреИрдХ рдХреЗрдмрд▓ рдФрд░ рдХреБрдЫ рд╕реА рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рджреЛ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдкрд░ рдирдореВрдирд╛ рджрд░ рдореЗрдВ рдЕрдВрддрд░ рдХреЛ рд╕рдордЭрдиреЗ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ overestimating рдХреА рддреНрд░реБрдЯрд┐ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХреНрд╖реЗрдк рдХреЗ рд╕рд╛рде рд╢рд┐рдЦрд░ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рд╣рдореЗрдВ рд░рд┐рд╕реАрд╡рд░ рдореЗрдВ рдЖрд╡реГрддреНрддрд┐ рдирдореВрдирд╛рдХрд░рдг ( рдУрд╡рд░рд╕рдореНрдкрд▓рд┐рдВрдЧ - рд▓рдЧрднрдЧ рдЕрдиреБрд╡рд╛рдж) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рджреЛ рджрд╛рд▓реЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдзреНрд░реБрд╡реАрдпрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЕрд░реНрдерд╛рддреНред рд╣рдо рджреЛ рдмрд┐рдЯреНрд╕ рдХреЛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЪрд╛рд░ рдХреЗ рдХрд╛рд░рдХ рд╕реЗ рд╕рдВрдЪрд░рдг рдХреА рдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИ (рдЪрд╛рд░ рдХрд╛ рдХрд╛рд░рдХ рд╢рд╛рдпрдж рдЗрд╕рдХрд╛ рдареАрдХ рдпрд╣реА рдЕрд░реНрде рд╣реИ - рд▓рдЧрднрдЧ рдЕрдиреБрд╡рд╛рджред), рдЕрдЧрд░ рд╣рдо рдареАрдХ рд╕реЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдвреВрдВрдврддреЗ рд╣реИрдВред
рджреЛ рд╕реНрдЯреАрд░рд┐рдпреЛ рдЪреИрдирд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЧрддрд┐ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
* рдПрдХ рдХрд░реНрдиреЗрд▓ рд╕реНрддрд░ рдХрдВрд╕реЛрд▓ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд░реБрдХрд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдСрдбрд┐рдпреЛ рдЙрдкрдХрд░рдг рдХреЗ рд╕рд╛рде рд▓рд┐рдЦреЗрдВред
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╕рд╛рдЙрдВрдб рдХрд╛рд░реНрдб рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕ рдкрд░ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдХрдиреЗрдХреНрд╢рди рдпреВрдирд┐рдбрд╛рдпрд░реЗрдХреНрд╢рдирд▓ рд╣реИ, рддреЛ рдореЗрд░реЗ рдЬреИрд╕реЗ рдХрд░реНрдиреЗрд▓ рд╣реИрдХрд░реНрд╕ рдХрд┐рд╕реА рдХреЛ рднреА рд╕рдореНрдорд╛рдирд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЗрд╕ рдХрд╛рдо рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдореЗрдВ рдЙрдбрд╝реЛ!
рдкреЙрд▓-рд╣реЗрдирд┐рдВрдЧ
/* proof of concept transmission code */ #include <stdio.h> #include <assert.h> #include <fcntl.h> #include <sys/soundcard.h> #define OFF 5 static short int buf[2*128 + 2 * OFF]; int main(int argc __unused, char **argv __unused) { int fd_dsp; int i, j, k, c; fd_dsp = open("/dev/dsp0.1", O_RDWR); if (fd_dsp < 0) err(1, "open /dev/dsp"); i = ioctl(fd_dsp, SNDCTL_DSP_RESET, &j); assert(i == 0); j = 2; i = ioctl(fd_dsp, SNDCTL_DSP_CHANNELS, &j); assert(i == 0); j = 44100; i = ioctl(fd_dsp, SNDCTL_DSP_SPEED, &j); assert(i == 0); j = 16; i = ioctl(fd_dsp, SNDCTL_DSP_SETFMT, &j); assert(i == 0); while (1) { c = getchar(); if (c == EOF) break; buf[OFF] = 32000; buf[OFF + 1] = -32000; buf[OFF + 2 * c] = -32000; buf[OFF + 2 * c + 1] = 32000; i = write(fd_dsp, buf, sizeof buf); assert(i == sizeof buf); buf[OFF + 2 * c] = 0; buf[OFF + 1 + 2 * c] = 0; } exit (0); }
/* proof of concept reception code */ #include <assert.h> #include <stdio.h> static int sample(FILE *f, const char *p) { short l, r; int i, s; i = fread(&l, sizeof l, 1, stdin); assert(i == 1); i = fread(&r, sizeof l, 1, stdin); assert(i == 1); s = l; s -= r; if (0 && p != NULL) printf("%6d %s\n", s, p); return (s); } static void find_neg_peak(FILE *f) { int s, sl; while (1) { s = sample(stdin, "v"); if (s < -10000) break; } sl = s; while (1) { s = sample(stdin, "N"); if (s > sl) return; sl = s; } } static int find_pos_peak(FILE *f) { int s, sl, k; k = 0; while (1) { k++; s = sample(stdin, "^"); if (s > 10000) break; } sl = s; while (1) { k++; s = sample(stdin, "P"); if (s < sl) return (k); sl = s; } } int main(int argc __unused, char **argv) { short l, r; int i, k, p, s, sl; k = 0; p = 0; while (1) { find_neg_peak(stdin); k = find_pos_peak(stdin); if (k == 10) printf("\\n\n"); else if (k >= ' ' && k <= '~') printf("%c", k); else printf("\\x%02x", k); } exit (0); }