| /* |
| * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #if defined(WEBRTC_ANDROID) |
| #include "modules/audio_device/android/audio_device_template.h" |
| #include "modules/audio_device/android/audio_record_jni.h" |
| #include "modules/audio_device/android/audio_track_jni.h" |
| #endif |
| |
| #include "modules/audio_coding/include/audio_coding_module.h" |
| #include "rtc_base/checks.h" |
| #include "voice_engine/channel_proxy.h" |
| #include "voice_engine/voice_engine_impl.h" |
| |
| namespace webrtc { |
| |
| // Counter to be ensure that we can add a correct ID in all static trace |
| // methods. It is not the nicest solution, especially not since we already |
| // have a counter in VoEBaseImpl. In other words, there is room for |
| // improvement here. |
| static int32_t gVoiceEngineInstanceCounter = 0; |
| |
| VoiceEngine* GetVoiceEngine() { |
| VoiceEngineImpl* self = new VoiceEngineImpl(); |
| if (self != NULL) { |
| self->AddRef(); // First reference. Released in VoiceEngine::Delete. |
| gVoiceEngineInstanceCounter++; |
| } |
| return self; |
| } |
| |
| int VoiceEngineImpl::AddRef() { |
| return ++_ref_count; |
| } |
| |
| // This implements the Release() method for all the inherited interfaces. |
| int VoiceEngineImpl::Release() { |
| int new_ref = --_ref_count; |
| assert(new_ref >= 0); |
| if (new_ref == 0) { |
| // Clear any pointers before starting destruction. Otherwise worker- |
| // threads will still have pointers to a partially destructed object. |
| // Example: AudioDeviceBuffer::RequestPlayoutData() can access a |
| // partially deconstructed |_ptrCbAudioTransport| during destruction |
| // if we don't call Terminate here. |
| Terminate(); |
| delete this; |
| } |
| |
| return new_ref; |
| } |
| |
| std::unique_ptr<voe::ChannelProxy> VoiceEngineImpl::GetChannelProxy( |
| int channel_id) { |
| RTC_DCHECK(channel_id >= 0); |
| rtc::CritScope cs(crit_sec()); |
| return std::unique_ptr<voe::ChannelProxy>( |
| new voe::ChannelProxy(channel_manager().GetChannel(channel_id))); |
| } |
| |
| VoiceEngine* VoiceEngine::Create() { |
| return GetVoiceEngine(); |
| } |
| |
| bool VoiceEngine::Delete(VoiceEngine*& voiceEngine) { |
| if (voiceEngine == NULL) |
| return false; |
| |
| VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine); |
| s->Release(); |
| voiceEngine = NULL; |
| return true; |
| } |
| } // namespace webrtc |