⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c_manage.c

📁 这是电信语音聊天设备的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
			{
				chat_common_resource[chat_num].mt8924_user[temp] = user_num;
				user_e1[user_num].user_mix = chat_common_resource[chat_num].mt8924_slot[temp];
				return(temp);			
			}
		}
	}
	else//语控下的混合时隙申请
	{
		for(temp = 0;temp < 3;temp++)
		{
			if(chat_common_resource[chat_num].mt8924_user[temp] != IDLE)
			{
				i = chat_common_resource[chat_num].mt8924_user[temp];
				if(yukong_resource[user_e1[i].yukong_num].state == AUDIO_NO)
				{
					user_e1[i].user_mix = IDLE;
					chat_common_resource[chat_num].mt8924_user[temp] = user_num;
					user_e1[user_num].user_mix = chat_common_resource[chat_num].mt8924_slot[temp];
					no_sound(user_e1[user_num].user_mix);
					connect(user_num,user_e1[user_num].user_mix);//连接相应时隙
					connect(((user_e1[user_num].user_mix - 0xe0 + 1) % 32) + 0xe0,user_num);//连接相应时隙
					for(temp = 0;temp < 16;temp++)
					{
						if(chat_common_resource[chat_num].user_num[temp] != IDLE)
						{
							if(user_e1[i].user_mix == IDLE)
							{
								connect((chat_common_resource[chat_num].mt8924_slot[3] + 1 - 0xe0) % 32 + 0xe0,i);
							}
						}		
					}
					return(0);
				}
			}
		}
	}
}

void mt8924_release(unsigned char user_num,unsigned char chat_num,unsigned char type)//将该用户从语音混合中删除
{
	unsigned char xdata temp;
	if(type == 0)//正常的混合时隙释放
	{
		no_sound(user_e1[user_num].user_mix);
		for(temp = 0;temp < 4;temp++)
		{
			if(chat_common_resource[chat_num].mt8924_user[temp] == user_num)//寻找用户
			{
				chat_common_resource[chat_num].mt8924_user[temp] = IDLE;
				user_e1[user_num].user_mix = IDLE;
			}
		}
	}
	else//聊天室中的人数由4到5时的混合时隙释放
	{
		no_sound(chat_common_resource[chat_num].mt8924_slot[3]);
		user_e1[chat_common_resource[chat_num].mt8924_user[3]].user_mix = IDLE;
		chat_common_resource[chat_num].mt8924_user[3] = IDLE;
		for(temp = 0;temp < 16;temp++)
		{
			if(chat_common_resource[chat_num].user_num[temp] != IDLE)
			{
				if(user_e1[chat_common_resource[chat_num].user_num[temp]].user_mix == IDLE)
				{
					connect(((chat_common_resource[chat_num].mt8924_slot[3] + 1 - 0xe0) % 32) + 0xe0,chat_common_resource[chat_num].user_num[temp]);
				}
			}		
		}
	}
}

void mt8924_common_release(unsigned char chat_num)//MT8924混合资源释放
{
	unsigned char xdata temp;
	for(temp = 0;temp < 4;temp++)
	{
		no_sound(chat_common_resource[chat_num].mt8924_slot[temp]);
		chat_common_resource[chat_num].mt8924_user[temp] = IDLE;
	}
}

void common_yukong_release(unsigned char chat_num,unsigned char user_num,unsigned char type)//当公共聊天室由5人到4人时,释放所有语控资源
{
	unsigned char xdata temp,i;
	for(temp = 0;temp < 16;temp++)
	{
		if(chat_common_resource[chat_num].user_num[temp] != IDLE)
		{
			yukong_release(user_e1[chat_common_resource[chat_num].user_num[temp]].yukong_num);
		}
	}
	yukong_release(user_e1[user_num].yukong_num);
	if(type == 1)
	{
		mt8924_common_release(chat_num);
		for(temp = 0;temp < 16;temp++)
		{
			if(chat_common_resource[chat_num].user_num[temp] != IDLE)
			{
				i = chat_common_resource[chat_num].user_num[temp];
				if(mt8924_req(i,chat_num,0) != IDLE)
				{
					connect(i,user_e1[i].user_mix);
					connect(((user_e1[i].user_mix + 1 - 0xe0) % 32) + 0xe0,i);
				}
			}
		}
	}
}

unsigned char common_yukong_req(unsigned char chat_num,unsigned char user_num)//当公共聊天室由4人到5人时,申请5个语控资源
{
	unsigned char xdata temp,i;
	for(temp = 0;temp < 16;temp++)
	{
		if(chat_common_resource[chat_num].user_num[temp] != IDLE)
		{
			if(yukong_req(chat_common_resource[chat_num].user_num[temp]) == IDLE)
			{
				return(0);
			}
		}
	}
	if(yukong_req(user_num) == IDLE)
	{
		return(0);
	}
	return(1);
}

