Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void SV_ParseVoiceData_emu(IGameClient *cl)
- {
- sizebuf_t buff;
- int start = *g_RehldsFuncs->GetMsgReadCount();
- auto netmsg = g_RehldsFuncs->GetNetMessage();
- char chReceived[4096];
- short nDataLength = g_RehldsFuncs->MSG_ReadShort();
- if (nDataLength > sizeof(chReceived)) {
- g_RehldsFuncs->DropClient(cl, FALSE, "Invalid voice data\n");
- return;
- }
- int point = *g_RehldsFuncs->GetMsgReadCount();
- g_RehldsFuncs->MSG_ReadBuf(nDataLength, chReceived);
- if (g_pcv_sv_voiceenable->value == 0.0f) {
- return;
- }
- CRevoicePlayer *srcPlayer = GetPlayerByClientPtr(cl);
- srcPlayer->SetLastVoiceTime(g_RehldsSv->GetTime());
- srcPlayer->IncreaseVoiceRate(nDataLength);
- static char sameBuff[4096];
- static byte temp[4096];
- short sameBuffLen = 0;
- switch (srcPlayer->GetCodecType())
- {
- case vct_silk:
- {
- if (nDataLength > MAX_SILK_DATA_LEN || srcPlayer->GetVoiceRate() > MAX_SILK_VOICE_RATE)
- return;
- sameBuffLen = TranscodeVoice(srcPlayer, chReceived, nDataLength, srcPlayer->GetSilkCodec(), srcPlayer->GetSilkCodec(), sameBuff, sizeof(sameBuff));
- break;
- }
- case vct_opus:
- {
- if (nDataLength > MAX_OPUS_DATA_LEN || srcPlayer->GetVoiceRate() > MAX_OPUS_VOICE_RATE)
- return;
- sameBuffLen = TranscodeVoice(srcPlayer, chReceived, nDataLength, srcPlayer->GetOpusCodec(), srcPlayer->GetOpusCodec(), sameBuff, sizeof(sameBuff));
- break;
- }
- case vct_speex:
- {
- if (nDataLength > MAX_SPEEX_DATA_LEN || srcPlayer->GetVoiceRate() > MAX_SPEEX_VOICE_RATE)
- return;
- sameBuffLen = TranscodeVoice(srcPlayer, chReceived, nDataLength, srcPlayer->GetSpeexCodec(), srcPlayer->GetSpeexCodec(), sameBuff, sizeof(sameBuff));
- break;
- }
- default:
- return;
- }
- //UTIL_ServerPrintf("%d %d\n", nDataLength, sameBuffLen);
- if (sameBuffLen)
- {
- if (nDataLength >= sameBuffLen)
- {
- memcpy(&netmsg->data[start], &sameBuffLen, 2);
- memcpy(&netmsg->data[point], sameBuff, sameBuffLen);
- if (nDataLength != sameBuffLen)
- {
- std::vector<unsigned char> myvector(nDataLength - sameBuffLen);
- std::fill(myvector.begin(), myvector.end(), 1);
- memcpy(&netmsg->data[point + sameBuffLen], myvector.data(), myvector.size());
- }
- }
- else
- {
- // start point end
- //.....|............|............|
- int len = netmsg->cursize - (point + nDataLength);
- if (len)
- {
- memcpy(temp, &netmsg->data[point + nDataLength], len);
- memcpy(&netmsg->data[start], &sameBuffLen, 2);
- memcpy(&netmsg->data[point], sameBuff, sameBuffLen);
- memcpy(&netmsg->data[point + sameBuffLen], temp, len - (sameBuffLen - nDataLength));
- g_RehldsFuncs->MSG_WriteBuf(netmsg, (sameBuffLen - nDataLength), &temp[len - (sameBuffLen - nDataLength)]);
- }
- else
- {
- memcpy(&netmsg->data[start], &sameBuffLen, 2);
- memcpy(&netmsg->data[point], sameBuff, sameBuffLen-(sameBuffLen- nDataLength));
- g_RehldsFuncs->MSG_WriteBuf(netmsg, (sameBuffLen - nDataLength), &sameBuff[sameBuffLen - (sameBuffLen - nDataLength)]);
- }
- }
- }
- *g_RehldsFuncs->GetMsgReadCount() = start;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement