| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 if(_timeScheduler.TimeToNextUpdate(timeUntilNextProcess) != 0) { | 182 if(_timeScheduler.TimeToNextUpdate(timeUntilNextProcess) != 0) { |
| 183 WEBRTC_TRACE(kTraceError, kTraceAudioMixerServer, _id, | 183 WEBRTC_TRACE(kTraceError, kTraceAudioMixerServer, _id, |
| 184 "failed in TimeToNextUpdate() call"); | 184 "failed in TimeToNextUpdate() call"); |
| 185 // Sanity check | 185 // Sanity check |
| 186 assert(false); | 186 assert(false); |
| 187 return -1; | 187 return -1; |
| 188 } | 188 } |
| 189 return timeUntilNextProcess; | 189 return timeUntilNextProcess; |
| 190 } | 190 } |
| 191 | 191 |
| 192 void AudioConferenceMixerImpl::Process() { | 192 int32_t AudioConferenceMixerImpl::Process() { |
| 193 size_t remainingParticipantsAllowedToMix = | 193 size_t remainingParticipantsAllowedToMix = |
| 194 kMaximumAmountOfMixedParticipants; | 194 kMaximumAmountOfMixedParticipants; |
| 195 { | 195 { |
| 196 CriticalSectionScoped cs(_crit.get()); | 196 CriticalSectionScoped cs(_crit.get()); |
| 197 assert(_processCalls == 0); | 197 assert(_processCalls == 0); |
| 198 _processCalls++; | 198 _processCalls++; |
| 199 | 199 |
| 200 // Let the scheduler know that we are running one iteration. | 200 // Let the scheduler know that we are running one iteration. |
| 201 _timeScheduler.UpdateScheduler(); | 201 _timeScheduler.UpdateScheduler(); |
| 202 } | 202 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 215 // TODO(henrike): this is probably more appropriate to do in | 215 // TODO(henrike): this is probably more appropriate to do in |
| 216 // GetLowestMixingFrequency(). | 216 // GetLowestMixingFrequency(). |
| 217 if (lowFreq == 12000) { | 217 if (lowFreq == 12000) { |
| 218 lowFreq = 16000; | 218 lowFreq = 16000; |
| 219 } else if (lowFreq == 24000) { | 219 } else if (lowFreq == 24000) { |
| 220 lowFreq = 32000; | 220 lowFreq = 32000; |
| 221 } | 221 } |
| 222 if(lowFreq <= 0) { | 222 if(lowFreq <= 0) { |
| 223 CriticalSectionScoped cs(_crit.get()); | 223 CriticalSectionScoped cs(_crit.get()); |
| 224 _processCalls--; | 224 _processCalls--; |
| 225 return; | 225 return 0; |
| 226 } else { | 226 } else { |
| 227 switch(lowFreq) { | 227 switch(lowFreq) { |
| 228 case 8000: | 228 case 8000: |
| 229 if(OutputFrequency() != kNbInHz) { | 229 if(OutputFrequency() != kNbInHz) { |
| 230 SetOutputFrequency(kNbInHz); | 230 SetOutputFrequency(kNbInHz); |
| 231 } | 231 } |
| 232 break; | 232 break; |
| 233 case 16000: | 233 case 16000: |
| 234 if(OutputFrequency() != kWbInHz) { | 234 if(OutputFrequency() != kWbInHz) { |
| 235 SetOutputFrequency(kWbInHz); | 235 SetOutputFrequency(kWbInHz); |
| 236 } | 236 } |
| 237 break; | 237 break; |
| 238 case 32000: | 238 case 32000: |
| 239 if(OutputFrequency() != kSwbInHz) { | 239 if(OutputFrequency() != kSwbInHz) { |
| 240 SetOutputFrequency(kSwbInHz); | 240 SetOutputFrequency(kSwbInHz); |
| 241 } | 241 } |
| 242 break; | 242 break; |
| 243 case 48000: | 243 case 48000: |
| 244 if(OutputFrequency() != kFbInHz) { | 244 if(OutputFrequency() != kFbInHz) { |
| 245 SetOutputFrequency(kFbInHz); | 245 SetOutputFrequency(kFbInHz); |
| 246 } | 246 } |
| 247 break; | 247 break; |
| 248 default: | 248 default: |
| 249 assert(false); | 249 assert(false); |
| 250 | 250 |
| 251 CriticalSectionScoped cs(_crit.get()); | 251 CriticalSectionScoped cs(_crit.get()); |
| 252 _processCalls--; | 252 _processCalls--; |
| 253 return; | 253 return -1; |
| 254 } | 254 } |
| 255 } | 255 } |
| 256 | 256 |
| 257 UpdateToMix(&mixList, &rampOutList, &mixedParticipantsMap, | 257 UpdateToMix(&mixList, &rampOutList, &mixedParticipantsMap, |
| 258 &remainingParticipantsAllowedToMix); | 258 &remainingParticipantsAllowedToMix); |
| 259 | 259 |
| 260 GetAdditionalAudio(&additionalFramesList); | 260 GetAdditionalAudio(&additionalFramesList); |
| 261 UpdateMixedStatus(mixedParticipantsMap); | 261 UpdateMixedStatus(mixedParticipantsMap); |
| 262 } | 262 } |
| 263 | 263 |
| 264 // Get an AudioFrame for mixing from the memory pool. | 264 // Get an AudioFrame for mixing from the memory pool. |
| 265 AudioFrame* mixedAudio = NULL; | 265 AudioFrame* mixedAudio = NULL; |
| 266 if(_audioFramePool->PopMemory(mixedAudio) == -1) { | 266 if(_audioFramePool->PopMemory(mixedAudio) == -1) { |
| 267 WEBRTC_TRACE(kTraceMemory, kTraceAudioMixerServer, _id, | 267 WEBRTC_TRACE(kTraceMemory, kTraceAudioMixerServer, _id, |
| 268 "failed PopMemory() call"); | 268 "failed PopMemory() call"); |
| 269 assert(false); | 269 assert(false); |
| 270 return; | 270 return -1; |
| 271 } | 271 } |
| 272 | 272 |
| 273 int retval = 0; |
| 273 { | 274 { |
| 274 CriticalSectionScoped cs(_crit.get()); | 275 CriticalSectionScoped cs(_crit.get()); |
| 275 | 276 |
| 276 // TODO(henrike): it might be better to decide the number of channels | 277 // TODO(henrike): it might be better to decide the number of channels |
| 277 // with an API instead of dynamically. | 278 // with an API instead of dynamically. |
| 278 | 279 |
| 279 // Find the max channels over all mixing lists. | 280 // Find the max channels over all mixing lists. |
| 280 const size_t num_mixed_channels = std::max(MaxNumChannels(&mixList), | 281 const size_t num_mixed_channels = std::max(MaxNumChannels(&mixList), |
| 281 std::max(MaxNumChannels(&additionalFramesList), | 282 std::max(MaxNumChannels(&additionalFramesList), |
| 282 MaxNumChannels(&rampOutList))); | 283 MaxNumChannels(&rampOutList))); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 296 MixFromList(mixedAudio, mixList); | 297 MixFromList(mixedAudio, mixList); |
| 297 MixAnonomouslyFromList(mixedAudio, additionalFramesList); | 298 MixAnonomouslyFromList(mixedAudio, additionalFramesList); |
| 298 MixAnonomouslyFromList(mixedAudio, rampOutList); | 299 MixAnonomouslyFromList(mixedAudio, rampOutList); |
| 299 | 300 |
| 300 if(mixedAudio->samples_per_channel_ == 0) { | 301 if(mixedAudio->samples_per_channel_ == 0) { |
| 301 // Nothing was mixed, set the audio samples to silence. | 302 // Nothing was mixed, set the audio samples to silence. |
| 302 mixedAudio->samples_per_channel_ = _sampleSize; | 303 mixedAudio->samples_per_channel_ = _sampleSize; |
| 303 mixedAudio->Mute(); | 304 mixedAudio->Mute(); |
| 304 } else { | 305 } else { |
| 305 // Only call the limiter if we have something to mix. | 306 // Only call the limiter if we have something to mix. |
| 306 LimitMixedAudio(mixedAudio); | 307 if(!LimitMixedAudio(mixedAudio)) |
| 308 retval = -1; |
| 307 } | 309 } |
| 308 } | 310 } |
| 309 | 311 |
| 310 { | 312 { |
| 311 CriticalSectionScoped cs(_cbCrit.get()); | 313 CriticalSectionScoped cs(_cbCrit.get()); |
| 312 if(_mixReceiver != NULL) { | 314 if(_mixReceiver != NULL) { |
| 313 const AudioFrame** dummy = NULL; | 315 const AudioFrame** dummy = NULL; |
| 314 _mixReceiver->NewMixedAudio( | 316 _mixReceiver->NewMixedAudio( |
| 315 _id, | 317 _id, |
| 316 *mixedAudio, | 318 *mixedAudio, |
| 317 dummy, | 319 dummy, |
| 318 0); | 320 0); |
| 319 } | 321 } |
| 320 } | 322 } |
| 321 | 323 |
| 322 // Reclaim all outstanding memory. | 324 // Reclaim all outstanding memory. |
| 323 _audioFramePool->PushMemory(mixedAudio); | 325 _audioFramePool->PushMemory(mixedAudio); |
| 324 ClearAudioFrameList(&mixList); | 326 ClearAudioFrameList(&mixList); |
| 325 ClearAudioFrameList(&rampOutList); | 327 ClearAudioFrameList(&rampOutList); |
| 326 ClearAudioFrameList(&additionalFramesList); | 328 ClearAudioFrameList(&additionalFramesList); |
| 327 { | 329 { |
| 328 CriticalSectionScoped cs(_crit.get()); | 330 CriticalSectionScoped cs(_crit.get()); |
| 329 _processCalls--; | 331 _processCalls--; |
| 330 } | 332 } |
| 331 return; | 333 return retval; |
| 332 } | 334 } |
| 333 | 335 |
| 334 int32_t AudioConferenceMixerImpl::RegisterMixedStreamCallback( | 336 int32_t AudioConferenceMixerImpl::RegisterMixedStreamCallback( |
| 335 AudioMixerOutputReceiver* mixReceiver) { | 337 AudioMixerOutputReceiver* mixReceiver) { |
| 336 CriticalSectionScoped cs(_cbCrit.get()); | 338 CriticalSectionScoped cs(_cbCrit.get()); |
| 337 if(_mixReceiver != NULL) { | 339 if(_mixReceiver != NULL) { |
| 338 return -1; | 340 return -1; |
| 339 } | 341 } |
| 340 _mixReceiver = mixReceiver; | 342 _mixReceiver = mixReceiver; |
| 341 return 0; | 343 return 0; |
| (...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 904 | 906 |
| 905 if(error != _limiter->kNoError) { | 907 if(error != _limiter->kNoError) { |
| 906 WEBRTC_TRACE(kTraceError, kTraceAudioMixerServer, _id, | 908 WEBRTC_TRACE(kTraceError, kTraceAudioMixerServer, _id, |
| 907 "Error from AudioProcessing: %d", error); | 909 "Error from AudioProcessing: %d", error); |
| 908 assert(false); | 910 assert(false); |
| 909 return false; | 911 return false; |
| 910 } | 912 } |
| 911 return true; | 913 return true; |
| 912 } | 914 } |
| 913 } // namespace webrtc | 915 } // namespace webrtc |
| OLD | NEW |