Ejemplo n.º 1
0
int
read_do_shm (xmmsc_vis_unixshm_t *t, xmmsc_visualization_t *v, short *buffer, int drawtime, unsigned int blocking)
{
	int old;
	int ret;
	xmmsc_vischunk_t *src;
	int i, size;

	ret = read_start_shm (t, blocking, &src);
	if (ret < 1) {
		return ret;
	}

	old = check_drawtime (net2ts (src->timestamp), drawtime);

	if (!old) {
		size = ntohs (src->size);
		for (i = 0; i < size; ++i) {
			buffer[i] = (int16_t)ntohs (src->data[i]);
		}
	}
	read_finish_shm (t, src);
	if (!old) {
		return size;
	}
	return 0;
}
Ejemplo n.º 2
0
int
read_do_udp (xmmsc_vis_udp_t *t, xmmsc_visualization_t *v, short *buffer, int drawtime, unsigned int blocking)
{
	int old;
	int ret;
	int i, size;
	xmmsc_vis_udp_data_t packet_d;
	char* packet = packet_init_data (&packet_d);
	xmmsc_vischunk_t data;

	if (blocking) {
		wait_for_socket (t, blocking);
	}

	ret = recv (t->socket[0], packet, packet_d.size, 0);
	if ((ret > 0) && (*packet_d.__unaligned_type == 'V')) {
		uint16_t grace;
		struct timeval rtv;

		XMMSC_VIS_UNALIGNED_READ (data, packet_d.__unaligned_data, xmmsc_vischunk_t);

		/* resync connection */
		XMMSC_VIS_UNALIGNED_READ (grace, packet_d.__unaligned_grace, uint16_t);
		grace = ntohs (grace);
		if (grace < 1000) {
			if (t->grace != 0) {
				t->grace = 0;
				/* use second socket here, so vis packets don't get lost */
				t->timediff = udp_timediff (v->id, t->socket[1]);
			}
		} else {
			t->grace = grace;
		}
		/* include the measured time difference */

		rtv.tv_sec = ntohl (data.timestamp[0]);
		rtv.tv_usec = ntohl (data.timestamp[1]);

		double interim = tv2ts (&rtv);
		interim -= t->timediff;
		ts2net (data.timestamp, interim);
		ret = 1;
	} else {
		if (ret == 1 && *packet_d.__unaligned_type == 'K') {
			ret = -1;
		} else if (ret > -1 || xmms_socket_error_recoverable ()) {
			ret = 0;
		} else {
			ret = -1;
		}
		free (packet);
		return ret;
	}

	old = check_drawtime (net2ts (data.timestamp), drawtime);

	if (!old) {
		size = ntohs (data.size);
		for (i = 0; i < size; ++i) {
			buffer[i] = (int16_t)ntohs (data.data[i]);
		}
	}

	free (packet);

	if (!old) {
		return size;
	}
	return 0;
}