void enc_slinear_8(int fd, audio_encoding_t *enc, int chans, int rate) { audio_info_t inf; struct ausrate rt; int8_t *samples = NULL, *p; int i, j; AUDIO_INITINFO(&inf); inf.play.precision = enc->precision; inf.play.encoding = enc->encoding; inf.play.channels = chans; inf.play.sample_rate = rate;; if (ioctl(fd, AUDIO_SETINFO, &inf) == -1) { printf("[%s]", strerror(errno)); goto out; } if (ioctl(fd, AUDIO_GETINFO, &inf) == -1) { printf("[getinfo: %s]", strerror(errno)); goto out; } rt.r_rate = inf.play.sample_rate; rt.s_rate = inf.play.sample_rate; rt.bps = 1 * chans; rt.bytes = inf.play.sample_rate * chans * PLAYSECS; samples = (int8_t *)malloc(inf.play.sample_rate * chans); if (samples == NULL) { warn("malloc"); goto out; } for (i = 0, p = samples; i < inf.play.sample_rate; i++) { float d; int8_t v; d = 127.0 * sinf(((float)i / (float)inf.play.sample_rate) * (2 * M_PI * playfreq)); d = rintf(d); v = d; for (j = 0; j < chans; j++) { *p = v; p++; } } mark_time(&rt.tv_begin); for (i = 0; i < PLAYSECS; i++) write(fd, samples, inf.play.sample_rate * chans); audio_wait(fd); mark_time(&rt.tv_end); check_srate(&rt); out: if (samples != NULL) free(samples); }
BE_STATUS be_dns_send(struct client* cli) { mark_time(cli, WRITE_BE); if (be_dns_start(cli) != BE_STARTED) return BE_ERROR; struct sockaddr_in in; in.sin_family = AF_INET; #if 0 in.sin_port = htons(53); inet_aton("1.2.3.4", &in.sin_addr); //timeout inet_aton("8.8.8.8", &in.sin_addr); inet_aton("10.225.0.17", &in.sin_addr); char dns_buffer[] = { 0x53, 0x3a, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x74, 0x65, 0x72, 0x72, 0x61, 0x03, 0x63, 0x6f, 0x6d, 0x02, 0x62, 0x72, 0x00, 0x00, 0x01, 0x00, 0x01 }; size_t len = sizeof(dns_buffer); #else in.sin_port = htons(7); inet_aton("127.0.0.1", &in.sin_addr); char dns_buffer[] = "Hello World!"; size_t len = sizeof(dns_buffer) - 1; #endif const int ret = sendto(cli->fd_be, dns_buffer, len, 0, (struct sockaddr *)&in, sizeof(in)); return ret == len ? BE_SENT_REQ : ret < len ? BE_SENT_REQ_PARTIAL : BE_SEND_ERROR; }
void be_dns_read_cb(struct ev_loop *loop, struct ev_io *w, int revents) { struct client *cli = ((struct client*) (((char*)w) - offsetof(struct client, ev_read))); ev_timer_stop(EV_A_ &cli->ev_tout); mark_time(cli, READ_BE); char dns_buffer[4096]; int ret = recv(cli->fd_be, dns_buffer, sizeof(dns_buffer), 0); if (ret <= 0) { ev_io_stop(EV_A_ w); delete_client(cli); return; } dns_buffer[ret] = 0; printf("recv: %s\n", dns_buffer); if (ret > 0) { cli->status = 200; } else { cli->status = 404; } ev_io_stop(EV_A_ w); ev_io_init(&cli->ev_write, cli->write_cb, cli->fd, EV_WRITE); ev_io_start(loop, &cli->ev_write); }