Skip to content
This repository was archived by the owner on Oct 25, 2024. It is now read-only.

Commit d34f58e

Browse files
daijhDuan, Xiande
authored andcommitted
Improve vad
Signed-off-by: Dai, Jianhui <[email protected]> Change-Id: I74922967e84fe7525bb8b4a9f8a69748cf0decca Reviewed-on: https://git-ccr-1.devtools.intel.com/gerrit/74246 Reviewed-by: Duan, Xiande <[email protected]> Tested-by: Duan, Xiande <[email protected]>
1 parent 5dd0f01 commit d34f58e

File tree

2 files changed

+51
-17
lines changed

2 files changed

+51
-17
lines changed

webrtc/modules/audio_conference_mixer/source/audio_conference_mixer_impl.cc

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,8 @@ AudioConferenceMixerImpl::AudioConferenceMixerImpl(int id)
128128
_vadEnabled(false),
129129
_vadReceiver(NULL),
130130
_amountOf10MsBetweenVadCallbacks(0),
131-
_amountOf10MsUntilNextVadCallback(0),
132-
_vadStatisticsAmount(0) {}
131+
_amountOf10MsAll(0),
132+
_amountOf10MsRemainder(0) {}
133133

134134
bool AudioConferenceMixerImpl::Init() {
135135
Config config;
@@ -278,13 +278,17 @@ void AudioConferenceMixerImpl::Process() {
278278
}
279279
}
280280

