From 292c4c3b24f32fd11c52a96918882a55696a682f Mon Sep 17 00:00:00 2001 From: BotoX Date: Mon, 10 May 2021 23:52:01 +0200 Subject: [PATCH] store voice chat silence periods --- demboyz/game/logic.cpp | 5 +++++ demboyz/game/sourcecontext.cpp | 2 +- demboyz/io/voicewriter/voicedatawriter.cpp | 18 ++++++++++++++++++ demboyz/io/voicewriter/voicedatawriter.h | 4 ++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/demboyz/game/logic.cpp b/demboyz/game/logic.cpp index 3986749..1d0f587 100644 --- a/demboyz/game/logic.cpp +++ b/demboyz/game/logic.cpp @@ -66,6 +66,11 @@ void Logic::Finish(bool dirty) data["voice"]["total_time"] = voiceTotalTime; data["voice"]["active_time"] = voiceActiveTime; + for(const auto& o : context->voiceWriter->m_silence) + { + data["voice"]["silence"] += json({o.first, o.second}); + } + std::string out = data.dump(2, ' ', false, json::error_handler_t::replace); out.append("\n"); fwrite(out.c_str(), out.size(), 1, context->outputFp); diff --git a/demboyz/game/sourcecontext.cpp b/demboyz/game/sourcecontext.cpp index 28ef384..5bcada7 100644 --- a/demboyz/game/sourcecontext.cpp +++ b/demboyz/game/sourcecontext.cpp @@ -64,8 +64,8 @@ void SourceGameContext::Start() void SourceGameContext::Finish(bool dirty) { - logic->Finish(dirty); voiceWriter->Finish(); + logic->Finish(dirty); } void SourceGameContext::StartCommandPacket(const CommandPacket& packet) diff --git a/demboyz/io/voicewriter/voicedatawriter.cpp b/demboyz/io/voicewriter/voicedatawriter.cpp index 568884a..7731947 100644 --- a/demboyz/io/voicewriter/voicedatawriter.cpp +++ b/demboyz/io/voicewriter/voicedatawriter.cpp @@ -149,6 +149,12 @@ void VoiceDataWriter::Start() void VoiceDataWriter::Finish() { + if(m_isSilenced) + { + m_isSilenced = false; + m_silence.back().second = m_curTick; + } + for(auto& state : m_playerVoiceStates) { state.second.celt_decoder.Destroy(); @@ -180,7 +186,19 @@ void VoiceDataWriter::EndCommandPacket(const PacketTrailingBits& trailingBits) // Skip silence if noone talks for at least 3 seconds if((m_curTick - m_lastVoiceTick) / context->fTickRate > 3.0) + { + if(!m_isSilenced) + { + m_isSilenced = true; + m_silence.emplace_back(std::make_pair(m_curTick, 0)); + } m_silenceTicks += (m_curTick - m_lastTick); + } + else if(m_isSilenced) + { + m_isSilenced = false; + m_silence.back().second = m_curTick; + } for(auto& state : m_playerVoiceStates) { diff --git a/demboyz/io/voicewriter/voicedatawriter.h b/demboyz/io/voicewriter/voicedatawriter.h index f52b822..443312a 100644 --- a/demboyz/io/voicewriter/voicedatawriter.h +++ b/demboyz/io/voicewriter/voicedatawriter.h @@ -92,4 +92,8 @@ private: static const int sQuality = 3; eCodec m_Codec = CODEC_NONE; + +public: + bool m_isSilenced = false; + std::vector> m_silence; };