void audio_control(unsigned char yukong_num,unsigned char chat_num)//语音控制
{
	unsigned char xdata temp;
	temp = XBYTE[yukong_resource[yukong_num].addr];
	temp = (temp >> (yukong_num % 8)) & 0x01;
	iii = yukong_num;
	if(temp == 1)
	{
		iii = yukong_num;
		yukong_resource[yukong_num].state = AUDIO_YES;
		yukong_resource[yukong_num].count = 0;
	}
	else
	{
		if(yukong_resource[yukong_num].state == AUDIO_YES)
		{
			yukong_resource[yukong_num].count++;
			if(yukong_resource[yukong_num].count > 20)
			{
				yukong_resource[yukong_num].state = AUDIO_NO;	
				yukong_resource[yukong_num].count = 0;
			}
		}
	}
	if((yukong_resource[yukong_num].state == AUDIO_YES) && (user_e1[yukong_resource[yukong_num].user].user_mix == IDLE))
	{
		mt8924_req(yukong_resource[yukong_num].user,chat_num,1);
	}
}

unsigned char add_user_common(unsigned char user_num,unsigned char password[6],unsigned char chat_type)//公共聊天室加入会员
{
	unsigned char xdata temp,i,flag;
	temp = ask_common(chat_type,password);//查询是否有此聊天室
	if((temp != IDLE) && (temp != 8))//有,而且没满
	{
		if(chat_common_resource[temp].user_count < 4)//无须启动语控资源
		{
			i = assign_common_num(temp);//分配聊天室中用户的号码
			chat_common_resource[temp].user_num[i] = user_num;//置此聊天号对应的用户
			user_e1[user_num].user_num = i;//置此用户在聊天室中对应的号码
			user_e1[user_num].chat_num = 0x80 + temp;//置此用户对应的聊天室号
			chat_common_resource[temp].user_count++;//此聊天室人数加1
			//王后台回应用户状态
			command(7,0,0,temp,chat_type,((password[0] << 4) & 0xf0) + (password[1] & 0x0f),((password[2] << 4) & 0xf0) + (password[3] & 0x0f),((password[4] << 4) & 0xf0) + (password[5] & 0x0f),user_e1[user_num].telephone[0],user_e1[user_num].telephone[1],user_e1[user_num].telephone[2],user_e1[user_num].telephone[3],user_e1[user_num].telephone[4],user_e1[user_num].telephone[5],IDLE,IDLE);	
			mt8924_req(user_num,temp,0);//将该用户加入语音混合
		}
		else//需要启动语控资源
		{ 
			if(chat_common_resource[temp].user_count == 4)//由4人到5人时需要申请5个语控资源
			{
				if(common_yukong_req(temp,user_num) == 1)//申请到5个语控资源
				{
					i = assign_common_num(temp);//分配聊天室中用户的号码
					chat_common_resource[temp].user_num[i] = user_num;//置此聊天号对应的用户
					user_e1[user_num].user_num = i;//置此用户在聊天室中对应的号码
					user_e1[user_num].chat_num = 0x80 + temp;//置此用户对应的聊天室号
					chat_common_resource[temp].user_count++;//此聊天室人数加1
					//往后台回应用户状态
					command(7,0,0,temp,chat_type,((password[0] << 4) & 0xf0) + (password[1] & 0x0f),((password[2] << 4) & 0xf0) + (password[3] & 0x0f),((password[4] << 4) & 0xf0) + (password[5] & 0x0f),user_e1[user_num].telephone[0],user_e1[user_num].telephone[1],user_e1[user_num].telephone[2],user_e1[user_num].telephone[3],user_e1[user_num].telephone[4],user_e1[user_num].telephone[5],IDLE,IDLE);	
					mt8924_release(user_num,temp,1);				
				}
				else//语控资源不足
				{
					common_yukong_release(temp,user_num,0);
					return(IDLE);
				}
			}
			else//聊天室多于4人时,只须新加入的成员申请语控
			{
				if(yukong_req(user_num) != IDLE)//申请到语控资源
				{
					i = assign_common_num(temp);//分配聊天室中用户的号码
					chat_common_resource[temp].user_num[i] = user_num;//置此聊天号对应的用户
					user_e1[user_num].user_num = i;//置此用户在聊天室中对应的号码
					user_e1[user_num].chat_num = 0x80 + temp;//置此用户对应的聊天室号
					chat_common_resource[temp].user_count++;//此聊天室人数加1
					//往后台回应用户状态
					command(7,0,0,temp,chat_type,((password[0] << 4) & 0xf0) + (password[1] & 0x0f),((password[2] << 4) & 0xf0) + (password[3] & 0x0f),((password[4] << 4) & 0xf0) + (password[5] & 0x0f),user_e1[user_num].telephone[0],user_e1[user_num].telephone[1],user_e1[user_num].telephone[2],user_e1[user_num].telephone[3],user_e1[user_num].telephone[4],user_e1[user_num].telephone[5],IDLE,IDLE);	
				}
				else//语控资源不足
				{
					return(IDLE);
				}
			}
		}
		return(temp);	
	}
	else
	{
		if(temp == 8)
		{
			return(IDLE);		
		}
		else//没有
		{
			return(chat_common_req(user_num,password,chat_type));//申请新建聊天室
		}
	}
}

