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