1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#if defined(WEBRTC_ANDROID)
1227f08414780932bbd4bd0fa2bbf759787b9c2e03henrike@webrtc.org#include "webrtc/modules/audio_device/android/audio_device_template.h"
1327f08414780932bbd4bd0fa2bbf759787b9c2e03henrike@webrtc.org#include "webrtc/modules/audio_device/android/audio_record_jni.h"
1427f08414780932bbd4bd0fa2bbf759787b9c2e03henrike@webrtc.org#include "webrtc/modules/audio_device/android/audio_track_jni.h"
152e4c6211119db290a283d025ce453e4e920133c1henrika@webrtc.org#if !defined(WEBRTC_CHROMIUM_BUILD)
1627f08414780932bbd4bd0fa2bbf759787b9c2e03henrike@webrtc.org#include "webrtc/modules/audio_device/android/opensles_input.h"
1727f08414780932bbd4bd0fa2bbf759787b9c2e03henrike@webrtc.org#include "webrtc/modules/audio_device/android/opensles_output.h"
18f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#endif
192e4c6211119db290a283d025ce453e4e920133c1henrika@webrtc.org#endif
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
214489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org#include "webrtc/modules/audio_coding/main/interface/audio_coding_module.h"
22471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/system_wrappers/interface/trace.h"
23471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/voice_engine_impl.h"
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Counter to be ensure that we can add a correct ID in all static trace
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// methods. It is not the nicest solution, especially not since we already
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// have a counter in VoEBaseImpl. In other words, there is room for
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// improvement here.
3254f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.orgstatic int32_t gVoiceEngineInstanceCounter = 0;
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
344489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.orgVoiceEngine* GetVoiceEngine(const Config* config, bool owns_config)
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
364489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org#if (defined _WIN32)
374489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org  HMODULE hmod = LoadLibrary(TEXT("VoiceEngineTestingDynamic.dll"));
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
394489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org  if (hmod) {
404489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org    typedef VoiceEngine* (*PfnGetVoiceEngine)(void);
414489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org    PfnGetVoiceEngine pfn = (PfnGetVoiceEngine)GetProcAddress(
424489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org        hmod,"GetVoiceEngine");
434489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org    if (pfn) {
444489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org      VoiceEngine* self = pfn();
454489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org      if (owns_config) {
464489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org        delete config;
474489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org      }
484489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org      return (self);
494489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org    }
504489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org  }
514489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org#endif
524489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org
534489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org    VoiceEngineImpl* self = new VoiceEngineImpl(config, owns_config);
54b9e5a3d589349ee55e41cb54eca4ec822018f5c5tommi@webrtc.org    if (self != NULL)
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        self->AddRef();  // First reference.  Released in VoiceEngine::Delete.
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        gVoiceEngineInstanceCounter++;
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
59b9e5a3d589349ee55e41cb54eca4ec822018f5c5tommi@webrtc.org    return self;
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoiceEngineImpl::AddRef() {
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return ++_ref_count;
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// This implements the Release() method for all the inherited interfaces.
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoiceEngineImpl::Release() {
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int new_ref = --_ref_count;
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  assert(new_ref >= 0);
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (new_ref == 0) {
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, -1,
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "VoiceEngineImpl self deleting (voiceEngine=0x%p)",
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 this);
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
75df08c5d53f4b11b7687e419e04f99f55b85490c4henrika@webrtc.org    // Clear any pointers before starting destruction. Otherwise worker-
76df08c5d53f4b11b7687e419e04f99f55b85490c4henrika@webrtc.org    // threads will still have pointers to a partially destructed object.
77df08c5d53f4b11b7687e419e04f99f55b85490c4henrika@webrtc.org    // Example: AudioDeviceBuffer::RequestPlayoutData() can access a
78df08c5d53f4b11b7687e419e04f99f55b85490c4henrika@webrtc.org    // partially deconstructed |_ptrCbAudioTransport| during destruction
79df08c5d53f4b11b7687e419e04f99f55b85490c4henrika@webrtc.org    // if we don't call Terminate here.
80df08c5d53f4b11b7687e419e04f99f55b85490c4henrika@webrtc.org    Terminate();
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    delete this;
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return new_ref;
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
874489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.orgVoiceEngine* VoiceEngine::Create() {
884489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org  Config* config = new Config();
894489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org  return GetVoiceEngine(config, true);
904489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org}
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
924489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.orgVoiceEngine* VoiceEngine::Create(const Config& config) {
934489c51faaf5b7e9f8845c5fb661f6ae91f7da48minyue@webrtc.org  return GetVoiceEngine(&config, false);
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
96ca7a9a2696d2f73f543241093c4faeb4c608678cpbos@webrtc.orgint VoiceEngine::SetTraceFilter(unsigned int filter)
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 VoEId(gVoiceEngineInstanceCounter, -1),
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "SetTraceFilter(filter=0x%x)", filter);
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Remember old filter
10306eaa5465d57f416c14bb3a587ba4146290d6a58andrew@webrtc.org    uint32_t oldFilter = Trace::level_filter();
10406eaa5465d57f416c14bb3a587ba4146290d6a58andrew@webrtc.org    Trace::set_level_filter(filter);
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // If previous log was ignored, log again after changing filter
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (kTraceNone == oldFilter)
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(kTraceApiCall, kTraceVoice, -1,
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "SetTraceFilter(filter=0x%x)", filter);
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11306eaa5465d57f416c14bb3a587ba4146290d6a58andrew@webrtc.org    return 0;
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoiceEngine::SetTraceFile(const char* fileNameUTF8,
117ca7a9a2696d2f73f543241093c4faeb4c608678cpbos@webrtc.org                              bool addFileCounter)
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int ret = Trace::SetTraceFile(fileNameUTF8, addFileCounter);
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 VoEId(gVoiceEngineInstanceCounter, -1),
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "SetTraceFile(fileNameUTF8=%s, addFileCounter=%d)",
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 fileNameUTF8, addFileCounter);
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return (ret);
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoiceEngine::SetTraceCallback(TraceCallback* callback)
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 VoEId(gVoiceEngineInstanceCounter, -1),
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "SetTraceCallback(callback=0x%x)", callback);
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return (Trace::SetTraceCallback(callback));
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool VoiceEngine::Delete(VoiceEngine*& voiceEngine)
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (voiceEngine == NULL)
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return false;
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
140b9e5a3d589349ee55e41cb54eca4ec822018f5c5tommi@webrtc.org    VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Release the reference that was added in GetVoiceEngine.
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int ref = s->Release();
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    voiceEngine = NULL;
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (ref != 0) {
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(kTraceWarning, kTraceVoice, -1,
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "VoiceEngine::Delete did not release the very last reference.  "
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "%d references remain.", ref);
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return true;
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1542e4c6211119db290a283d025ce453e4e920133c1henrika@webrtc.org#if !defined(WEBRTC_CHROMIUM_BUILD)
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoiceEngine::SetAndroidObjects(void* javaVM, void* env, void* context)
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_ANDROID
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_ANDROID_OPENSLES
159f3a2ef39a9ba3d382916bcfb67c952781ab91df3henrike@webrtc.org  typedef AudioDeviceTemplate<OpenSlesInput, OpenSlesOutput>
160f3a2ef39a9ba3d382916bcfb67c952781ab91df3henrike@webrtc.org      AudioDeviceInstance;
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
162f3a2ef39a9ba3d382916bcfb67c952781ab91df3henrike@webrtc.org  typedef AudioDeviceTemplate<AudioRecordJni, AudioTrackJni>
163f3a2ef39a9ba3d382916bcfb67c952781ab91df3henrike@webrtc.org      AudioDeviceInstance;
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
165f3a2ef39a9ba3d382916bcfb67c952781ab91df3henrike@webrtc.org  if (javaVM && env && context) {
166f3a2ef39a9ba3d382916bcfb67c952781ab91df3henrike@webrtc.org    AudioDeviceInstance::SetAndroidAudioDeviceObjects(javaVM, env, context);
167f3a2ef39a9ba3d382916bcfb67c952781ab91df3henrike@webrtc.org  } else {
168f3a2ef39a9ba3d382916bcfb67c952781ab91df3henrike@webrtc.org    AudioDeviceInstance::ClearAndroidAudioDeviceObjects();
169f3a2ef39a9ba3d382916bcfb67c952781ab91df3henrike@webrtc.org  }
170f3a2ef39a9ba3d382916bcfb67c952781ab91df3henrike@webrtc.org  return 0;
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1752e4c6211119db290a283d025ce453e4e920133c1henrika@webrtc.org#endif
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1773b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org}  // namespace webrtc
178