// VoiceActivityDetector.cpp: implementation of the VoiceActivityDetector class. // ////////////////////////////////////////////////////////////////////// #include "VoiceActivityDetector.h" #include "AudioSample.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// VoiceActivityDetector::VoiceActivityDetector() { EnableDetection(); char subFacilityName[100]; sprintf(subFacilityName, "VAD:%x", this); tracer.SetSubFacilityName(subFacilityName); SetTraceLevel(); } VoiceActivityDetector::~VoiceActivityDetector() { } int VoiceActivityDetector::SetTraceLevel() { long SystemMask = 0; if ((SystemMask = GetRegKeyLong(HKEY_CURRENT_USER, "Software\\Cisco Systems\\MTC\\Tracing", "AllComponents", 0x0)) == 0) { SystemMask = GetRegKeyLong(HKEY_CURRENT_USER, "Software\\Cisco Systems\\MTC\\Tracing", "VAD", 0x100000); } tracer.SetSystemMask(SystemMask); return 0; } int VoiceActivityDetector::EnableDetection() { enabled = true; return 0; } int VoiceActivityDetector::DisableDetection() { enabled = false; return 0; } int VoiceActivityDetector::TransformStarted() { return vad.Initialize(); } int VoiceActivityDetector::TransformAudioSamples(std::vector > &data, AudioSample **ppAudioSample) { AudioSample *inSample = data[0].first; int result = 0; *ppAudioSample = inSample; inSample->AddRef(this); if (enabled) { int numSamples = inSample->DataSize() / 2; if (vad.IsSilence((short *)(inSample->Data()), numSamples)) { // silence period // vad assumes 8kHz 16bit PCM mono input inSample->SetDataSize(0); inSample->SetSilenceDuration(numSamples/8); tracer.tracef(DET, "Silence : %dms\n", numSamples/8); } else { tracer.tracef(DET, "Speech : %dms\n", numSamples/8); } } else { tracer.tracef(DET, "Disabled\n"); } return result; }