blob: 5b92d27313bad3546e6d48c99520031e56325dcf [file] [log] [blame]
* 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 "webrtc/modules/audio_device/android/audio_device_template.h"
#include "webrtc/modules/audio_device/android/audio_record_jni.h"
#include "webrtc/modules/audio_device/android/audio_track_jni.h"
#include "webrtc/modules/utility/include/jvm_android.h"
#include "webrtc/base/checks.h"
#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
#include "webrtc/system_wrappers/include/trace.h"
#include "webrtc/voice_engine/channel_proxy.h"
#include "webrtc/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.
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) {
WEBRTC_TRACE(kTraceApiCall, kTraceVoice, -1,
"VoiceEngineImpl self deleting (voiceEngine=0x%p)", this);
// 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.
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();
int VoiceEngine::SetTraceFilter(unsigned int filter) {
WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
VoEId(gVoiceEngineInstanceCounter, -1),
"SetTraceFilter(filter=0x%x)", filter);
// Remember old filter
uint32_t oldFilter = Trace::level_filter();
// If previous log was ignored, log again after changing filter
if (kTraceNone == oldFilter) {
WEBRTC_TRACE(kTraceApiCall, kTraceVoice, -1, "SetTraceFilter(filter=0x%x)",
return 0;
int VoiceEngine::SetTraceFile(const char* fileNameUTF8, bool addFileCounter) {
int ret = Trace::SetTraceFile(fileNameUTF8, addFileCounter);
WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
VoEId(gVoiceEngineInstanceCounter, -1),
"SetTraceFile(fileNameUTF8=%s, addFileCounter=%d)", fileNameUTF8,
return (ret);
int VoiceEngine::SetTraceCallback(TraceCallback* callback) {
WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
VoEId(gVoiceEngineInstanceCounter, -1),
"SetTraceCallback(callback=0x%x)", callback);
return (Trace::SetTraceCallback(callback));
bool VoiceEngine::Delete(VoiceEngine*& voiceEngine) {
if (voiceEngine == NULL)
return false;
VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
// Release the reference that was added in GetVoiceEngine.
int ref = s->Release();
voiceEngine = NULL;
if (ref != 0) {
kTraceWarning, kTraceVoice, -1,
"VoiceEngine::Delete did not release the very last reference. "
"%d references remain.",
return true;
// TODO(henrika): change types to JavaVM* and jobject instead of void*.
int VoiceEngine::SetAndroidObjects(void* javaVM, void* context) {
return 0;
return -1;
std::string VoiceEngine::GetVersionString() {
std::string version = "VoiceEngine 4.1.0";
version += " (External transport build)";
return version;
} // namespace webrtc