blob: 2f524bb012aaace959e9d3c90186a4fe4c5af925 [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
niklase@google.com470e71d2011-07-07 08:21:25 +000025namespace webrtc
26{
27
28// Counter to be ensure that we can add a correct ID in all static trace
29// methods. It is not the nicest solution, especially not since we already
30// have a counter in VoEBaseImpl. In other words, there is room for
31// improvement here.
pbos@webrtc.org6141e132013-04-09 10:09:10 +000032static int32_t gVoiceEngineInstanceCounter = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000033
minyue@webrtc.orge509f942013-09-12 17:03:00 +000034VoiceEngine* GetVoiceEngine(const Config* config, bool owns_config)
niklase@google.com470e71d2011-07-07 08:21:25 +000035{
minyue@webrtc.orge509f942013-09-12 17:03:00 +000036#if (defined _WIN32)
37 HMODULE hmod = LoadLibrary(TEXT("VoiceEngineTestingDynamic.dll"));
niklase@google.com470e71d2011-07-07 08:21:25 +000038
minyue@webrtc.orge509f942013-09-12 17:03:00 +000039 if (hmod) {
40 typedef VoiceEngine* (*PfnGetVoiceEngine)(void);
41 PfnGetVoiceEngine pfn = (PfnGetVoiceEngine)GetProcAddress(
42 hmod,"GetVoiceEngine");
43 if (pfn) {
44 VoiceEngine* self = pfn();
45 if (owns_config) {
46 delete config;
47 }
48 return (self);
49 }
50 }
51#endif
52
53 VoiceEngineImpl* self = new VoiceEngineImpl(config, owns_config);
tommi@webrtc.org0989fb72013-02-15 15:07:32 +000054 if (self != NULL)
niklase@google.com470e71d2011-07-07 08:21:25 +000055 {
tommi@webrtc.orga990e122012-04-26 15:28:22 +000056 self->AddRef(); // First reference. Released in VoiceEngine::Delete.
niklase@google.com470e71d2011-07-07 08:21:25 +000057 gVoiceEngineInstanceCounter++;
58 }
tommi@webrtc.org0989fb72013-02-15 15:07:32 +000059 return self;
niklase@google.com470e71d2011-07-07 08:21:25 +000060}
niklase@google.com470e71d2011-07-07 08:21:25 +000061
tommi@webrtc.orga990e122012-04-26 15:28:22 +000062int VoiceEngineImpl::AddRef() {
63 return ++_ref_count;
64}
65
66// This implements the Release() method for all the inherited interfaces.
67int VoiceEngineImpl::Release() {
68 int new_ref = --_ref_count;
69 assert(new_ref >= 0);
70 if (new_ref == 0) {
71 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, -1,
72 "VoiceEngineImpl self deleting (voiceEngine=0x%p)",
73 this);
74
henrika@webrtc.org944cbeb2014-03-18 10:32:33 +000075 // Clear any pointers before starting destruction. Otherwise worker-
76 // threads will still have pointers to a partially destructed object.
77 // Example: AudioDeviceBuffer::RequestPlayoutData() can access a
78 // partially deconstructed |_ptrCbAudioTransport| during destruction
79 // if we don't call Terminate here.
80 Terminate();
tommi@webrtc.orga990e122012-04-26 15:28:22 +000081 delete this;
82 }
83
84 return new_ref;
85}
86
minyue@webrtc.orge509f942013-09-12 17:03:00 +000087VoiceEngine* VoiceEngine::Create() {
88 Config* config = new Config();
89 config->Set<AudioCodingModuleFactory>(new AudioCodingModuleFactory());
niklase@google.com470e71d2011-07-07 08:21:25 +000090
minyue@webrtc.orge509f942013-09-12 17:03:00 +000091 return GetVoiceEngine(config, true);
92}
niklase@google.com470e71d2011-07-07 08:21:25 +000093
minyue@webrtc.orge509f942013-09-12 17:03:00 +000094VoiceEngine* VoiceEngine::Create(const Config& config) {
95 return GetVoiceEngine(&config, false);
niklase@google.com470e71d2011-07-07 08:21:25 +000096}
97
pbos@webrtc.org92135212013-05-14 08:31:39 +000098int VoiceEngine::SetTraceFilter(unsigned int filter)
niklase@google.com470e71d2011-07-07 08:21:25 +000099{
100 WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
101 VoEId(gVoiceEngineInstanceCounter, -1),
102 "SetTraceFilter(filter=0x%x)", filter);
103
104 // Remember old filter
andrew@webrtc.org90805182013-09-05 16:40:43 +0000105 uint32_t oldFilter = Trace::level_filter();
106 Trace::set_level_filter(filter);
niklase@google.com470e71d2011-07-07 08:21:25 +0000107
108 // If previous log was ignored, log again after changing filter
109 if (kTraceNone == oldFilter)
110 {
111 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, -1,
112 "SetTraceFilter(filter=0x%x)", filter);
113 }
114
andrew@webrtc.org90805182013-09-05 16:40:43 +0000115 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000116}
117
118int VoiceEngine::SetTraceFile(const char* fileNameUTF8,
pbos@webrtc.org92135212013-05-14 08:31:39 +0000119 bool addFileCounter)
niklase@google.com470e71d2011-07-07 08:21:25 +0000120{
121 int ret = Trace::SetTraceFile(fileNameUTF8, addFileCounter);
122 WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
123 VoEId(gVoiceEngineInstanceCounter, -1),
124 "SetTraceFile(fileNameUTF8=%s, addFileCounter=%d)",
125 fileNameUTF8, addFileCounter);
126 return (ret);
127}
128
129int VoiceEngine::SetTraceCallback(TraceCallback* callback)
130{
131 WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
132 VoEId(gVoiceEngineInstanceCounter, -1),
133 "SetTraceCallback(callback=0x%x)", callback);
134 return (Trace::SetTraceCallback(callback));
135}
136
tommi@webrtc.orga990e122012-04-26 15:28:22 +0000137bool VoiceEngine::Delete(VoiceEngine*& voiceEngine)
niklase@google.com470e71d2011-07-07 08:21:25 +0000138{
139 if (voiceEngine == NULL)
niklase@google.com470e71d2011-07-07 08:21:25 +0000140 return false;
niklase@google.com470e71d2011-07-07 08:21:25 +0000141
tommi@webrtc.org0989fb72013-02-15 15:07:32 +0000142 VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
tommi@webrtc.orga990e122012-04-26 15:28:22 +0000143 // Release the reference that was added in GetVoiceEngine.
144 int ref = s->Release();
niklase@google.com470e71d2011-07-07 08:21:25 +0000145 voiceEngine = NULL;
146
tommi@webrtc.orga990e122012-04-26 15:28:22 +0000147 if (ref != 0) {
148 WEBRTC_TRACE(kTraceWarning, kTraceVoice, -1,
149 "VoiceEngine::Delete did not release the very last reference. "
150 "%d references remain.", ref);
151 }
152
niklase@google.com470e71d2011-07-07 08:21:25 +0000153 return true;
154}
155
henrika@webrtc.org8883a0f2014-04-09 13:04:12 +0000156#if !defined(WEBRTC_CHROMIUM_BUILD)
niklase@google.com470e71d2011-07-07 08:21:25 +0000157int VoiceEngine::SetAndroidObjects(void* javaVM, void* env, void* context)
158{
leozwang@webrtc.orgcf1375a2012-09-21 17:39:45 +0000159#ifdef WEBRTC_ANDROID
160#ifdef WEBRTC_ANDROID_OPENSLES
henrike@webrtc.org573a1b42014-01-10 22:58:06 +0000161 typedef AudioDeviceTemplate<OpenSlesInput, OpenSlesOutput>
162 AudioDeviceInstance;
leozwang@webrtc.orgcf1375a2012-09-21 17:39:45 +0000163#else
henrike@webrtc.org573a1b42014-01-10 22:58:06 +0000164 typedef AudioDeviceTemplate<AudioRecordJni, AudioTrackJni>
165 AudioDeviceInstance;
leozwang@webrtc.orgcf1375a2012-09-21 17:39:45 +0000166#endif
henrike@webrtc.org573a1b42014-01-10 22:58:06 +0000167 if (javaVM && env && context) {
168 AudioDeviceInstance::SetAndroidAudioDeviceObjects(javaVM, env, context);
169 } else {
170 AudioDeviceInstance::ClearAndroidAudioDeviceObjects();
171 }
172 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000173#else
leozwang@webrtc.org2db85bc2012-09-18 20:19:00 +0000174 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000175#endif
176}
henrika@webrtc.org8883a0f2014-04-09 13:04:12 +0000177#endif
niklase@google.com470e71d2011-07-07 08:21:25 +0000178
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000179} // namespace webrtc