//mody by lv start add--------------------------------------------
int UdpTalkbackThread(void *par)
{
    TALKTHRD_PARAM thdpar;
    fd_set fset;
    int ret = -1;
    struct timeval to;
    char acktest = '0';
    char pBuf[NETCMD_TALKBACK_SIZE];
	NET_HEAD netHead;
	MSG_HEAD msgHead;
	int nCount = 0;			// Add the code by lvjh, 2009-09-23

	//struct sockaddr_in addr;
	int nLen = 0;

	extern AUDIO_STREAM_BUFFER *g_audio_dec_stream;

    pthread_detach(pthread_self());
    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);

    memcpy(&thdpar, par, sizeof(thdpar));
    FD_ZERO(&fset);
    memset(&to, 0, sizeof(to));

    while ((!g_server_info.bServerExit)&&g_talk_break_flag)
    {
    	nCount++; // Add the code by lvjh, 2009-09-23
    	
		to.tv_sec = SOCK_TIME_OUT;
		to.tv_usec = 0;

		FD_SET(thdpar.hSock, &fset);
		ret = select(thdpar.hSock+1, &fset, NULL, NULL, &to);
		if (g_server_info.bServerExit)
        {
			break;
        }
        if (ret == -1)
		{
			break;
		}
		if (ret == 0)
		{
			/*
			ret = send(thdpar.hSock, &acktest, 1, 0);
			if (ret <= 0)
			{
				break;
			}
			*/

	#if 1		
			netHead.nFlag = HDVS_FLAG;
			netHead.nCommand = NETCMD_KEEP_ALIVE;
			netHead.nBufSize = 0;
			netHead.nReserve = g_server_info.dwUserID;
			printf("talkBack udp send keep alive '''' = %d\n", g_server_info.dwUserID);
			ret = udpSendMsg(thdpar.hSock, &netHead, sizeof(NET_HEAD), thdpar.addr);
			if (ret <= 0 && (errno == EPIPE || errno == ENOTSOCK || errno == EBADF))
			{
				printf("NAT(%d): Keepalive Error!\n", thdpar.hSock);
				break;
			}
	#endif	
	
		
		}

		if (!FD_ISSET(thdpar.hSock, &fset))
		{
			continue;
		}
		nLen = sizeof(struct sockaddr_in);
		ret = recvfrom(thdpar.hSock, pBuf, NETCMD_TALKBACK_SIZE, MSG_WAITALL, (struct sockaddr*)&thdpar.addr, (socklen_t *)&nLen);
		if (ret > 0)
		{
			memcpy(&netHead, pBuf, sizeof(NET_HEAD));
			printf("g_server_info.dwUserID = %d netHead.nCommand = %x\n\n", g_server_info.dwUserID, netHead.nCommand);
		#if 1
		if(netHead.nCommand == NETCMD_REC_FILE ||netHead.nCommand == NETCMD_OPEN_TALK ||netHead.nCommand ==NETCMD_LOGON ||netHead.nCommand ==NETCMD_OPEN_CHANNEL ||netHead.nCommand ==NETCMD_P2P_CMD ||netHead.nCommand == NETCMD_CLOSE_TALK)break;
		else if (netHead.nCommand == NETCMD_KEEP_ALIVE){
			printf("CMD: NETCMD_KEEP_ALIVE\n");
			printf("P2P SERVER SEND dwUserID = %d\n", netHead.nReserve);
			netHead.nFlag = HDVS_FLAG;
			netHead.nCommand = NETCMD_KEEP_ALIVE;
			netHead.nBufSize = 0;
			if(netHead.nReserve == g_server_info.dwUserID){
				printf("**************************************************\n");
				TcpSendMsgToAll_UDPremote(REMOTE_IP, REMOTE_PORT, NETCMD_NAT_CONNECT);
				printf("		TcpSendMsgToAll_UDPremote success ! \n");
				printf("**************************************************\n");
			}
		}
		else {
			msgHead.nSock = thdpar.ip;
			msgHead.addr = thdpar.addr;
			msgHead.nCmd = netHead.nCommand;
			msgHead.nRight = 3;
			msgHead.nErrorCode = 0;
			msgHead.nBufSize = netHead.nBufSize;
			msgHead.nflag  = UDP_FLAG;
			g_server_info.nupdate_flag = UDP_FLAG;
			
			ParseCommand(&msgHead, pBuf+sizeof(NET_HEAD));
		}
		#endif			
			ret = g_server_info.pCallbackStreamTalk(thdpar.ip, thdpar.port, pBuf+sizeof(NET_HEAD), (ret-sizeof(NET_HEAD)));
			
		}
    }

