static int
client_event(void *data)
{
	char buf[4096];
	struct _client *cnode = data;
	int nrecv;

	if ((nrecv = recv(cnode->fd, buf, sizeof(buf)-1, 0)) > 0) {
		buf[nrecv] = '\0';
		return _client_event(cnode, buf);
	}
	if (nrecv == 0) {
		remove_client(cnode);
		return 0;
	}
	log_client_err(cnode, "recv(%d) failed %m", cnode->fd);
	return -1;
}
static void
handle_values(int mixnum, int nvalues, value_record_t values[], int len)
{
	int i;

	if (nvalues*sizeof(value_record_t) > len)
	{
		fprintf(stderr, "Short value record (%lu, %d)\n",
                        (unsigned long)(nvalues*sizeof(value_record_t)), len);
		exit(EXIT_FAILURE);
	}

	for (i=0;i<nvalues;i++)
	{
	    _client_event (OSSMIX_EVENT_VALUE, mixnum, values[i].node, values[i].value, 0, 0);
	}

}
static void
handle_packet (ossmix_commad_packet_t * msg, char *payload, int payload_size)
{
//printf("Got packet %d, p=0x%08x, %d, %d, %d, %d\n",
//              msg->cmd, msg->p1, msg->p2, msg->p3, msg->p4, msg->p5);

//  _client_event (msg->cmd, msg->p1, msg->p2, msg->p3, msg->p4, msg->p5);

	switch(msg->cmd)
	{
	case OSSMIX_EVENT_VALUE:
		handle_values(msg->p2, msg->p1, (value_record_t *)payload, payload_size);
		break;

	case OSSMIX_EVENT_NEWMIXER:
		//num_mixers=msg->p1;
	 	_client_event (OSSMIX_EVENT_NEWMIXER, msg->p1, 0, 0, 0, 0);
		break;

	default:
		fprintf(stderr, "Unrecognized event packet %d\n", msg->cmd);
		exit(EXIT_FAILURE);
	}
}