рдХрдВрд╕реЛрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдЙрдВрдб рдХрд╛рд░реНрдб

рдлреНрд░реАрдмрд▓реНрдб-рдЖрд░реНрдХ рдореЗрд▓рд┐рдВрдЧ рд▓рд┐рд╕реНрдЯ рдкрд░ Poul-Henning Kamp рдиреЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдП рд╣реИрдВ рдЬреЛ рд╕рд╛рдЙрдВрдб рдХрд╛рд░реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдВрд╕реЛрд▓ I / O рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдкрддреНрд░ рдХрд╛ рдореВрд▓ рдпрд╣рд╛рдБ рд╣реИ , рдФрд░ рдореИрдВ рдЕрдкрдиреЗ рдЕрдиреБрд╡рд╛рдж рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддрд╛ рд╣реВрдВ, рдореВрд▓ рдХреЗ рдХрд░реАрдмред рдореИрдВ рдХреБрдЫ рд╢рдмреНрджреЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдореВрд▓ рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рдХреЛрд╖реНрдардХ рдореЗрдВ рдореИрдВ рдЕрдкрдиреА рдзрд╛рд░рдгрд╛рдПрдВ рджреЗрддрд╛ рд╣реВрдВред



рдХрд▓, рдЬрдм рдореБрдЭреЗ рдЕрдкрдиреЗ рдирдП рд▓реИрдкрдЯреЙрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдПрд╕реАрдкреАрдЖрдИ рдХреЛ рд░реЛрдХрдиреЗ / рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдХрдЪрд░реЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рддреЛ рдореИрдВрдиреЗ рдлрд┐рд░ рд╕реЗ рдЦреБрдж рдХреЛ рдЙрд╕ рдкрд╛рдЧрд▓ рд▓рдбрд╝рдХреЗ рдХреЛ рдХреЛрд╕рддреЗ рд╣реБрдП рдкрд╛рдпрд╛ рдЬрд┐рд╕рдиреЗ рд╣рдорд╛рд░реЗ рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯреНрд╕ рдХреЛ рд▓реИрдкрдЯреЙрдк рд╕реЗ тАЛтАЛрд╣рдЯрд╛ рджрд┐рдпрд╛ рдерд╛ред



рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рд╕реЛрдЪрд╛ рдФрд░ рдпрд╣ рдЕрдЪрд╛рдирдХ рдореБрдЭ рдкрд░ рдЫрд╛ рдЧрдпрд╛: рд╕рднреА рдЖрдзреБрдирд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рдПрд╕реА 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); }
      
      








All Articles