LINUX.ORG.RU

История изменений

Исправление 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;
}