blob: cea51134cd69a38da8d9b800a0c305d02356adb3 [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"
henrika@webrtc.org8883a0f2014-04-09 13:04:12 +000015#if !defined(WEBRTC_CHROMIUM_BUILD)
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +000016#include "webrtc/modules/audio_device/android/opensles_input.h"
17#include "webrtc/modules/audio_device/android/opensles_output.h"
henrike@webrtc.org82f014a2013-09-10 18:24:07 +000018#endif
henrika@webrtc.org8883a0f2014-04-09 13:04:12 +000019#endif
leozwang@webrtc.org2db85bc2012-09-18 20:19:00 +000020
minyue@webrtc.orge509f942013-09-12 17:03:00 +000021#include "webrtc/modules/audio_coding/main/interface/audio_coding_module.h"
pbos@webrtc.org956aa7e2013-05-21 13:52:32 +000022#include "webrtc/system_wrappers/interface/trace.h"
23#include "webrtc/voice_engine/voice_engine_impl.h"
henrika@google.com73d65512011-09-07 15:11:18 +000024
Jelena Marusic0d266052015-05-04 14:15:32 +020025namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000026
27// Counter to be ensure that we can add a correct ID in all static trace
28// methods. It is not the nicest solution, especially not since we already
29// have a counter in VoEBaseImpl. In other words, there is room for
30// improvement here.
pbos@webrtc.org6141e132013-04-09 10:09:10 +000031static int32_t gVoiceEngineInstanceCounter = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000032
Jelena Marusic0d266052015-05-04 14:15:32 +020033VoiceEngine* GetVoiceEngine(const Config* config, bool owns_config) {
minyue@webrtc.orge509f942013-09-12 17:03:00 +000034#if (defined _WIN32)
35 HMODULE hmod = LoadLibrary(TEXT("VoiceEngineTestingDynamic.dll"));
niklase@google.com470e71d2011-07-07 08:21:25 +000036
minyue@webrtc.orge509f942013-09-12 17:03:00 +000037 if (hmod) {
38 typedef VoiceEngine* (*PfnGetVoiceEngine)(void);
Jelena Marusic0d266052015-05-04 14:15:32 +020039 PfnGetVoiceEngine pfn =
40 (PfnGetVoiceEngine)GetProcAddress(hmod, "GetVoiceEngine");
minyue@webrtc.orge509f942013-09-12 17:03:00 +000041 if (pfn) {
42 VoiceEngine* self = pfn();
43 if (owns_config) {
44 delete config;
45 }
46 return (self);
47 }
48 }
49#endif
50
Jelena Marusic0d266052015-05-04 14:15:32 +020051 VoiceEngineImpl* self = new VoiceEngineImpl(config, owns_config);
52 if (self != NULL) {
53 self->AddRef(); // First reference. Released in VoiceEngine::Delete.
54 gVoiceEngineInstanceCounter++;
55 }
56 return self;
niklase@google.com470e71d2011-07-07 08:21:25 +000057}
niklase@google.com470e71d2011-07-07 08:21:25 +000058
tommi@webrtc.orga990e122012-04-26 15:28:22 +000059int VoiceEngineImpl::AddRef() {
60 return ++_ref_count;
61}
62
63// This implements the Release() method for all the inherited interfaces.
64int VoiceEngineImpl::Release() {
65 int new_ref = --_ref_count;
66 assert(new_ref >= 0);
67 if (new_ref == 0) {
68 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, -1,
Jelena Marusic0d266052015-05-04 14:15:32 +020069 "VoiceEngineImpl self deleting (voiceEngine=0x%p)", this);
tommi@webrtc.orga990e122012-04-26 15:28:22 +000070
henrika@webrtc.org944cbeb2014-03-18 10:32:33 +000071 // Clear any pointers before starting destruction. Otherwise worker-
72 // threads will still have pointers to a partially destructed object.
73 // Example: AudioDeviceBuffer::RequestPlayoutData() can access a
74 // partially deconstructed |_ptrCbAudioTransport| during destruction
75 // if we don't call Terminate here.
76 Terminate();
tommi@webrtc.orga990e122012-04-26 15:28:22 +000077 delete this;
78 }
79
80 return new_ref;
81}
82
minyue@webrtc.orge509f942013-09-12 17:03:00 +000083VoiceEngine* VoiceEngine::Create() {
84 Config* config = new Config();
minyue@webrtc.orge509f942013-09-12 17:03:00 +000085 return GetVoiceEngine(config, true);
86}
niklase@google.com470e71d2011-07-07 08:21:25 +000087
minyue@webrtc.orge509f942013-09-12 17:03:00 +000088VoiceEngine* VoiceEngine::Create(const Config& config) {
89 return GetVoiceEngine(&config, false);
niklase@google.com470e71d2011-07-07 08:21:25 +000090}
91
Jelena Marusic0d266052015-05-04 14:15:32 +020092int VoiceEngine::SetTraceFilter(unsigned int filter) {
93 WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
94 VoEId(gVoiceEngineInstanceCounter, -1),
95 "SetTraceFilter(filter=0x%x)", filter);
niklase@google.com470e71d2011-07-07 08:21:25 +000096
Jelena Marusic0d266052015-05-04 14:15:32 +020097 // Remember old filter
98 uint32_t oldFilter = Trace::level_filter();
99 Trace::set_level_filter(filter);
niklase@google.com470e71d2011-07-07 08:21:25 +0000100
Jelena Marusic0d266052015-05-04 14:15:32 +0200101 // If previous log was ignored, log again after changing filter
102 if (kTraceNone == oldFilter) {
103 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, -1, "SetTraceFilter(filter=0x%x)",
104 filter);
105 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000106
Jelena Marusic0d266052015-05-04 14:15:32 +0200107 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000108}
109
Jelena Marusic0d266052015-05-04 14:15:32 +0200110int VoiceEngine::SetTraceFile(const char* fileNameUTF8, bool addFileCounter) {
111 int ret = Trace::SetTraceFile(fileNameUTF8, addFileCounter);
112 WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
113 VoEId(gVoiceEngineInstanceCounter, -1),
114 "SetTraceFile(fileNameUTF8=%s, addFileCounter=%d)", fileNameUTF8,
115 addFileCounter);
116 return (ret);
niklase@google.com470e71d2011-07-07 08:21:25 +0000117}
118
Jelena Marusic0d266052015-05-04 14:15:32 +0200119int VoiceEngine::SetTraceCallback(TraceCallback* callback) {
120 WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
121 VoEId(gVoiceEngineInstanceCounter, -1),
122 "SetTraceCallback(callback=0x%x)", callback);
123 return (Trace::SetTraceCallback(callback));
niklase@google.com470e71d2011-07-07 08:21:25 +0000124}
125
Jelena Marusic0d266052015-05-04 14:15:32 +0200126bool VoiceEngine::Delete(VoiceEngine*& voiceEngine) {
127 if (voiceEngine == NULL)
128 return false;
niklase@google.com470e71d2011-07-07 08:21:25 +0000129
Jelena Marusic0d266052015-05-04 14:15:32 +0200130 VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
131 // Release the reference that was added in GetVoiceEngine.
132 int ref = s->Release();
133 voiceEngine = NULL;
niklase@google.com470e71d2011-07-07 08:21:25 +0000134
Jelena Marusic0d266052015-05-04 14:15:32 +0200135 if (ref != 0) {
136 WEBRTC_TRACE(
137 kTraceWarning, kTraceVoice, -1,
138 "VoiceEngine::Delete did not release the very last reference. "
139 "%d references remain.",
140 ref);
141 }
tommi@webrtc.orga990e122012-04-26 15:28:22 +0000142
Jelena Marusic0d266052015-05-04 14:15:32 +0200143 return true;
niklase@google.com470e71d2011-07-07 08:21:25 +0000144}
145
henrika@webrtc.org8883a0f2014-04-09 13:04:12 +0000146#if !defined(WEBRTC_CHROMIUM_BUILD)
Jelena Marusic0d266052015-05-04 14:15:32 +0200147int VoiceEngine::SetAndroidObjects(void* javaVM, void* context) {
leozwang@webrtc.orgcf1375a2012-09-21 17:39:45 +0000148#ifdef WEBRTC_ANDROID
149#ifdef WEBRTC_ANDROID_OPENSLES
henrike@webrtc.org573a1b42014-01-10 22:58:06 +0000150 typedef AudioDeviceTemplate<OpenSlesInput, OpenSlesOutput>
151 AudioDeviceInstance;
leozwang@webrtc.orgcf1375a2012-09-21 17:39:45 +0000152#else
henrike@webrtc.org573a1b42014-01-10 22:58:06 +0000153 typedef AudioDeviceTemplate<AudioRecordJni, AudioTrackJni>
154 AudioDeviceInstance;
leozwang@webrtc.orgcf1375a2012-09-21 17:39:45 +0000155#endif
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000156 if (javaVM && context) {
157 AudioDeviceInstance::SetAndroidAudioDeviceObjects(javaVM, context);
henrike@webrtc.org573a1b42014-01-10 22:58:06 +0000158 } else {
159 AudioDeviceInstance::ClearAndroidAudioDeviceObjects();
160 }
161 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000162#else
leozwang@webrtc.org2db85bc2012-09-18 20:19:00 +0000163 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000164#endif
165}
henrika@webrtc.org8883a0f2014-04-09 13:04:12 +0000166#endif
niklase@google.com470e71d2011-07-07 08:21:25 +0000167
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000168} // namespace webrtc