#if 1
	printf("Talk End (BY lvjh)(%d)!\n", thdpar.hSock);

	/******************add code by liujw 12-3-5***************************/
	// 关闭AOUT  设备
	ret =audioDecStop(TALK_CHANNEL);
	if (ret)
	{
		printf("audioDecStop Failed! 0x%x \n", ret);
	   // return -1;
	}
	else
	printf("audioDecStop ok!\n");
	
	audioDecClose(TALK_CHANNEL);
	if (ret)
	{
		printf("audioDecClose Failed! 0x%x \n", ret);
	   // return -1;
	}
	else
	printf("audioDecClose ok!\n");

	audioOutStop(TALK_CHANNEL);
	if (ret)
	{
		printf("audioOutStop Failed! 0x%x \n", ret);
	    //return -1;
	}
	else
	printf("audioOutStop ok!\n");
	
	ret = audioOutClose(TALK_CHANNEL);
	if (ret)
	{
		printf("audioOutClose(%s %d) Failed!\n", __FILE__, __LINE__);
	   // return -1;
	}
	else
	printf("audioOutClose ok!\n");

	audioDecModuleSemInit();              //zhangjing 2013-05-30
	/*delete by zhangjing 2013-06-09 static open
	if (g_audio_dec_stream)
	{
		audioBufferClose(g_audio_dec_stream);
	}*/
#endif
	//HI_MPI_ADEC_DestroyChn(0);
	//g_aenc_module_pause_flag[0] = 1;
	

	//close(thdpar.hSock);
	//g_server_info.hUdpTalkbackSocket = -1;
	return 0;
}
void broadcast(lx_light_container_t* lightCollection) {
    struct sockaddr_in sndaddr;
    memset((char *) &sndaddr, 0, sizeof(struct sockaddr_in));
    sndaddr.sin_family = AF_INET;
    sndaddr.sin_port = htons(PORT);
    sndaddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
    
    lx_protocol_t header;
    header.protocol = 1024;
    header.addressable = 1;
    header.tagged = 1;
    header.origin = 0;
    header.source = 1;
    for (int i = 0; i < 8; i++)
        header.target[i] = 0;
    header.ack_required = 0;
    header.res_required = 0;
    header.sequence = 0;
    header.reserved16 = 0;
    for(int i = 0; i < 6; i++) {
        header.reserved[i] = 0;
    }
    header.type = LX_PROTOCOL_DEVICE_GET_SERVICE;
    header.size = offsetof(lx_protocol_t,payload);
    
    struct sockaddr_in recvaddr;
    socklen_t addrlen = sizeof(recvaddr);
    int recvlen;
    int counter = 0;
    
    lx_protocol_t msg;
    lx_light_t *next;
    lx_light_t *temp;
    next = lightCollection->start;
    while ((counter) == 0) {
        udpSendMsg(&broadcast_udp_socket, header, sndaddr);
        while (1) {
            recvlen = recvfrom(broadcast_udp_socket.socket, &msg, sizeof(lx_protocol_t), 0, (struct sockaddr *)&recvaddr, &addrlen);
            if (recvlen > 0) {
                if (msg.type == LX_PROTOCOL_DEVICE_STATE_SERVICE) {
                    counter++;
                    next = (lx_light_t *)malloc(sizeof(lx_light_t));
                    for (int i = 0; i < 8; i++)
                        next->target[i] = msg.target[i];
                    next->addr = recvaddr;
                    next->next = NULL;
                    if (lightCollection->start == NULL) {
                        lightCollection->start = next;
                    }
                    else {
                        temp->next = next;
                    }
                    temp = next;
                }
            }
        
            if (recvlen == -1) {
                printf("Discovery done found %d bulbs \n", counter);
                break;
            }
        }
    }
}