blob: 814d619589e755fd16b515b39519bbf34d29938e [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
tommi@webrtc.orga990e122012-04-26 15:28:22 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
henrike@webrtc.org82f014a2013-09-10 18:24:07 +000011#if defined(WEBRTC_ANDROID)
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +000012#include "webrtc/modules/audio_device/android/audio_device_template.h"
13#include "webrtc/modules/audio_device/android/audio_record_jni.h"
14#include "webrtc/modules/audio_device/android/audio_track_jni.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010015#include "webrtc/modules/utility/include/jvm_android.h"
henrika@webrtc.org8883a0f2014-04-09 13:04:12 +000016#endif
leozwang@webrtc.org2db85bc2012-09-18 20:19:00 +000017
Henrik Kjellander74640892015-10-29 11:31:02 +010018#include "webrtc/modules/audio_coding/main/include/audio_coding_module.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010019#include "webrtc/system_wrappers/include/trace.h"
pbos@webrtc.org956aa7e2013-05-21 13:52:32 +000020#include "webrtc/voice_engine/voice_engine_impl.h"
henrika@google.com73d65512011-09-07 15:11:18 +000021
Jelena Marusic0d266052015-05-04 14:15:32 +020022namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000023
24// Counter to be ensure that we can add a correct ID in all static trace
25// methods. It is not the nicest solution, especially not since we already
26// have a counter in VoEBaseImpl. In other words, there is room for
27// improvement here.
pbos@webrtc.org6141e132013-04-09 10:09:10 +000028static int32_t gVoiceEngineInstanceCounter = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000029
Jelena Marusic0d266052015-05-04 14:15:32 +020030VoiceEngine* GetVoiceEngine(const Config* config, bool owns_config) {
minyue@webrtc.orge509f942013-09-12 17:03:00 +000031#if (defined _WIN32)
32 HMODULE hmod = LoadLibrary(TEXT("VoiceEngineTestingDynamic.dll"));
niklase@google.com470e71d2011-07-07 08:21:25 +000033
minyue@webrtc.orge509f942013-09-12 17:03:00 +000034 if (hmod) {
35 typedef VoiceEngine* (*PfnGetVoiceEngine)(void);
Jelena Marusic0d266052015-05-04 14:15:32 +020036 PfnGetVoiceEngine pfn =
37 (PfnGetVoiceEngine)GetProcAddress(hmod, "GetVoiceEngine");
minyue@webrtc.orge509f942013-09-12 17:03:00 +000038 if (pfn) {
39 VoiceEngine* self = pfn();
40 if (owns_config) {
41 delete config;
42 }
43 return (self);
44 }
45 }
46#endif
47
Jelena Marusic0d266052015-05-04 14:15:32 +020048 VoiceEngineImpl* self = new VoiceEngineImpl(config, owns_config);
49 if (self != NULL) {
50 self->AddRef(); // First reference. Released in VoiceEngine::Delete.
51 gVoiceEngineInstanceCounter++;
52 }
53 return self;
niklase@google.com470e71d2011-07-07 08:21:25 +000054}
niklase@google.com470e71d2011-07-07 08:21:25 +000055
tommi@webrtc.orga990e122012-04-26 15:28:22 +000056int VoiceEngineImpl::AddRef() {
57 return ++_ref_count;
58}
59
60// This implements the Release() method for all the inherited interfaces.
61int VoiceEngineImpl::Release() {
62 int new_ref = --_ref_count;
63 assert(new_ref >= 0);
64 if (new_ref == 0) {
65 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, -1,
Jelena Marusic0d266052015-05-04 14:15:32 +020066 "VoiceEngineImpl self deleting (voiceEngine=0x%p)", this);
tommi@webrtc.orga990e122012-04-26 15:28:22 +000067
henrika@webrtc.org944cbeb2014-03-18 10:32:33 +000068 // Clear any pointers before starting destruction. Otherwise worker-
69 // threads will still have pointers to a partially destructed object.
70 // Example: AudioDeviceBuffer::RequestPlayoutData() can access a
71 // partially deconstructed |_ptrCbAudioTransport| during destruction
72 // if we don't call Terminate here.
73 Terminate();
tommi@webrtc.orga990e122012-04-26 15:28:22 +000074 delete this;
75 }
76
77 return new_ref;
78}
79
minyue@webrtc.orge509f942013-09-12 17:03:00 +000080VoiceEngine* VoiceEngine::Create() {
81 Config* config = new Config();
minyue@webrtc.orge509f942013-09-12 17:03:00 +000082 return GetVoiceEngine(config, true);
83}
niklase@google.com470e71d2011-07-07 08:21:25 +000084
minyue@webrtc.orge509f942013-09-12 17:03:00 +000085VoiceEngine* VoiceEngine::Create(const Config& config) {
86 return GetVoiceEngine(&config, false);
niklase@google.com470e71d2011-07-07 08:21:25 +000087}
88
Jelena Marusic0d266052015-05-04 14:15:32 +020089int VoiceEngine::SetTraceFilter(unsigned int filter) {
90 WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
91 VoEId(gVoiceEngineInstanceCounter, -1),
92 "SetTraceFilter(filter=0x%x)", filter);
niklase@google.com470e71d2011-07-07 08:21:25 +000093
Jelena Marusic0d266052015-05-04 14:15:32 +020094 // Remember old filter
95 uint32_t oldFilter = Trace::level_filter();
96 Trace::set_level_filter(filter);
niklase@google.com470e71d2011-07-07 08:21:25 +000097
Jelena Marusic0d266052015-05-04 14:15:32 +020098 // If previous log was ignored, log again after changing filter
99 if (kTraceNone == oldFilter) {
100 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, -1, "SetTraceFilter(filter=0x%x)",
101 filter);
102 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000103
Jelena Marusic0d266052015-05-04 14:15:32 +0200104 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000105}
106
Jelena Marusic0d266052015-05-04 14:15:32 +0200107int VoiceEngine::SetTraceFile(const char* fileNameUTF8, bool addFileCounter) {
108 int ret = Trace::SetTraceFile(fileNameUTF8, addFileCounter);
109 WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
110 VoEId(gVoiceEngineInstanceCounter, -1),
111 "SetTraceFile(fileNameUTF8=%s, addFileCounter=%d)", fileNameUTF8,
112 addFileCounter);
113 return (ret);
niklase@google.com470e71d2011-07-07 08:21:25 +0000114}
115
Jelena Marusic0d266052015-05-04 14:15:32 +0200116int VoiceEngine::SetTraceCallback(TraceCallback* callback) {
117 WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
118 VoEId(gVoiceEngineInstanceCounter, -1),
119 "SetTraceCallback(callback=0x%x)", callback);
120 return (Trace::SetTraceCallback(callback));
niklase@google.com470e71d2011-07-07 08:21:25 +0000121}
122
Jelena Marusic0d266052015-05-04 14:15:32 +0200123bool VoiceEngine::Delete(VoiceEngine*& voiceEngine) {
124 if (voiceEngine == NULL)
125 return false;
niklase@google.com470e71d2011-07-07 08:21:25 +0000126
Jelena Marusic0d266052015-05-04 14:15:32 +0200127 VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
128 // Release the reference that was added in GetVoiceEngine.
129 int ref = s->Release();
130 voiceEngine = NULL;
niklase@google.com470e71d2011-07-07 08:21:25 +0000131
Jelena Marusic0d266052015-05-04 14:15:32 +0200132 if (ref != 0) {
133 WEBRTC_TRACE(
134 kTraceWarning, kTraceVoice, -1,
135 "VoiceEngine::Delete did not release the very last reference. "
136 "%d references remain.",
137 ref);
138 }
tommi@webrtc.orga990e122012-04-26 15:28:22 +0000139
Jelena Marusic0d266052015-05-04 14:15:32 +0200140 return true;
niklase@google.com470e71d2011-07-07 08:21:25 +0000141}
142
henrika@webrtc.org8883a0f2014-04-09 13:04:12 +0000143#if !defined(WEBRTC_CHROMIUM_BUILD)
henrikab2619892015-05-18 16:49:16 +0200144// TODO(henrika): change types to JavaVM* and jobject instead of void*.
Jelena Marusic0d266052015-05-04 14:15:32 +0200145int VoiceEngine::SetAndroidObjects(void* javaVM, void* context) {
leozwang@webrtc.orgcf1375a2012-09-21 17:39:45 +0000146#ifdef WEBRTC_ANDROID
henrikab2619892015-05-18 16:49:16 +0200147 webrtc::JVM::Initialize(reinterpret_cast<JavaVM*>(javaVM),
148 reinterpret_cast<jobject>(context));
henrike@webrtc.org573a1b42014-01-10 22:58:06 +0000149 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000150#else
leozwang@webrtc.org2db85bc2012-09-18 20:19:00 +0000151 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000152#endif
153}
henrika@webrtc.org8883a0f2014-04-09 13:04:12 +0000154#endif
niklase@google.com470e71d2011-07-07 08:21:25 +0000155
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000156} // namespace webrtc