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; }
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; }