@@ -128,8 +128,8 @@ AudioConferenceMixerImpl::AudioConferenceMixerImpl(int id)
128
128
_vadEnabled(false ),
129
129
_vadReceiver(NULL ),
130
130
_amountOf10MsBetweenVadCallbacks(0 ),
131
- _amountOf10MsUntilNextVadCallback (0 ),
132
- _vadStatisticsAmount (0 ) {}
131
+ _amountOf10MsAll (0 ),
132
+ _amountOf10MsRemainder (0 ) {}
133
133
134
134
bool AudioConferenceMixerImpl::Init () {
135
135
Config config;
@@ -278,13 +278,17 @@ void AudioConferenceMixerImpl::Process() {
278
278
}
279
279
}
280
280
281
+ bool fireVadCallback = false ;
281
282
{
282
283
rtc::CritScope cs (&_crit);
283
284
284
285
// 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
+ }
288
292
289
293
if (mixList.size () + additionalFramesList.size () <= kMaximumVadParticipants ) {
290
294
AudioFrameList vadParticipantList;
@@ -297,7 +301,7 @@ void AudioConferenceMixerImpl::Process() {
297
301
298
302
UpdateVadStatistics (&vadParticipantList);
299
303
} else {
300
- WEBRTC_TRACE (kTraceWarning , kTraceAudioMixerServer , _id,
304
+ WEBRTC_TRACE (kTraceError , kTraceAudioMixerServer , _id,
301
305
" vad participants exceeded MaximumAmount(%d)" , kMaximumVadParticipants );
302
306
}
303
307
}
@@ -363,6 +367,20 @@ void AudioConferenceMixerImpl::Process() {
363
367
mixedAudio->timestamp_ = _timeStamp;
364
368
_timeStamp += static_cast <uint32_t >(_sampleSize);
365
369
}
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
+ }
366
384
}
367
385
368
386
{
@@ -375,10 +393,10 @@ void AudioConferenceMixerImpl::Process() {
375
393
mixList.size ());
376
394
}
377
395
378
- if (( _vadReceiver != NULL ) && _vadStatisticsAmount > 0 ) {
396
+ if (_vadReceiver != NULL && fireVadCallback ) {
379
397
_vadReceiver->VadParticipants (
380
- _vadStatistics,
381
- _vadStatisticsAmount );
398
+ _vadStatistics. data () ,
399
+ _vadStatistics. size () );
382
400
}
383
401
}
384
402
@@ -1021,6 +1039,9 @@ int32_t AudioConferenceMixerImpl::RegisterMixerVadCallback(
1021
1039
{
1022
1040
rtc::CritScope cs (&_crit);
1023
1041
_amountOf10MsBetweenVadCallbacks = amountOf10MsBetweenCallbacks;
1042
+ _amountOf10MsAll = 0 ;
1043
+ _amountOf10MsRemainder = 0 ;
1044
+
1024
1045
_vadEnabled = true ;
1025
1046
}
1026
1047
return 0 ;
@@ -1034,6 +1055,8 @@ int32_t AudioConferenceMixerImpl::UnRegisterMixerVadCallback() {
1034
1055
1035
1056
_vadEnabled = false ;
1036
1057
_amountOf10MsBetweenVadCallbacks = 0 ;
1058
+ _amountOf10MsAll = 0 ;
1059
+ _amountOf10MsRemainder = 0 ;
1037
1060
}
1038
1061
{
1039
1062
rtc::CritScope cs (&_cbCrit);
@@ -1043,14 +1066,23 @@ int32_t AudioConferenceMixerImpl::UnRegisterMixerVadCallback() {
1043
1066
}
1044
1067
1045
1068
void AudioConferenceMixerImpl::UpdateVadStatistics (AudioFrameList* mixList) {
1046
- _vadStatisticsAmount = 0 ;
1069
+ WEBRTC_TRACE (kTraceStream , kTraceAudioMixerServer , _id,
1070
+ " UpdateVadStatistics: %d" ,
1071
+ _amountOf10MsRemainder);
1072
+
1047
1073
for (AudioFrameList::iterator iter = mixList->begin ();
1048
1074
iter != mixList->end ();
1049
1075
++iter) {
1050
1076
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_ ]);
1054
1086
}
1055
1087
}
1056
1088
}
0 commit comments