|
15 | 15 | #include "webrtc/modules/audio_processing/include/audio_processing.h"
|
16 | 16 | #include "webrtc/system_wrappers/include/trace.h"
|
17 | 17 |
|
| 18 | +//#define _VAD_METHOD_ENERGY_ |
| 19 | +#define _VAD_METHOD_VOICE_DETECTION_ |
| 20 | +//#define _VAD_METHOD_JOINT_ENERGY_VOICE_DETECTION_ |
| 21 | + |
18 | 22 | namespace webrtc {
|
19 | 23 | namespace {
|
20 | 24 |
|
@@ -496,6 +500,9 @@ int32_t AudioConferenceMixerImpl::SetMixabilityStatus(
|
496 | 500 | // Note: The scratch buffer may only be updated in Process().
|
497 | 501 | rtc::CritScope cs(&_crit);
|
498 | 502 | _numMixedParticipants = numMixedParticipants;
|
| 503 | + |
| 504 | + if (!mixable) _apms.clear(); |
| 505 | + |
499 | 506 | return 0;
|
500 | 507 | }
|
501 | 508 |
|
@@ -1074,15 +1081,44 @@ void AudioConferenceMixerImpl::UpdateVadStatistics(AudioFrameList* mixList) {
|
1074 | 1081 | iter != mixList->end();
|
1075 | 1082 | ++iter) {
|
1076 | 1083 | if((*iter).frame->vad_activity_ == AudioFrame::kVadActive) {
|
1077 |
| - if (_vadParticipantEnergyList.find((*iter).frame->id_) == _vadParticipantEnergyList.end()) { |
1078 |
| - _vadParticipantEnergyList[(*iter).frame->id_] = 0; |
| 1084 | + int32_t id = (*iter).frame->id_; |
| 1085 | + uint32_t energy = 0; |
| 1086 | + |
| 1087 | + if (_vadParticipantEnergyList.find(id) == _vadParticipantEnergyList.end()) { |
| 1088 | + _vadParticipantEnergyList[id] = 0; |
1079 | 1089 | }
|
1080 |
| - uint32_t energy = CalculateEnergy(*(*iter).frame); |
1081 |
| - _vadParticipantEnergyList[(*iter).frame->id_] += energy; |
| 1090 | + |
| 1091 | +#if defined (_VAD_METHOD_ENERGY_) |
| 1092 | + energy = CalculateEnergy(*(*iter).frame); |
| 1093 | +#elif defined (_VAD_METHOD_VOICE_DETECTION_) |
| 1094 | + if (_apms.find(id) == _apms.end()) { |
| 1095 | + _apms[id].reset(AudioProcessing::Create()); |
| 1096 | + _apms[id]->voice_detection()->Enable(true); |
| 1097 | + _apms[id]->voice_detection()->set_likelihood (VoiceDetection::kLowLikelihood); |
| 1098 | + } |
| 1099 | + _apms[id]->ProcessStream((*iter).frame); |
| 1100 | + |
| 1101 | + bool hasVoice = _apms[id]->voice_detection ()->stream_has_voice(); |
| 1102 | + energy = hasVoice * 100; |
| 1103 | +#elif defined (_VAD_METHOD_JOINT_ENERGY_VOICE_DETECTION_) |
| 1104 | + if (_apms.find(id) == _apms.end()) { |
| 1105 | + _apms[id].reset(AudioProcessing::Create()); |
| 1106 | + _apms[id]->voice_detection()->Enable(true); |
| 1107 | + _apms[id]->voice_detection()->set_likelihood (VoiceDetection::kLowLikelihood); |
| 1108 | + } |
| 1109 | + _apms[id]->ProcessStream((*iter).frame); |
| 1110 | + |
| 1111 | + bool hasVoice = _apms[id]->voice_detection ()->stream_has_voice(); |
| 1112 | + energy = hasVoice ? CalculateEnergy(*(*iter).frame) : 0; |
| 1113 | +#else |
| 1114 | +#error "Invalid VAD method!" |
| 1115 | +#endif |
| 1116 | + |
| 1117 | + _vadParticipantEnergyList[id] += energy; |
1082 | 1118 |
|
1083 | 1119 | WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, _id,
|
1084 | 1120 | "###VadStatistics id(%d), energy(%12u), allEnergy(%12ld)",
|
1085 |
| - (*iter).frame->id_, energy, _vadParticipantEnergyList[(*iter).frame->id_]); |
| 1121 | + id, energy, _vadParticipantEnergyList[id]); |
1086 | 1122 | }
|
1087 | 1123 | }
|
1088 | 1124 | }
|
|
0 commit comments