История изменений
Исправление firkax, (текущая версия) :
Через 0 все синусы проходят, но маленькой амплитуды на нём задерживается достаточно (видимо для засыпания) надолго из-за округления.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
static signed char buf[8000];
static int write_all(int fd, signed char *b, size_t n) {
ssize_t r;
while(n) {
while((r = write(fd, b, n))<0) if(r!=EINTR) return -1;
b+=r; n-=r;
}
return 0;
}
int main(void) {
pid_t fr;
int p[2];
if(pipe(p)<0) { fprintf(stderr, "pipe() error %d (%s)\n", errno, strerror(errno)); return -1; }
if((fr=fork())<0) { fprintf(stderr, "fork() error %d (%s)\n", errno, strerror(errno)); return -1; }
if(!fr) {
if(dup2(p[0],0)<0) { fprintf(stderr,"dup2(,1) error %d (%s)\n", errno, strerror(errno)); _exit(-1); }
close(p[0]); close(p[1]);
execl("/usr/bin/aplay", "/usr/bin/aplay", "-f", "S8", "-r", "8000", NULL);
fprintf(stderr, "execl() error %d (%s)\n", errno, strerror(errno));
_exit(-1);
}
close(p[0]);
memset(buf, 1, 4000);
memset(buf+4000, -1, 4000);
while(1) if(write_all(p[1], buf, 8000)<0) { fprintf(stderr, "write() error %d (%s)\n", errno, strerror(errno)); return -1; }
return 0;
}
Исходная версия firkax, :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
static signed char buf[8000];
static int write_all(int fd, signed char *b, size_t n) {
ssize_t r;
while(n) {
while((r = write(fd, b, n))<0) if(r!=EINTR) return -1;
b+=r; n-=r;
}
return 0;
}
int main(void) {
pid_t fr;
int p[2];
if(pipe(p)<0) { fprintf(stderr, "pipe() error %d (%s)\n", errno, strerror(errno)); return -1; }
if((fr=fork())<0) { fprintf(stderr, "fork() error %d (%s)\n", errno, strerror(errno)); return -1; }
if(!fr) {
if(dup2(p[0],0)<0) { fprintf(stderr,"dup2(,1) error %d (%s)\n", errno, strerror(errno)); _exit(-1); }
close(p[0]); close(p[1]);
execl("/usr/bin/aplay", "/usr/bin/aplay", "-f", "S8", "-r", "8000", NULL);
fprintf(stderr, "execl() error %d (%s)\n", errno, strerror(errno));
_exit(-1);
}
close(p[0]);
memset(buf, 1, 4000);
memset(buf+4000, -1, 4000);
while(1) if(write_all(p[1], buf, 8000)<0) { fprintf(stderr, "write() error %d (%s)\n", errno, strerror(errno)); return -1; }
return 0;
}