281+
bool fireVadCallback = false;
281282
{
282283
rtc::CritScope cs(&_crit);
283284

284285
// woogeen vad
285-
_vadStatisticsAmount = 0;
286-
if(_vadEnabled && _amountOf10MsUntilNextVadCallback-- == 0) {
287-
_amountOf10MsUntilNextVadCallback = _amountOf10MsBetweenVadCallbacks;
286+
if(_vadEnabled) {
287+
if (_amountOf10MsRemainder == 0) {
288+
_amountOf10MsAll = _amountOf10MsBetweenVadCallbacks;
289+
_amountOf10MsRemainder = _amountOf10MsBetweenVadCallbacks;
290+
_vadParticipantEnergyList.clear();
291+
}
288292

289293
if (mixList.size() + additionalFramesList.size() <= kMaximumVadParticipants) {
290294
AudioFrameList vadParticipantList;
@@ -297,7 +301,7 @@ void AudioConferenceMixerImpl::Process() {
297301

298302
UpdateVadStatistics(&vadParticipantList);
299303
} else {
300-
WEBRTC_TRACE(kTraceWarning, kTraceAudioMixerServer, _id,
304+
WEBRTC_TRACE(kTraceError, kTraceAudioMixerServer, _id,
301305
"vad participants exceeded MaximumAmount(%d)", kMaximumVadParticipants);
302306
}
303307
}
@@ -363,6 +367,20 @@ void AudioConferenceMixerImpl::Process() {
363367
mixedAudio->timestamp_ = _timeStamp;
364368
_timeStamp += static_cast<uint32_t>(_sampleSize);
365369
}
370+
371+
// woogeen vad
372+
if(_vadEnabled && --_amountOf10MsRemainder == 0) {
373+
_vadStatistics.resize(_vadParticipantEnergyList.size());
374+
375+
size_t i = 0;
376+
for (auto& item : _vadParticipantEnergyList) {
377+
_vadStatistics[i].id = item.first;
378+
_vadStatistics[i].energy = item.second / _amountOf10MsAll;
379+
380+
i++;
381+
}
382+
fireVadCallback = true;
383+
}
366384
}
367385

368386
{
@@ -375,10 +393,10 @@ void AudioConferenceMixerImpl::Process() {
375393
mixList.size());
376394
}
377395

378-
if((_vadReceiver != NULL) && _vadStatisticsAmount > 0) {
396+
if(_vadReceiver != NULL && fireVadCallback) {
379397
_vadReceiver->VadParticipants(
380-
_vadStatistics,
381-
_vadStatisticsAmount);
398+
_vadStatistics.data(),
399+
_vadStatistics.size());
382400
}
383401
}
384402

@@ -1021,6 +1039,9 @@ int32_t AudioConferenceMixerImpl::RegisterMixerVadCallback(
10211039
{
10221040
rtc::CritScope cs(&_crit);
10231041
_amountOf10MsBetweenVadCallbacks = amountOf10MsBetweenCallbacks;
1042+
_amountOf10MsAll = 0;
1043+
_amountOf10MsRemainder = 0;
1044+
10241045
_vadEnabled = true;
10251046
}
10261047
return 0;
@@ -1034,6 +1055,8 @@ int32_t AudioConferenceMixerImpl::UnRegisterMixerVadCallback() {
10341055

10351056
_vadEnabled = false;
10361057
_amountOf10MsBetweenVadCallbacks = 0;
1058+
_amountOf10MsAll = 0;
1059+
_amountOf10MsRemainder = 0;
10371060
}
10381061
{
10391062
rtc::CritScope cs(&_cbCrit);
@@ -1043,14 +1066,23 @@ int32_t AudioConferenceMixerImpl::UnRegisterMixerVadCallback() {
10431066
}
10441067

10451068
void AudioConferenceMixerImpl::UpdateVadStatistics(AudioFrameList* mixList) {
1046-
_vadStatisticsAmount = 0;
1069+
WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, _id,
1070+
"UpdateVadStatistics: %d",
1071+
_amountOf10MsRemainder);
1072+
10471073
for (AudioFrameList::iterator iter = mixList->begin();
10481074
iter != mixList->end();
10491075
++iter) {
10501076
if((*iter).frame->vad_activity_ == AudioFrame::kVadActive) {
1051-
_vadStatistics[_vadStatisticsAmount].id = (*iter).frame->id_;
1052-
_vadStatistics[_vadStatisticsAmount].energy = CalculateEnergy(*(*iter).frame);
1053-
_vadStatisticsAmount++;
1077+
if (_vadParticipantEnergyList.find((*iter).frame->id_) == _vadParticipantEnergyList.end()) {
1078+
_vadParticipantEnergyList[(*iter).frame->id_] = 0;
1079+
}
1080+
uint32_t energy = CalculateEnergy(*(*iter).frame);
1081+
_vadParticipantEnergyList[(*iter).frame->id_] += energy;
1082+
1083+
WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, _id,
1084+
"###VadStatistics id(%d), energy(%12u), allEnergy(%12ld)",
1085+
(*iter).frame->id_, energy, _vadParticipantEnergyList[(*iter).frame->id_]);
10541086
}
10551087
}
10561088
}

webrtc/modules/audio_conference_mixer/source/audio_conference_mixer_impl.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,17 +193,19 @@ class AudioConferenceMixerImpl : public AudioConferenceMixer
193193
std::unique_ptr<AudioProcessing> _limiter;
194194

195195
// woogeen vad
196-
enum {kMaximumVadParticipants = 128};
196+
enum {kMaximumVadParticipants = 1024};
197197

198198
void UpdateVadStatistics(AudioFrameList* mixList);
199199

200200
bool _vadEnabled;
201201
AudioMixerVadReceiver* _vadReceiver;
202202
uint32_t _amountOf10MsBetweenVadCallbacks;
203203

204-
uint32_t _amountOf10MsUntilNextVadCallback;
205-
size_t _vadStatisticsAmount;
206-
ParticipantVadStatistics _vadStatistics[kMaximumVadParticipants];
204+
uint32_t _amountOf10MsAll;
205+
uint32_t _amountOf10MsRemainder;
206+
std::map<int32_t, int64_t> _vadParticipantEnergyList;
207+
208+
std::vector<ParticipantVadStatistics> _vadStatistics;
207209
};
208210
} // namespace webrtc
209211

0 commit comments

Comments
 (0)