chat_common_release(unsigned char chat_num)//释放公共聊天室资源
{
	unsigned char xdata temp;
	chat_common_count++;
	//往后台回应聊天室状态
	command(6,0,1,chat_num,chat_common_resource[chat_num].type,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
	chat_common_resource[chat_num].flag = LEISURE;
	chat_common_resource[chat_num].type = IDLE;
	chat_common_resource[chat_num].user_count = 0;
	for(temp = 0;temp < 16;temp++)
	{
		chat_common_resource[chat_num].user_num[temp] = IDLE;
	}
	for(temp = 0;temp < 6;temp++)
	{
		chat_common_resource[chat_num].password[temp] = IDLE;
	}
}

reduce_user_common(unsigned char chat_num,unsigned char user_num)//用户退出此聊天室
{
	unsigned char xdata temp,password[3];
	for(temp = 0;temp < 3;temp++)
	{
		password[temp] = ((user_e1[user_num].password[2 * temp] << 4) & 0xf0) + (user_e1[user_num].password[2 * temp + 1] & 0x0f);
	}
	if(chat_num != IDLE)
	{
		chat_common_resource[chat_num].user_count--;//聊天室人数减1
		//往后台回应用户状态
		command(7,0,1,chat_num,chat_common_resource[chat_num].type,password[0],password[1],password[2],user_e1[user_num].telephone[0],user_e1[user_num].telephone[1],user_e1[user_num].telephone[2],user_e1[user_num].telephone[3],user_e1[user_num].telephone[4],user_e1[user_num].telephone[5],IDLE,IDLE);
		chat_common_resource[chat_num].user_num[user_e1[user_num].user_num] = IDLE;//将此用户从此聊天室中删除
		if(user_e1[user_num].user_mix != IDLE)
		{
			mt8924_release(user_num,chat_num,0);//将该用户从语音混合中删除
		}
		if(chat_common_resource[chat_num].user_count < 5)//此聊天室此刻聊天人数是否小于5
		{
			if(chat_common_resource[chat_num].user_count == 0)//此聊天室此刻聊天人数是否为0
			{
				chat_common_release(chat_num);//是则释放此聊天室资源
			}
			else
			{
				if(chat_common_resource[chat_num].user_count == 4)//聊天室只剩下4人,释放所有语控资源
				{
					common_yukong_release(chat_num,user_num,1);
				}
				else//聊天室人数小于5人,且不为0
				{
					for(temp = 0;temp < 4;temp++)
					{
						if(chat_common_resource[chat_num].mt8924_user[temp] == user_num)
						{
							no_sound(chat_common_resource[chat_num].mt8924_slot[temp]);
							chat_common_resource[chat_num].mt8924_user[temp] = IDLE;
						}
					}
				}
			}
		}
		else//至少还有5人(还需要语音检测)
		{
			chat_common_resource[chat_num].user_num[user_e1[user_num].user_num] = IDLE;//将此用户从此聊天室中删除
			yukong_release(user_num);//释放此用户的语控资源
		}
	}
}

chat_private_init()//私聊初始化
{
	unsigned char i,temp;
	chat_private_count = 64;
	for(i = 0;i < 64;i++)
	{
		chat_private_resource[i].flag = LEISURE;
		chat_private_resource[i].user_count = 0;
		for(temp = 0;temp < 2;temp++)
		{
			chat_private_resource[i].user_num[temp] = IDLE;
		}
	}
}

unsigned char chat_private_req(unsigned char user_num)//申请私人聊天室资源
{
	unsigned char xdata temp,i;
	if(chat_private_count == 0)//如果没有资源
	{
		return(IDLE);
	}
	else//还有空闲资源
	{
		for(temp = 0;temp < 64;temp++)
		{
			if(chat_private_resource[temp].flag == LEISURE)//寻找空闲资源
			{
				chat_private_count--;//剩余资源减1
				//往后台回应聊天室状态
				command(6,1,0,temp,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
				//往后台回应用户状态
				command(7,1,user_e1[user_num].user_sex,user_e1[user_num].user_age,user_e1[user_num].opp_sex,user_e1[user_num].opp_age,0,temp,user_e1[user_num].telephone[0],user_e1[user_num].telephone[1],user_e1[user_num].telephone[2],user_e1[user_num].telephone[3],user_e1[user_num].telephone[4],user_e1[user_num].telephone[5],IDLE,IDLE);
				chat_private_resource[temp].flag = OCCUPY;//置占用标志
				chat_private_resource[temp].user_num[chat_private_resource[temp].user_count] = user_num;//置用户号
				user_e1[user_num].user_num = chat_private_resource[temp].user_count;//置用户对应聊天室中的号码号
				user_e1[user_num].chat_num = temp;//置用户聊天室号
				user_e1[user_num].opp_num = IDLE;
				chat_private_resource[temp].user_count = 1;//聊天室中的人数加1
				return(temp);
			}
		}
	}
}

unsigned char assign_private_num(unsigned char chat_num)//分配聊天室中用户的号码
{
	unsigned char xdata temp;
	for(temp = 0;temp < 2;temp++)
	{
		if(chat_private_resource[chat_num].user_num[temp] == IDLE)//聊天室中此号码是否分配
		{
			return(temp);
		}
	}
}

unsigned char ask_private(unsigned char user_num)//在线寻找有无合适的聊友
{
	unsigned char xdata temp,i;
	for(temp = 0;temp < 64;temp++)
	{
		if(chat_private_resource[temp].flag == OCCUPY)//判断此聊天室是否分配
		{
			if(chat_private_resource[temp].user_count == 1)//判断此聊天室是否有人在线等待
			{
				if(chat_private_resource[temp].user_num[0] != IDLE)//判断用户对应的聊天号
				{
					i = chat_private_resource[temp].user_num[0];//找到在线等待的用户
					user_e1[user_num].opp_num = i;
				}
				else
				{
					i = chat_private_resource[temp].user_num[1];//找到在线等待的用户
					user_e1[user_num].opp_num = i;
				}
				if(user_e1[i].user_sex == user_e1[user_num].opp_sex)//已经在聊天室里的用户的性别满足新进来用户的要求
				{
					if(user_e1[i].opp_sex == user_e1[user_num].user_sex)//新进来用户的性别满足已经在聊天室里的用户的要求
					{
						if(user_e1[i].opp_age == IDLE)//已经在聊天室里的用户对聊友没有年龄要求
						{
							if(user_e1[user_num].opp_age == IDLE)//新进来的用户对聊友的年龄没有要求
							{
								return(temp);//在线找到合意的聊友
							}
							else//新进来的用户对聊友的年龄有要求
							{
								//判断已经在聊天室里的用户是否满足新进来的用户的要求
								if((user_e1[i].user_age > (user_e1[user_num].opp_age - 6)) && (user_e1[i].user_age < (user_e1[user_num].opp_age + 6)))
								{
									return(temp);//在线找到合意的聊友
								}
							}
						}
						else//已经在聊天室里的用户对聊友有年龄要求
						{
							if(user_e1[user_num].opp_age == IDLE)//新进来的用户对聊友的年龄没有要求
							{
								//判断新进来的用户是否满足已经在聊天室里的用户的要求
								if((user_e1[user_num].user_age > (user_e1[i].opp_age - 6)) && (user_e1[user_num].user_age < (user_e1[i].opp_age + 6)))
								{
									return(temp);//在线找到合意的聊友
								}
							}
							else//新进来的用户对聊友的年龄有要求
							{
								//判断新进来的用户是否满足已经在聊天室里的用户的要求
								if((user_e1[user_num].user_age > (user_e1[i].opp_age - 6)) && (user_e1[user_num].user_age < (user_e1[i].opp_age + 6)))
								{
									//判断已经在聊天室里的用户是否满足新进来的用户的要求
									if((user_e1[i].user_age > (user_e1[user_num].opp_age - 6)) && (user_e1[i].user_age < (user_e1[user_num].opp_age + 6)))
									{
										return(temp);//在线找到合意的聊友
									}
								}
							}
						}
					}
				}
			}
		}
	}
	return(IDLE);//在线没有合意的聊友
}

unsigned char add_user_private(unsigned char user_num)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -