| 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 24 matching lines...) Expand all Loading... |
| 35 } | 35 } |
| 36 | 36 |
| 37 VoEBaseImpl::VoEBaseImpl(voe::SharedData* shared) | 37 VoEBaseImpl::VoEBaseImpl(voe::SharedData* shared) |
| 38 : shared_(shared) {} | 38 : shared_(shared) {} |
| 39 | 39 |
| 40 VoEBaseImpl::~VoEBaseImpl() { | 40 VoEBaseImpl::~VoEBaseImpl() { |
| 41 TerminateInternal(); | 41 TerminateInternal(); |
| 42 } | 42 } |
| 43 | 43 |
| 44 void VoEBaseImpl::OnErrorIsReported(const ErrorCode error) { | 44 void VoEBaseImpl::OnErrorIsReported(const ErrorCode error) { |
| 45 rtc::CritScope cs(&callbackCritSect_); | |
| 46 if (error == AudioDeviceObserver::kRecordingError) { | 45 if (error == AudioDeviceObserver::kRecordingError) { |
| 47 LOG_F(LS_ERROR) << "VE_RUNTIME_REC_ERROR"; | 46 LOG_F(LS_ERROR) << "VE_RUNTIME_REC_ERROR"; |
| 48 } else if (error == AudioDeviceObserver::kPlayoutError) { | 47 } else if (error == AudioDeviceObserver::kPlayoutError) { |
| 49 LOG_F(LS_ERROR) << "VE_RUNTIME_PLAY_ERROR"; | 48 LOG_F(LS_ERROR) << "VE_RUNTIME_PLAY_ERROR"; |
| 50 } | 49 } |
| 51 } | 50 } |
| 52 | 51 |
| 53 void VoEBaseImpl::OnWarningIsReported(const WarningCode warning) { | 52 void VoEBaseImpl::OnWarningIsReported(const WarningCode warning) { |
| 54 rtc::CritScope cs(&callbackCritSect_); | |
| 55 if (warning == AudioDeviceObserver::kRecordingWarning) { | 53 if (warning == AudioDeviceObserver::kRecordingWarning) { |
| 56 LOG_F(LS_WARNING) << "VE_RUNTIME_REC_WARNING"; | 54 LOG_F(LS_WARNING) << "VE_RUNTIME_REC_WARNING"; |
| 57 } else if (warning == AudioDeviceObserver::kPlayoutWarning) { | 55 } else if (warning == AudioDeviceObserver::kPlayoutWarning) { |
| 58 LOG_F(LS_WARNING) << "VE_RUNTIME_PLAY_WARNING"; | 56 LOG_F(LS_WARNING) << "VE_RUNTIME_PLAY_WARNING"; |
| 59 } | 57 } |
| 60 } | 58 } |
| 61 | 59 |
| 62 int32_t VoEBaseImpl::RecordedDataIsAvailable( | 60 int32_t VoEBaseImpl::RecordedDataIsAvailable( |
| 63 const void* audio_data, | 61 const void* audio_data, |
| 64 const size_t number_of_frames, | 62 const size_t number_of_frames, |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 RTC_NOTREACHED(); | 158 RTC_NOTREACHED(); |
| 161 } | 159 } |
| 162 | 160 |
| 163 int VoEBaseImpl::Init( | 161 int VoEBaseImpl::Init( |
| 164 AudioDeviceModule* external_adm, | 162 AudioDeviceModule* external_adm, |
| 165 AudioProcessing* audio_processing, | 163 AudioProcessing* audio_processing, |
| 166 const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory) { | 164 const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory) { |
| 167 RTC_DCHECK(audio_processing); | 165 RTC_DCHECK(audio_processing); |
| 168 rtc::CritScope cs(shared_->crit_sec()); | 166 rtc::CritScope cs(shared_->crit_sec()); |
| 169 WebRtcSpl_Init(); | 167 WebRtcSpl_Init(); |
| 170 if (shared_->statistics().Initialized()) { | |
| 171 return 0; | |
| 172 } | |
| 173 if (shared_->process_thread()) { | 168 if (shared_->process_thread()) { |
| 174 shared_->process_thread()->Start(); | 169 shared_->process_thread()->Start(); |
| 175 } | 170 } |
| 176 | 171 |
| 177 // Create an internal ADM if the user has not added an external | 172 // Create an internal ADM if the user has not added an external |
| 178 // ADM implementation as input to Init(). | 173 // ADM implementation as input to Init(). |
| 179 if (external_adm == nullptr) { | 174 if (external_adm == nullptr) { |
| 180 #if !defined(WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE) | 175 #if !defined(WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE) |
| 181 return -1; | 176 return -1; |
| 182 #else | 177 #else |
| 183 // Create the internal ADM implementation. | 178 // Create the internal ADM implementation. |
| 184 shared_->set_audio_device(AudioDeviceModule::Create( | 179 shared_->set_audio_device(AudioDeviceModule::Create( |
| 185 VoEId(shared_->instance_id(), -1), | 180 VoEId(shared_->instance_id(), -1), |
| 186 AudioDeviceModule::kPlatformDefaultAudio)); | 181 AudioDeviceModule::kPlatformDefaultAudio)); |
| 187 if (shared_->audio_device() == nullptr) { | 182 if (shared_->audio_device() == nullptr) { |
| 188 shared_->SetLastError(VE_NO_MEMORY, kTraceCritical, | 183 LOG(LS_ERROR) << "Init() failed to create the ADM"; |
| 189 "Init() failed to create the ADM"); | |
| 190 return -1; | 184 return -1; |
| 191 } | 185 } |
| 192 #endif // WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE | 186 #endif // WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE |
| 193 } else { | 187 } else { |
| 194 // Use the already existing external ADM implementation. | 188 // Use the already existing external ADM implementation. |
| 195 shared_->set_audio_device(external_adm); | 189 shared_->set_audio_device(external_adm); |
| 196 LOG_F(LS_INFO) | 190 LOG_F(LS_INFO) |
| 197 << "An external ADM implementation will be used in VoiceEngine"; | 191 << "An external ADM implementation will be used in VoiceEngine"; |
| 198 } | 192 } |
| 199 | 193 |
| 200 // Register the ADM to the process thread, which will drive the error | 194 // Register the ADM to the process thread, which will drive the error |
| 201 // callback mechanism | 195 // callback mechanism |
| 202 if (shared_->process_thread()) { | 196 if (shared_->process_thread()) { |
| 203 shared_->process_thread()->RegisterModule(shared_->audio_device(), | 197 shared_->process_thread()->RegisterModule(shared_->audio_device(), |
| 204 RTC_FROM_HERE); | 198 RTC_FROM_HERE); |
| 205 } | 199 } |
| 206 | 200 |
| 207 bool available = false; | 201 bool available = false; |
| 208 | 202 |
| 209 // -------------------- | 203 // -------------------- |
| 210 // Reinitialize the ADM | 204 // Reinitialize the ADM |
| 211 | 205 |
| 212 // Register the AudioObserver implementation | 206 // Register the AudioObserver implementation |
| 213 if (shared_->audio_device()->RegisterEventObserver(this) != 0) { | 207 if (shared_->audio_device()->RegisterEventObserver(this) != 0) { |
| 214 shared_->SetLastError( | 208 LOG(LS_ERROR) << "Init() failed to register event observer for the ADM"; |
| 215 VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning, | |
| 216 "Init() failed to register event observer for the ADM"); | |
| 217 } | 209 } |
| 218 | 210 |
| 219 // Register the AudioTransport implementation | 211 // Register the AudioTransport implementation |
| 220 if (shared_->audio_device()->RegisterAudioCallback(this) != 0) { | 212 if (shared_->audio_device()->RegisterAudioCallback(this) != 0) { |
| 221 shared_->SetLastError( | 213 LOG(LS_ERROR) << "Init() failed to register audio callback for the ADM"; |
| 222 VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning, | |
| 223 "Init() failed to register audio callback for the ADM"); | |
| 224 } | 214 } |
| 225 | 215 |
| 226 // ADM initialization | 216 // ADM initialization |
| 227 if (shared_->audio_device()->Init() != 0) { | 217 if (shared_->audio_device()->Init() != 0) { |
| 228 shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, | 218 LOG(LS_ERROR) << "Init() failed to initialize the ADM"; |
| 229 "Init() failed to initialize the ADM"); | |
| 230 return -1; | 219 return -1; |
| 231 } | 220 } |
| 232 | 221 |
| 233 // Initialize the default speaker | 222 // Initialize the default speaker |
| 234 if (shared_->audio_device()->SetPlayoutDevice( | 223 if (shared_->audio_device()->SetPlayoutDevice( |
| 235 WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE) != 0) { | 224 WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE) != 0) { |
| 236 shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceInfo, | 225 LOG(LS_ERROR) << "Init() failed to set the default output device"; |
| 237 "Init() failed to set the default output device"); | |
| 238 } | 226 } |
| 239 if (shared_->audio_device()->InitSpeaker() != 0) { | 227 if (shared_->audio_device()->InitSpeaker() != 0) { |
| 240 shared_->SetLastError(VE_CANNOT_ACCESS_SPEAKER_VOL, kTraceInfo, | 228 LOG(LS_ERROR) << "Init() failed to initialize the speaker"; |
| 241 "Init() failed to initialize the speaker"); | |
| 242 } | 229 } |
| 243 | 230 |
| 244 // Initialize the default microphone | 231 // Initialize the default microphone |
| 245 if (shared_->audio_device()->SetRecordingDevice( | 232 if (shared_->audio_device()->SetRecordingDevice( |
| 246 WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE) != 0) { | 233 WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE) != 0) { |
| 247 shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceInfo, | 234 LOG(LS_ERROR) << "Init() failed to set the default input device"; |
| 248 "Init() failed to set the default input device"); | |
| 249 } | 235 } |
| 250 if (shared_->audio_device()->InitMicrophone() != 0) { | 236 if (shared_->audio_device()->InitMicrophone() != 0) { |
| 251 shared_->SetLastError(VE_CANNOT_ACCESS_MIC_VOL, kTraceInfo, | 237 LOG(LS_ERROR) << "Init() failed to initialize the microphone"; |
| 252 "Init() failed to initialize the microphone"); | |
| 253 } | 238 } |
| 254 | 239 |
| 255 // Set number of channels | 240 // Set number of channels |
| 256 if (shared_->audio_device()->StereoPlayoutIsAvailable(&available) != 0) { | 241 if (shared_->audio_device()->StereoPlayoutIsAvailable(&available) != 0) { |
| 257 shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning, | 242 LOG(LS_ERROR) << "Init() failed to query stereo playout mode"; |
| 258 "Init() failed to query stereo playout mode"); | |
| 259 } | 243 } |
| 260 if (shared_->audio_device()->SetStereoPlayout(available) != 0) { | 244 if (shared_->audio_device()->SetStereoPlayout(available) != 0) { |
| 261 shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning, | 245 LOG(LS_ERROR) << "Init() failed to set mono/stereo playout mode"; |
| 262 "Init() failed to set mono/stereo playout mode"); | |
| 263 } | 246 } |
| 264 | 247 |
| 265 // TODO(andrew): These functions don't tell us whether stereo recording | 248 // TODO(andrew): These functions don't tell us whether stereo recording |
| 266 // is truly available. We simply set the AudioProcessing input to stereo | 249 // is truly available. We simply set the AudioProcessing input to stereo |
| 267 // here, because we have to wait until receiving the first frame to | 250 // here, because we have to wait until receiving the first frame to |
| 268 // determine the actual number of channels anyway. | 251 // determine the actual number of channels anyway. |
| 269 // | 252 // |
| 270 // These functions may be changed; tracked here: | 253 // These functions may be changed; tracked here: |
| 271 // http://code.google.com/p/webrtc/issues/detail?id=204 | 254 // http://code.google.com/p/webrtc/issues/detail?id=204 |
| 272 shared_->audio_device()->StereoRecordingIsAvailable(&available); | 255 shared_->audio_device()->StereoRecordingIsAvailable(&available); |
| 273 if (shared_->audio_device()->SetStereoRecording(available) != 0) { | 256 if (shared_->audio_device()->SetStereoRecording(available) != 0) { |
| 274 shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning, | 257 LOG(LS_ERROR) << "Init() failed to set mono/stereo recording mode"; |
| 275 "Init() failed to set mono/stereo recording mode"); | |
| 276 } | 258 } |
| 277 | 259 |
| 278 shared_->set_audio_processing(audio_processing); | 260 shared_->set_audio_processing(audio_processing); |
| 279 | 261 |
| 280 // Set the error state for any failures in this block. | |
| 281 shared_->SetLastError(VE_APM_ERROR); | |
| 282 // Configure AudioProcessing components. | 262 // Configure AudioProcessing components. |
| 283 // TODO(peah): Move this initialization to webrtcvoiceengine.cc. | 263 // TODO(peah): Move this initialization to webrtcvoiceengine.cc. |
| 284 if (audio_processing->high_pass_filter()->Enable(true) != 0) { | 264 if (audio_processing->high_pass_filter()->Enable(true) != 0) { |
| 285 LOG_F(LS_ERROR) << "Failed to enable high pass filter."; | 265 LOG_F(LS_ERROR) << "Failed to enable high pass filter."; |
| 286 return -1; | 266 return -1; |
| 287 } | 267 } |
| 288 if (audio_processing->echo_cancellation()->enable_drift_compensation(false) != | 268 if (audio_processing->echo_cancellation()->enable_drift_compensation(false) != |
| 289 0) { | 269 0) { |
| 290 LOG_F(LS_ERROR) << "Failed to disable drift compensation."; | 270 LOG_F(LS_ERROR) << "Failed to disable drift compensation."; |
| 291 return -1; | 271 return -1; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 302 return -1; | 282 return -1; |
| 303 } | 283 } |
| 304 if (agc->set_mode(kDefaultAgcMode) != 0) { | 284 if (agc->set_mode(kDefaultAgcMode) != 0) { |
| 305 LOG_F(LS_ERROR) << "Failed to set mode: " << kDefaultAgcMode; | 285 LOG_F(LS_ERROR) << "Failed to set mode: " << kDefaultAgcMode; |
| 306 return -1; | 286 return -1; |
| 307 } | 287 } |
| 308 if (agc->Enable(kDefaultAgcState) != 0) { | 288 if (agc->Enable(kDefaultAgcState) != 0) { |
| 309 LOG_F(LS_ERROR) << "Failed to set agc state: " << kDefaultAgcState; | 289 LOG_F(LS_ERROR) << "Failed to set agc state: " << kDefaultAgcState; |
| 310 return -1; | 290 return -1; |
| 311 } | 291 } |
| 312 shared_->SetLastError(0); // Clear error state. | |
| 313 | 292 |
| 314 #ifdef WEBRTC_VOICE_ENGINE_AGC | 293 #ifdef WEBRTC_VOICE_ENGINE_AGC |
| 315 bool agc_enabled = | 294 bool agc_enabled = |
| 316 agc->mode() == GainControl::kAdaptiveAnalog && agc->is_enabled(); | 295 agc->mode() == GainControl::kAdaptiveAnalog && agc->is_enabled(); |
| 317 if (shared_->audio_device()->SetAGC(agc_enabled) != 0) { | 296 if (shared_->audio_device()->SetAGC(agc_enabled) != 0) { |
| 318 LOG_F(LS_ERROR) << "Failed to set agc to enabled: " << agc_enabled; | 297 LOG_F(LS_ERROR) << "Failed to set agc to enabled: " << agc_enabled; |
| 319 shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR); | |
| 320 // TODO(ajm): No error return here due to | 298 // TODO(ajm): No error return here due to |
| 321 // https://code.google.com/p/webrtc/issues/detail?id=1464 | 299 // https://code.google.com/p/webrtc/issues/detail?id=1464 |
| 322 } | 300 } |
| 323 #endif | 301 #endif |
| 324 | 302 |
| 325 if (decoder_factory) | 303 if (decoder_factory) |
| 326 decoder_factory_ = decoder_factory; | 304 decoder_factory_ = decoder_factory; |
| 327 else | 305 else |
| 328 decoder_factory_ = CreateBuiltinAudioDecoderFactory(); | 306 decoder_factory_ = CreateBuiltinAudioDecoderFactory(); |
| 329 | 307 |
| 330 return shared_->statistics().SetInitialized(); | 308 return 0; |
| 331 } | 309 } |
| 332 | 310 |
| 333 int VoEBaseImpl::Terminate() { | 311 int VoEBaseImpl::Terminate() { |
| 334 rtc::CritScope cs(shared_->crit_sec()); | 312 rtc::CritScope cs(shared_->crit_sec()); |
| 335 return TerminateInternal(); | 313 return TerminateInternal(); |
| 336 } | 314 } |
| 337 | 315 |
| 338 int VoEBaseImpl::CreateChannel() { | 316 int VoEBaseImpl::CreateChannel() { |
| 339 return CreateChannel(ChannelConfig()); | 317 return CreateChannel(ChannelConfig()); |
| 340 } | 318 } |
| 341 | 319 |
| 342 int VoEBaseImpl::CreateChannel(const ChannelConfig& config) { | 320 int VoEBaseImpl::CreateChannel(const ChannelConfig& config) { |
| 343 rtc::CritScope cs(shared_->crit_sec()); | 321 rtc::CritScope cs(shared_->crit_sec()); |
| 344 if (!shared_->statistics().Initialized()) { | |
| 345 shared_->SetLastError(VE_NOT_INITED, kTraceError); | |
| 346 return -1; | |
| 347 } | |
| 348 | |
| 349 ChannelConfig config_copy(config); | 322 ChannelConfig config_copy(config); |
| 350 config_copy.acm_config.decoder_factory = decoder_factory_; | 323 config_copy.acm_config.decoder_factory = decoder_factory_; |
| 351 voe::ChannelOwner channel_owner = | 324 voe::ChannelOwner channel_owner = |
| 352 shared_->channel_manager().CreateChannel(config_copy); | 325 shared_->channel_manager().CreateChannel(config_copy); |
| 353 return InitializeChannel(&channel_owner); | 326 return InitializeChannel(&channel_owner); |
| 354 } | 327 } |
| 355 | 328 |
| 356 int VoEBaseImpl::InitializeChannel(voe::ChannelOwner* channel_owner) { | 329 int VoEBaseImpl::InitializeChannel(voe::ChannelOwner* channel_owner) { |
| 357 if (channel_owner->channel()->SetEngineInformation( | 330 if (channel_owner->channel()->SetEngineInformation( |
| 358 shared_->statistics(), | |
| 359 *shared_->process_thread(), *shared_->audio_device(), | 331 *shared_->process_thread(), *shared_->audio_device(), |
| 360 &callbackCritSect_, shared_->encoder_queue()) != 0) { | 332 shared_->encoder_queue()) != 0) { |
| 361 shared_->SetLastError( | 333 LOG(LS_ERROR) << "CreateChannel() failed to associate engine and channel." |
| 362 VE_CHANNEL_NOT_CREATED, kTraceError, | 334 " Destroying channel."; |
| 363 "CreateChannel() failed to associate engine and channel." | |
| 364 " Destroying channel."); | |
| 365 shared_->channel_manager().DestroyChannel( | 335 shared_->channel_manager().DestroyChannel( |
| 366 channel_owner->channel()->ChannelId()); | 336 channel_owner->channel()->ChannelId()); |
| 367 return -1; | 337 return -1; |
| 368 } else if (channel_owner->channel()->Init() != 0) { | 338 } else if (channel_owner->channel()->Init() != 0) { |
| 369 shared_->SetLastError( | 339 LOG(LS_ERROR) << "CreateChannel() failed to initialize channel. Destroying" |
| 370 VE_CHANNEL_NOT_CREATED, kTraceError, | 340 " channel."; |
| 371 "CreateChannel() failed to initialize channel. Destroying" | |
| 372 " channel."); | |
| 373 shared_->channel_manager().DestroyChannel( | 341 shared_->channel_manager().DestroyChannel( |
| 374 channel_owner->channel()->ChannelId()); | 342 channel_owner->channel()->ChannelId()); |
| 375 return -1; | 343 return -1; |
| 376 } | 344 } |
| 377 return channel_owner->channel()->ChannelId(); | 345 return channel_owner->channel()->ChannelId(); |
| 378 } | 346 } |
| 379 | 347 |
| 380 int VoEBaseImpl::DeleteChannel(int channel) { | 348 int VoEBaseImpl::DeleteChannel(int channel) { |
| 381 rtc::CritScope cs(shared_->crit_sec()); | 349 rtc::CritScope cs(shared_->crit_sec()); |
| 382 if (!shared_->statistics().Initialized()) { | |
| 383 shared_->SetLastError(VE_NOT_INITED, kTraceError); | |
| 384 return -1; | |
| 385 } | |
| 386 | |
| 387 { | 350 { |
| 388 voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 351 voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); |
| 389 voe::Channel* channelPtr = ch.channel(); | 352 voe::Channel* channelPtr = ch.channel(); |
| 390 if (channelPtr == nullptr) { | 353 if (channelPtr == nullptr) { |
| 391 shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 354 LOG(LS_ERROR) << "DeleteChannel() failed to locate channel"; |
| 392 "DeleteChannel() failed to locate channel"); | |
| 393 return -1; | 355 return -1; |
| 394 } | 356 } |
| 395 } | 357 } |
| 396 | 358 |
| 397 shared_->channel_manager().DestroyChannel(channel); | 359 shared_->channel_manager().DestroyChannel(channel); |
| 398 if (StopSend() != 0) { | 360 if (StopSend() != 0) { |
| 399 return -1; | 361 return -1; |
| 400 } | 362 } |
| 401 if (StopPlayout() != 0) { | 363 if (StopPlayout() != 0) { |
| 402 return -1; | 364 return -1; |
| 403 } | 365 } |
| 404 return 0; | 366 return 0; |
| 405 } | 367 } |
| 406 | 368 |
| 407 int VoEBaseImpl::StartPlayout(int channel) { | 369 int VoEBaseImpl::StartPlayout(int channel) { |
| 408 rtc::CritScope cs(shared_->crit_sec()); | 370 rtc::CritScope cs(shared_->crit_sec()); |
| 409 if (!shared_->statistics().Initialized()) { | |
| 410 shared_->SetLastError(VE_NOT_INITED, kTraceError); | |
| 411 return -1; | |
| 412 } | |
| 413 voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 371 voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); |
| 414 voe::Channel* channelPtr = ch.channel(); | 372 voe::Channel* channelPtr = ch.channel(); |
| 415 if (channelPtr == nullptr) { | 373 if (channelPtr == nullptr) { |
| 416 shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 374 LOG(LS_ERROR) << "StartPlayout() failed to locate channel"; |
| 417 "StartPlayout() failed to locate channel"); | |
| 418 return -1; | 375 return -1; |
| 419 } | 376 } |
| 420 if (channelPtr->Playing()) { | 377 if (channelPtr->Playing()) { |
| 421 return 0; | 378 return 0; |
| 422 } | 379 } |
| 423 if (StartPlayout() != 0) { | 380 if (StartPlayout() != 0) { |
| 424 shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, | 381 LOG(LS_ERROR) << "StartPlayout() failed to start playout"; |
| 425 "StartPlayout() failed to start playout"); | |
| 426 return -1; | 382 return -1; |
| 427 } | 383 } |
| 428 return channelPtr->StartPlayout(); | 384 return channelPtr->StartPlayout(); |
| 429 } | 385 } |
| 430 | 386 |
| 431 int VoEBaseImpl::StopPlayout(int channel) { | 387 int VoEBaseImpl::StopPlayout(int channel) { |
| 432 rtc::CritScope cs(shared_->crit_sec()); | 388 rtc::CritScope cs(shared_->crit_sec()); |
| 433 if (!shared_->statistics().Initialized()) { | |
| 434 shared_->SetLastError(VE_NOT_INITED, kTraceError); | |
| 435 return -1; | |
| 436 } | |
| 437 voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 389 voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); |
| 438 voe::Channel* channelPtr = ch.channel(); | 390 voe::Channel* channelPtr = ch.channel(); |
| 439 if (channelPtr == nullptr) { | 391 if (channelPtr == nullptr) { |
| 440 shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 392 LOG(LS_ERROR) << "StopPlayout() failed to locate channel"; |
| 441 "StopPlayout() failed to locate channel"); | |
| 442 return -1; | 393 return -1; |
| 443 } | 394 } |
| 444 if (channelPtr->StopPlayout() != 0) { | 395 if (channelPtr->StopPlayout() != 0) { |
| 445 LOG_F(LS_WARNING) << "StopPlayout() failed to stop playout for channel " | 396 LOG_F(LS_WARNING) << "StopPlayout() failed to stop playout for channel " |
| 446 << channel; | 397 << channel; |
| 447 } | 398 } |
| 448 return StopPlayout(); | 399 return StopPlayout(); |
| 449 } | 400 } |
| 450 | 401 |
| 451 int VoEBaseImpl::StartSend(int channel) { | 402 int VoEBaseImpl::StartSend(int channel) { |
| 452 rtc::CritScope cs(shared_->crit_sec()); | 403 rtc::CritScope cs(shared_->crit_sec()); |
| 453 if (!shared_->statistics().Initialized()) { | |
| 454 shared_->SetLastError(VE_NOT_INITED, kTraceError); | |
| 455 return -1; | |
| 456 } | |
| 457 voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 404 voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); |
| 458 voe::Channel* channelPtr = ch.channel(); | 405 voe::Channel* channelPtr = ch.channel(); |
| 459 if (channelPtr == nullptr) { | 406 if (channelPtr == nullptr) { |
| 460 shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 407 LOG(LS_ERROR) << "StartSend() failed to locate channel"; |
| 461 "StartSend() failed to locate channel"); | |
| 462 return -1; | 408 return -1; |
| 463 } | 409 } |
| 464 if (channelPtr->Sending()) { | 410 if (channelPtr->Sending()) { |
| 465 return 0; | 411 return 0; |
| 466 } | 412 } |
| 467 if (StartSend() != 0) { | 413 if (StartSend() != 0) { |
| 468 shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, | 414 LOG(LS_ERROR) << "StartSend() failed to start recording"; |
| 469 "StartSend() failed to start recording"); | |
| 470 return -1; | 415 return -1; |
| 471 } | 416 } |
| 472 return channelPtr->StartSend(); | 417 return channelPtr->StartSend(); |
| 473 } | 418 } |
| 474 | 419 |
| 475 int VoEBaseImpl::StopSend(int channel) { | 420 int VoEBaseImpl::StopSend(int channel) { |
| 476 rtc::CritScope cs(shared_->crit_sec()); | 421 rtc::CritScope cs(shared_->crit_sec()); |
| 477 if (!shared_->statistics().Initialized()) { | |
| 478 shared_->SetLastError(VE_NOT_INITED, kTraceError); | |
| 479 return -1; | |
| 480 } | |
| 481 voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); | 422 voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel); |
| 482 voe::Channel* channelPtr = ch.channel(); | 423 voe::Channel* channelPtr = ch.channel(); |
| 483 if (channelPtr == nullptr) { | 424 if (channelPtr == nullptr) { |
| 484 shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, | 425 LOG(LS_ERROR) << "StopSend() failed to locate channel"; |
| 485 "StopSend() failed to locate channel"); | |
| 486 return -1; | 426 return -1; |
| 487 } | 427 } |
| 488 channelPtr->StopSend(); | 428 channelPtr->StopSend(); |
| 489 return StopSend(); | 429 return StopSend(); |
| 490 } | 430 } |
| 491 | 431 |
| 492 int32_t VoEBaseImpl::StartPlayout() { | 432 int32_t VoEBaseImpl::StartPlayout() { |
| 493 if (!shared_->audio_device()->Playing()) { | 433 if (!shared_->audio_device()->Playing()) { |
| 494 if (shared_->audio_device()->InitPlayout() != 0) { | 434 if (shared_->audio_device()->InitPlayout() != 0) { |
| 495 LOG_F(LS_ERROR) << "Failed to initialize playout"; | 435 LOG_F(LS_ERROR) << "Failed to initialize playout"; |
| 496 return -1; | 436 return -1; |
| 497 } | 437 } |
| 498 if (shared_->audio_device()->StartPlayout() != 0) { | 438 if (shared_->audio_device()->StartPlayout() != 0) { |
| 499 LOG_F(LS_ERROR) << "Failed to start playout"; | 439 LOG_F(LS_ERROR) << "Failed to start playout"; |
| 500 return -1; | 440 return -1; |
| 501 } | 441 } |
| 502 } | 442 } |
| 503 return 0; | 443 return 0; |
| 504 } | 444 } |
| 505 | 445 |
| 506 int32_t VoEBaseImpl::StopPlayout() { | 446 int32_t VoEBaseImpl::StopPlayout() { |
| 507 // Stop audio-device playing if no channel is playing out | 447 // Stop audio-device playing if no channel is playing out |
| 508 if (shared_->NumOfPlayingChannels() == 0) { | 448 if (shared_->NumOfPlayingChannels() == 0) { |
| 509 if (shared_->audio_device()->StopPlayout() != 0) { | 449 if (shared_->audio_device()->StopPlayout() != 0) { |
| 510 shared_->SetLastError(VE_CANNOT_STOP_PLAYOUT, kTraceError, | 450 LOG(LS_ERROR) << "StopPlayout() failed to stop playout"; |
| 511 "StopPlayout() failed to stop playout"); | |
| 512 return -1; | 451 return -1; |
| 513 } | 452 } |
| 514 } | 453 } |
| 515 return 0; | 454 return 0; |
| 516 } | 455 } |
| 517 | 456 |
| 518 int32_t VoEBaseImpl::StartSend() { | 457 int32_t VoEBaseImpl::StartSend() { |
| 519 if (!shared_->audio_device()->RecordingIsInitialized() && | 458 if (!shared_->audio_device()->RecordingIsInitialized() && |
| 520 !shared_->audio_device()->Recording()) { | 459 !shared_->audio_device()->Recording()) { |
| 521 if (shared_->audio_device()->InitRecording() != 0) { | 460 if (shared_->audio_device()->InitRecording() != 0) { |
| 522 LOG_F(LS_ERROR) << "Failed to initialize recording"; | 461 LOG_F(LS_ERROR) << "Failed to initialize recording"; |
| 523 return -1; | 462 return -1; |
| 524 } | 463 } |
| 525 } | 464 } |
| 526 if (!shared_->audio_device()->Recording()) { | 465 if (!shared_->audio_device()->Recording()) { |
| 527 if (shared_->audio_device()->StartRecording() != 0) { | 466 if (shared_->audio_device()->StartRecording() != 0) { |
| 528 LOG_F(LS_ERROR) << "Failed to start recording"; | 467 LOG_F(LS_ERROR) << "Failed to start recording"; |
| 529 return -1; | 468 return -1; |
| 530 } | 469 } |
| 531 } | 470 } |
| 532 return 0; | 471 return 0; |
| 533 } | 472 } |
| 534 | 473 |
| 535 int32_t VoEBaseImpl::StopSend() { | 474 int32_t VoEBaseImpl::StopSend() { |
| 536 if (shared_->NumOfSendingChannels() == 0) { | 475 if (shared_->NumOfSendingChannels() == 0) { |
| 537 // Stop audio-device recording if no channel is recording | 476 // Stop audio-device recording if no channel is recording |
| 538 if (shared_->audio_device()->StopRecording() != 0) { | 477 if (shared_->audio_device()->StopRecording() != 0) { |
| 539 shared_->SetLastError(VE_CANNOT_STOP_RECORDING, kTraceError, | 478 LOG(LS_ERROR) << "StopSend() failed to stop recording"; |
| 540 "StopSend() failed to stop recording"); | |
| 541 return -1; | 479 return -1; |
| 542 } | 480 } |
| 543 shared_->transmit_mixer()->StopSend(); | 481 shared_->transmit_mixer()->StopSend(); |
| 544 } | 482 } |
| 545 | 483 |
| 546 return 0; | 484 return 0; |
| 547 } | 485 } |
| 548 | 486 |
| 549 int32_t VoEBaseImpl::TerminateInternal() { | 487 int32_t VoEBaseImpl::TerminateInternal() { |
| 550 // Delete any remaining channel objects | 488 // Delete any remaining channel objects |
| 551 shared_->channel_manager().DestroyAllChannels(); | 489 shared_->channel_manager().DestroyAllChannels(); |
| 552 | 490 |
| 553 if (shared_->process_thread()) { | 491 if (shared_->process_thread()) { |
| 554 if (shared_->audio_device()) { | 492 if (shared_->audio_device()) { |
| 555 shared_->process_thread()->DeRegisterModule(shared_->audio_device()); | 493 shared_->process_thread()->DeRegisterModule(shared_->audio_device()); |
| 556 } | 494 } |
| 557 shared_->process_thread()->Stop(); | 495 shared_->process_thread()->Stop(); |
| 558 } | 496 } |
| 559 | 497 |
| 560 if (shared_->audio_device()) { | 498 if (shared_->audio_device()) { |
| 561 if (shared_->audio_device()->StopPlayout() != 0) { | 499 if (shared_->audio_device()->StopPlayout() != 0) { |
| 562 shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning, | 500 LOG(LS_ERROR) << "TerminateInternal() failed to stop playout"; |
| 563 "TerminateInternal() failed to stop playout"); | |
| 564 } | 501 } |
| 565 if (shared_->audio_device()->StopRecording() != 0) { | 502 if (shared_->audio_device()->StopRecording() != 0) { |
| 566 shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning, | 503 LOG(LS_ERROR) << "TerminateInternal() failed to stop recording"; |
| 567 "TerminateInternal() failed to stop recording"); | |
| 568 } | 504 } |
| 569 if (shared_->audio_device()->RegisterEventObserver(nullptr) != 0) { | 505 if (shared_->audio_device()->RegisterEventObserver(nullptr) != 0) { |
| 570 shared_->SetLastError( | 506 LOG(LS_ERROR) << "TerminateInternal() failed to de-register event " |
| 571 VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning, | 507 "observer for the ADM"; |
| 572 "TerminateInternal() failed to de-register event observer " | |
| 573 "for the ADM"); | |
| 574 } | 508 } |
| 575 if (shared_->audio_device()->RegisterAudioCallback(nullptr) != 0) { | 509 if (shared_->audio_device()->RegisterAudioCallback(nullptr) != 0) { |
| 576 shared_->SetLastError( | 510 LOG(LS_ERROR) << "TerminateInternal() failed to de-register audio " |
| 577 VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning, | 511 "callback for the ADM"; |
| 578 "TerminateInternal() failed to de-register audio callback " | |
| 579 "for the ADM"); | |
| 580 } | 512 } |
| 581 if (shared_->audio_device()->Terminate() != 0) { | 513 if (shared_->audio_device()->Terminate() != 0) { |
| 582 shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, | 514 LOG(LS_ERROR) << "TerminateInternal() failed to terminate the ADM"; |
| 583 "TerminateInternal() failed to terminate the ADM"); | |
| 584 } | 515 } |
| 585 shared_->set_audio_device(nullptr); | 516 shared_->set_audio_device(nullptr); |
| 586 } | 517 } |
| 587 | 518 |
| 588 shared_->set_audio_processing(nullptr); | 519 shared_->set_audio_processing(nullptr); |
| 589 | 520 |
| 590 return shared_->statistics().SetUnInitialized(); | 521 return 0; |
| 591 } | 522 } |
| 592 } // namespace webrtc | 523 } // namespace webrtc |
| OLD | NEW |