24 struct sockaddr_storage from;
25 socklen_t sl =
sizeof (from);
28 if ((recvfrom (vis->
socket, packet, packet_d.
size, 0, (
struct sockaddr *)&from, &sl)) > 0) {
68 c->transport.udp.grace = 2000;
72 gettimeofday (&time, NULL);
74 struct timeval cts, sts;
78 cts.tv_sec = ntohl (cts.tv_sec);
79 cts.tv_usec = ntohl (cts.tv_usec);
81 sts.tv_sec = time.tv_sec - cts.tv_sec;
82 sts.tv_usec = time.tv_usec - cts.tv_usec;
83 if (sts.tv_usec < 0) {
85 sts.tv_usec += 1000000;
89 (int32_t)htonl (sts.tv_sec), int32_t);
91 (int32_t)htonl (sts.tv_usec), int32_t);
93 sendto (vis->
socket, packet, packet_d.
size, 0, (
struct sockaddr *)&from, sl);
115 struct addrinfo hints;
116 struct addrinfo *result, *rp;
119 memset (&hints, 0,
sizeof (hints));
120 hints.ai_family = AF_UNSPEC;
121 hints.ai_socktype = SOCK_DGRAM;
122 hints.ai_flags = AI_PASSIVE;
123 hints.ai_protocol = 0;
127 xmms_log_error (
"Could not setup socket! getaddrinfo: %s", gai_strerror (s));
132 for (rp = result; rp != NULL; rp = rp->ai_next) {
133 vis->
socket = socket (rp->ai_family, rp->ai_socktype, rp->ai_protocol);
137 if (bind (vis->
socket, rp->ai_addr, rp->ai_addrlen) != -1) {
146 freeaddrinfo (result);
149 freeaddrinfo (result);
157 g_io_channel_set_encoding (vis->
socketio, NULL, NULL);
158 g_io_channel_set_buffered (vis->
socketio, FALSE);
159 g_io_add_watch (vis->
socketio, G_IO_IN, (GIOFunc) udpwatcher, vis);
169 xmms_log_info (
"Visualization client %d initialised using UDP",
id);
176 socklen_t sl =
sizeof (t->
addr);
178 sendto (socket, &packet, 1, 0, (
struct sockaddr *)&t->
addr, sl);
205 (int32_t)htonl (time->tv_sec), int32_t);
207 (int32_t)htonl (time->tv_usec), int32_t);
214 offset = ((
char*)&__unaligned_dest->
data - (
char*)__unaligned_dest);
xmmsc_vis_properties_t prop
data describing a udp transport
The structures for a vis client.
int32_t * __unaligned_clientstamp
int32_t init_udp(xmms_visualization_t *vis, int32_t id, xmms_error_t *err)
uint16_t * __unaligned_grace
union xmms_vis_client_t::@2 transport
#define XMMSC_VIS_UNALIGNED_READ(dst, src, typ)
gboolean write_udp(xmmsc_vis_udp_t *t, xmms_vis_client_t *c, int32_t id, struct timeval *time, int channels, int size, short *buf, int socket)
xmms_vis_client_t * get_client(int32_t id)
UDP package descriptor to synchronize time.
xmmsc_vischunk_t * __unaligned_data
short fill_buffer(int16_t *dest, xmmsc_vis_properties_t *prop, int channels, int size, short *src)
#define xmms_log_error(fmt,...)
void cleanup_udp(xmmsc_vis_udp_t *t, xmms_socket_t socket)
#define x_fetch_client(id)
UDP package descriptor to deliver a vis chunk.
xmmsc_vis_transport_t type
#define x_release_client()
char * packet_init_data(xmmsc_vis_udp_data_t *p)
struct sockaddr_storage addr
#define xmms_log_info(fmt,...)
#define XMMS_DEFAULT_TCP_PORT
#define XMMSC_VIS_UNALIGNED_WRITE(dst, src, typ)
int32_t * __unaligned_serverstamp
#define XMMS_VISPACKET_UDP_OFFSET
void delete_client(int32_t id)
Package format for vis data, encapsulated by unixshm or udp transport.
G_BEGIN_DECLS struct xmms_error_St xmms_error_t
char * packet_init_timing(xmmsc_vis_udp_timing_t *p)
int16_t data[2 *XMMSC_VISUALIZATION_WINDOW_SIZE]
The structures for the vis module.
int xmms_socket_valid(xmms_socket_t socket)