Пример #1
0
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);
}
Пример #2
0
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;
}
Пример #3
0
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);
}