From b26198972c1fcb4aa7abaf3895b007e301e7d5dc Mon Sep 17 00:00:00 2001 From: henrika Date: Mon, 18 May 2015 16:49:16 +0200 Subject: [PATCH] Adding support for OpenSL ES output in native WebRTC BUG=4573,2982,2175,3590 TEST=modules_unittests --gtest_filter=AudioDevice*, AppRTCDemo and WebRTCDemo Summary: - Removes dependency of the 'enable_android_opensl' compiler flag. Instead, OpenSL ES is always supported, and will enabled for devices that supports low-latency output. - WebRTC no longer supports OpenSL ES for the input/recording side. - Removes old code and demos using OpenSL ES for audio input. - Improves accuracy of total delay estimates (better AEC performance). - Reduces roundtrip audio latency; especially when OpenSL can be used. Performance verified on: Nexus 5, 6, 7 and 9. Samsung Galaxy S4 and S6. Android One device. R=magjed@webrtc.org, phoglund@webrtc.org, tommi@webrtc.org Review URL: https://webrtc-codereview.appspot.com/51759004 Cr-Commit-Position: refs/heads/master@{#9208} --- talk/libjingle.gyp | 2 +- webrtc/BUILD.gn | 3 - webrtc/build/common.gypi | 12 - .../opensl_loopback/AndroidManifest.xml | 22 - .../examples/android/opensl_loopback/README | 23 - .../android/opensl_loopback/build.xml | 92 --- .../fake_audio_device_buffer.cc | 107 ---- .../fake_audio_device_buffer.h | 67 -- .../opensl_loopback/jni/opensl_runner.cc | 129 ---- .../opensl_loopback/project.properties | 16 - .../opensl_loopback/res/drawable/logo.png | Bin 2574 -> 0 bytes .../res/layout/open_sl_demo.xml | 22 - .../opensl_loopback/res/values/strings.xml | 7 - .../src/org/webrtc/app/OpenSlDemo.java | 80 --- .../src/org/webrtc/app/OpenSlRunner.java | 24 - webrtc/modules/audio_device/BUILD.gn | 12 +- .../audio_device/android/audio_common.h | 18 +- .../android/audio_device_template.h | 95 ++- .../android/audio_device_unittest.cc | 322 ++++++---- .../audio_device/android/audio_manager.cc | 211 ++++--- .../audio_device/android/audio_manager.h | 138 ++++- .../audio_device/android/audio_manager_jni.cc | 126 ---- .../audio_device/android/audio_manager_jni.h | 70 --- .../android/audio_manager_unittest.cc | 142 +++++ .../audio_device/android/audio_record_jni.cc | 55 +- .../audio_device/android/audio_record_jni.h | 23 +- .../audio_device/android/audio_track_jni.cc | 30 +- .../audio_device/android/audio_track_jni.h | 13 +- .../audio_device/android/build_info.cc | 58 ++ .../modules/audio_device/android/build_info.h | 67 ++ .../android/ensure_initialized.cc | 14 +- .../audio_device/android/fine_audio_buffer.cc | 13 +- .../audio_device/android/fine_audio_buffer.h | 9 +- .../voiceengine/AudioManagerAndroid.java | 72 --- .../src/org/webrtc/voiceengine/BuildInfo.java | 52 ++ .../voiceengine/WebRtcAudioManager.java | 146 ++++- .../webrtc/voiceengine/WebRtcAudioRecord.java | 37 +- .../webrtc/voiceengine/WebRtcAudioTrack.java | 9 +- .../webrtc/voiceengine/WebRtcAudioUtils.java | 53 +- .../audio_device/android/low_latency_event.h | 65 -- .../android/low_latency_event_posix.cc | 108 ---- .../android/low_latency_event_unittest.cc | 94 --- .../audio_device/android/opensles_common.cc | 2 +- .../audio_device/android/opensles_common.h | 34 +- .../audio_device/android/opensles_input.cc | 536 ---------------- .../audio_device/android/opensles_input.h | 232 ------- .../audio_device/android/opensles_output.cc | 576 ------------------ .../audio_device/android/opensles_output.h | 243 -------- .../audio_device/android/opensles_player.cc | 442 ++++++++++++++ .../audio_device/android/opensles_player.h | 202 ++++++ .../audio_device/android/single_rw_fifo.cc | 106 ---- .../audio_device/android/single_rw_fifo.h | 49 -- .../android/single_rw_fifo_unittest.cc | 126 ---- webrtc/modules/audio_device/audio_device.gypi | 36 +- .../modules/audio_device/audio_device_impl.cc | 121 ++-- .../modules/audio_device/audio_device_impl.h | 45 +- .../audio_device/include/audio_device.h | 4 +- webrtc/modules/modules.gyp | 2 + webrtc/modules/utility/BUILD.gn | 2 + .../utility/interface/helpers_android.h | 14 +- .../modules/utility/interface/jvm_android.h | 184 ++++++ .../modules/utility/source/helpers_android.cc | 31 +- webrtc/modules/utility/source/jvm_android.cc | 251 ++++++++ webrtc/modules/utility/utility.gypi | 2 + webrtc/voice_engine/voice_engine_impl.cc | 24 +- webrtc/webrtc_examples.gyp | 62 -- 66 files changed, 2324 insertions(+), 3660 deletions(-) delete mode 100644 webrtc/examples/android/opensl_loopback/AndroidManifest.xml delete mode 100644 webrtc/examples/android/opensl_loopback/README delete mode 100644 webrtc/examples/android/opensl_loopback/build.xml delete mode 100644 webrtc/examples/android/opensl_loopback/fake_audio_device_buffer.cc delete mode 100644 webrtc/examples/android/opensl_loopback/fake_audio_device_buffer.h delete mode 100644 webrtc/examples/android/opensl_loopback/jni/opensl_runner.cc delete mode 100644 webrtc/examples/android/opensl_loopback/project.properties delete mode 100644 webrtc/examples/android/opensl_loopback/res/drawable/logo.png delete mode 100644 webrtc/examples/android/opensl_loopback/res/layout/open_sl_demo.xml delete mode 100644 webrtc/examples/android/opensl_loopback/res/values/strings.xml delete mode 100644 webrtc/examples/android/opensl_loopback/src/org/webrtc/app/OpenSlDemo.java delete mode 100644 webrtc/examples/android/opensl_loopback/src/org/webrtc/app/OpenSlRunner.java delete mode 100644 webrtc/modules/audio_device/android/audio_manager_jni.cc delete mode 100644 webrtc/modules/audio_device/android/audio_manager_jni.h create mode 100644 webrtc/modules/audio_device/android/audio_manager_unittest.cc create mode 100644 webrtc/modules/audio_device/android/build_info.cc create mode 100644 webrtc/modules/audio_device/android/build_info.h delete mode 100644 webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/AudioManagerAndroid.java create mode 100644 webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/BuildInfo.java delete mode 100644 webrtc/modules/audio_device/android/low_latency_event.h delete mode 100644 webrtc/modules/audio_device/android/low_latency_event_posix.cc delete mode 100644 webrtc/modules/audio_device/android/low_latency_event_unittest.cc delete mode 100644 webrtc/modules/audio_device/android/opensles_input.cc delete mode 100644 webrtc/modules/audio_device/android/opensles_input.h delete mode 100644 webrtc/modules/audio_device/android/opensles_output.cc delete mode 100644 webrtc/modules/audio_device/android/opensles_output.h create mode 100644 webrtc/modules/audio_device/android/opensles_player.cc create mode 100644 webrtc/modules/audio_device/android/opensles_player.h delete mode 100644 webrtc/modules/audio_device/android/single_rw_fifo.cc delete mode 100644 webrtc/modules/audio_device/android/single_rw_fifo.h delete mode 100644 webrtc/modules/audio_device/android/single_rw_fifo_unittest.cc create mode 100644 webrtc/modules/utility/interface/jvm_android.h create mode 100644 webrtc/modules/utility/source/jvm_android.cc diff --git a/talk/libjingle.gyp b/talk/libjingle.gyp index 1c97f0f0a4..29f2900c44 100755 --- a/talk/libjingle.gyp +++ b/talk/libjingle.gyp @@ -144,10 +144,10 @@ 'app/webrtc/java/src/org/webrtc/MediaCodecVideoEncoder.java', 'app/webrtc/java/src/org/webrtc/MediaCodecVideoDecoder.java', 'app/webrtc/java/src/org/webrtc/VideoCapturerAndroid.java', - '<(webrtc_modules_dir)/audio_device/android/java/src/org/webrtc/voiceengine/AudioManagerAndroid.java', '<(webrtc_modules_dir)/video_render/android/java/src/org/webrtc/videoengine/ViEAndroidGLES20.java', '<(webrtc_modules_dir)/video_render/android/java/src/org/webrtc/videoengine/ViERenderer.java', '<(webrtc_modules_dir)/video_render/android/java/src/org/webrtc/videoengine/ViESurfaceRenderer.java', + '<(webrtc_modules_dir)/audio_device/android/java/src/org/webrtc/voiceengine/BuildInfo.java', '<(webrtc_modules_dir)/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioManager.java', '<(webrtc_modules_dir)/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioUtils.java', '<(webrtc_modules_dir)/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioRecord.java', diff --git a/webrtc/BUILD.gn b/webrtc/BUILD.gn index 893dd9f39a..2c1fafbaef 100644 --- a/webrtc/BUILD.gn +++ b/webrtc/BUILD.gn @@ -55,9 +55,6 @@ config("common_inherited_config") { "WEBRTC_LINUX", "WEBRTC_ANDROID", ] - if (rtc_enable_android_opensl) { - defines += [ "WEBRTC_ANDROID_OPENSLES" ] - } } } diff --git a/webrtc/build/common.gypi b/webrtc/build/common.gypi index 2d7d9854dd..e1ef419bf2 100644 --- a/webrtc/build/common.gypi +++ b/webrtc/build/common.gypi @@ -363,11 +363,6 @@ 'WEBRTC_ANDROID', ], 'conditions': [ - ['enable_android_opensl==1', { - 'defines': [ - 'WEBRTC_ANDROID_OPENSLES', - ], - }], ['clang!=1', { # The Android NDK doesn't provide optimized versions of these # functions. Ensure they are disabled for all compilers. @@ -431,13 +426,6 @@ 'WEBRTC_LINUX', 'WEBRTC_ANDROID', ], - 'conditions': [ - ['enable_android_opensl==1', { - 'defines': [ - 'WEBRTC_ANDROID_OPENSLES', - ], - }] - ], }], ['os_posix==1', { # For access to standard POSIXish features, use WEBRTC_POSIX instead diff --git a/webrtc/examples/android/opensl_loopback/AndroidManifest.xml b/webrtc/examples/android/opensl_loopback/AndroidManifest.xml deleted file mode 100644 index 3d32a7afcd..0000000000 --- a/webrtc/examples/android/opensl_loopback/AndroidManifest.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/webrtc/examples/android/opensl_loopback/README b/webrtc/examples/android/opensl_loopback/README deleted file mode 100644 index 59f6de9dbb..0000000000 --- a/webrtc/examples/android/opensl_loopback/README +++ /dev/null @@ -1,23 +0,0 @@ -This directory contains an app for measuring the total delay from the native -OpenSL implementation. Note that it just loops audio back from mic to speakers. - -Prerequisites: -- Make sure gclient is checking out tools necessary to target Android: your - .gclient file should contain a line like: - target_os = ['android'] - Make sure to re-run gclient sync after adding this to download the tools. -- Env vars need to be set up to target Android; easiest way to do this is to run - (from the libjingle trunk directory): - . ./build/android/envsetup.sh - Note that this clobbers any previously-set $GYP_DEFINES so it must be done - before the next item. -- Set up webrtc-related GYP variables: - export GYP_DEFINES="$GYP_DEFINES java_home= - enable_android_opensl=1" -- Finally, run "gclient runhooks" to generate Android-targeting .ninja files. - -Example of building & using the app: - -cd /trunk -ninja -C out/Debug OpenSlDemo -adb install -r out/Debug/OpenSlDemo-debug.apk \ No newline at end of file diff --git a/webrtc/examples/android/opensl_loopback/build.xml b/webrtc/examples/android/opensl_loopback/build.xml deleted file mode 100644 index b6e033a6a8..0000000000 --- a/webrtc/examples/android/opensl_loopback/build.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webrtc/examples/android/opensl_loopback/fake_audio_device_buffer.cc b/webrtc/examples/android/opensl_loopback/fake_audio_device_buffer.cc deleted file mode 100644 index 116521e695..0000000000 --- a/webrtc/examples/android/opensl_loopback/fake_audio_device_buffer.cc +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#include "webrtc/examples/android/opensl_loopback/fake_audio_device_buffer.h" - -#include - -#include "webrtc/modules/audio_device/android/opensles_common.h" -#include "webrtc/modules/audio_device/android/audio_common.h" - -namespace webrtc { - -FakeAudioDeviceBuffer::FakeAudioDeviceBuffer() - : fifo_(kNumBuffers), - next_available_buffer_(0), - record_channels_(0), - play_channels_(0) { - buf_.reset(new rtc::scoped_ptr[kNumBuffers]); - for (int i = 0; i < kNumBuffers; ++i) { - buf_[i].reset(new int8_t[buffer_size_bytes()]); - } -} - -int32_t FakeAudioDeviceBuffer::SetRecordingSampleRate(uint32_t fsHz) { - assert(static_cast(fsHz) == sample_rate()); - return 0; -} - -int32_t FakeAudioDeviceBuffer::SetPlayoutSampleRate(uint32_t fsHz) { - assert(static_cast(fsHz) == sample_rate()); - return 0; -} - -int32_t FakeAudioDeviceBuffer::SetRecordingChannels(uint8_t channels) { - assert(channels > 0); - record_channels_ = channels; - assert((play_channels_ == 0) || - (record_channels_ == play_channels_)); - return 0; -} - -int32_t FakeAudioDeviceBuffer::SetPlayoutChannels(uint8_t channels) { - assert(channels > 0); - play_channels_ = channels; - assert((record_channels_ == 0) || - (record_channels_ == play_channels_)); - return 0; -} - -int32_t FakeAudioDeviceBuffer::SetRecordedBuffer(const void* audioBuffer, - uint32_t nSamples) { - assert(audioBuffer); - assert(fifo_.size() < fifo_.capacity()); - assert(nSamples == kDefaultBufSizeInSamples); - int8_t* buffer = buf_[next_available_buffer_].get(); - next_available_buffer_ = (next_available_buffer_ + 1) % kNumBuffers; - memcpy(buffer, audioBuffer, nSamples * sizeof(int16_t)); - fifo_.Push(buffer); - return 0; -} - -int32_t FakeAudioDeviceBuffer::RequestPlayoutData(uint32_t nSamples) { - assert(nSamples == kDefaultBufSizeInSamples); - return 0; -} - -int32_t FakeAudioDeviceBuffer::GetPlayoutData(void* audioBuffer) { - assert(audioBuffer); - if (fifo_.size() < 1) { - // Playout silence until there is data available. - memset(audioBuffer, 0, buffer_size_bytes()); - return buffer_size_samples(); - } - int8_t* buffer = fifo_.Pop(); - memcpy(audioBuffer, buffer, buffer_size_bytes()); - return buffer_size_samples(); -} - -int FakeAudioDeviceBuffer::sample_rate() const { - return audio_manager_.low_latency_supported() ? - audio_manager_.native_output_sample_rate() : kDefaultSampleRate; -} - -int FakeAudioDeviceBuffer::buffer_size_samples() const { - return sample_rate() * 10 / 1000; -} - -int FakeAudioDeviceBuffer::buffer_size_bytes() const { - return buffer_size_samples() * kNumChannels * sizeof(int16_t); -} - - -void FakeAudioDeviceBuffer::ClearBuffer() { - while (fifo_.size() != 0) { - fifo_.Pop(); - } - next_available_buffer_ = 0; -} - -} // namespace webrtc diff --git a/webrtc/examples/android/opensl_loopback/fake_audio_device_buffer.h b/webrtc/examples/android/opensl_loopback/fake_audio_device_buffer.h deleted file mode 100644 index f5442ee00b..0000000000 --- a/webrtc/examples/android/opensl_loopback/fake_audio_device_buffer.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#ifndef WEBRTC_EXAMPLES_ANDROID_OPENSL_LOOPBACK_FAKE_AUDIO_DEVICE_BUFFER_H_ -#define WEBRTC_EXAMPLES_ANDROID_OPENSL_LOOPBACK_FAKE_AUDIO_DEVICE_BUFFER_H_ - -#include "webrtc/base/scoped_ptr.h" -#include "webrtc/modules/audio_device/android/audio_manager_jni.h" -#include "webrtc/modules/audio_device/android/single_rw_fifo.h" -#include "webrtc/modules/audio_device/audio_device_buffer.h" - -namespace webrtc { - -// Fake AudioDeviceBuffer implementation that returns audio data that is pushed -// to it. It implements all APIs used by the OpenSL implementation. -class FakeAudioDeviceBuffer : public AudioDeviceBuffer { - public: - FakeAudioDeviceBuffer(); - virtual ~FakeAudioDeviceBuffer() {} - - virtual int32_t SetRecordingSampleRate(uint32_t fsHz); - virtual int32_t SetPlayoutSampleRate(uint32_t fsHz); - virtual int32_t SetRecordingChannels(uint8_t channels); - virtual int32_t SetPlayoutChannels(uint8_t channels); - virtual int32_t SetRecordedBuffer(const void* audioBuffer, - uint32_t nSamples); - virtual void SetVQEData(int playDelayMS, - int recDelayMS, - int clockDrift) {} - virtual int32_t DeliverRecordedData() { return 0; } - virtual int32_t RequestPlayoutData(uint32_t nSamples); - virtual int32_t GetPlayoutData(void* audioBuffer); - - void ClearBuffer(); - - private: - enum { - // Each buffer contains 10 ms of data since that is what OpenSlesInput - // delivers. Keep 7 buffers which would cover 70 ms of data. These buffers - // are needed because of jitter between OpenSl recording and playing. - kNumBuffers = 7, - }; - int sample_rate() const; - int buffer_size_samples() const; - int buffer_size_bytes() const; - - // Java API handle - AudioManagerJni audio_manager_; - - SingleRwFifo fifo_; - rtc::scoped_ptr[]> buf_; - int next_available_buffer_; - - uint8_t record_channels_; - uint8_t play_channels_; -}; - -} // namespace webrtc - -#endif // WEBRTC_EXAMPLES_ANDROID_OPENSL_LOOPBACK_FAKE_AUDIO_DEVICE_BUFFER_H_ diff --git a/webrtc/examples/android/opensl_loopback/jni/opensl_runner.cc b/webrtc/examples/android/opensl_loopback/jni/opensl_runner.cc deleted file mode 100644 index 3b201a7cdf..0000000000 --- a/webrtc/examples/android/opensl_loopback/jni/opensl_runner.cc +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#include -#include - -#include "webrtc/base/scoped_ptr.h" -#include "webrtc/examples/android/opensl_loopback/fake_audio_device_buffer.h" -#include "webrtc/modules/audio_device/android/audio_device_template.h" -#include "webrtc/modules/audio_device/android/audio_record_jni.h" -#include "webrtc/modules/audio_device/android/audio_track_jni.h" -#include "webrtc/modules/audio_device/android/opensles_input.h" -#include "webrtc/modules/audio_device/android/opensles_output.h" - -// Java globals -static JavaVM* g_vm = NULL; -static jclass g_osr = NULL; - -namespace webrtc { - -template -class OpenSlRunnerTemplate { - public: - OpenSlRunnerTemplate() - : output_(NULL), // TODO(henrika): inject proper audio manager. - input_(&output_, NULL) { - output_.AttachAudioBuffer(&audio_buffer_); - if (output_.Init() != 0) { - assert(false); - } - if (output_.InitPlayout() != 0) { - assert(false); - } - input_.AttachAudioBuffer(&audio_buffer_); - if (input_.Init() != 0) { - assert(false); - } - if (input_.InitRecording() != 0) { - assert(false); - } - } - - ~OpenSlRunnerTemplate() {} - - void StartPlayRecord() { - output_.StartPlayout(); - input_.StartRecording(); - } - - void StopPlayRecord() { - // There are large enough buffers to compensate for recording and playing - // jitter such that the timing of stopping playing or recording should not - // result in over or underrun. - input_.StopRecording(); - output_.StopPlayout(); - audio_buffer_.ClearBuffer(); - } - - private: - OutputType output_; - InputType input_; - FakeAudioDeviceBuffer audio_buffer_; -}; - -class OpenSlRunner - : public OpenSlRunnerTemplate { - public: - // Global class implementing native code. - static OpenSlRunner* g_runner; - - - OpenSlRunner() {} - virtual ~OpenSlRunner() {} - - static JNIEXPORT void JNICALL RegisterApplicationContext( - JNIEnv* env, - jobject obj, - jobject context) { - assert(!g_runner); // Should only be called once. - OpenSlesInput::SetAndroidAudioDeviceObjects(g_vm, context); - OpenSlesOutput::SetAndroidAudioDeviceObjects(g_vm, context); - g_runner = new OpenSlRunner(); - } - - static JNIEXPORT void JNICALL Start(JNIEnv * env, jobject) { - g_runner->StartPlayRecord(); - } - - static JNIEXPORT void JNICALL Stop(JNIEnv * env, jobject) { - g_runner->StopPlayRecord(); - } -}; - -OpenSlRunner* OpenSlRunner::g_runner = NULL; - -} // namespace webrtc - -jint JNI_OnLoad(JavaVM* vm, void* reserved) { - // Only called once. - assert(!g_vm); - JNIEnv* env; - if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6) != JNI_OK) { - return -1; - } - - jclass local_osr = env->FindClass("org/webrtc/app/OpenSlRunner"); - assert(local_osr != NULL); - g_osr = static_cast(env->NewGlobalRef(local_osr)); - JNINativeMethod nativeFunctions[] = { - {"RegisterApplicationContext", "(Landroid/content/Context;)V", - reinterpret_cast( - &webrtc::OpenSlRunner::RegisterApplicationContext)}, - {"Start", "()V", reinterpret_cast(&webrtc::OpenSlRunner::Start)}, - {"Stop", "()V", reinterpret_cast(&webrtc::OpenSlRunner::Stop)} - }; - int ret_val = env->RegisterNatives(g_osr, nativeFunctions, 3); - if (ret_val != 0) { - assert(false); - } - g_vm = vm; - return JNI_VERSION_1_6; -} diff --git a/webrtc/examples/android/opensl_loopback/project.properties b/webrtc/examples/android/opensl_loopback/project.properties deleted file mode 100644 index a6ca533fe3..0000000000 --- a/webrtc/examples/android/opensl_loopback/project.properties +++ /dev/null @@ -1,16 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -# Project target. -target=android-22 - -java.compilerargs=-Xlint:all -Werror diff --git a/webrtc/examples/android/opensl_loopback/res/drawable/logo.png b/webrtc/examples/android/opensl_loopback/res/drawable/logo.png deleted file mode 100644 index a07c69fa5a0f4da5d5efe96eea12a543154dbab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2574 zcmV+p3i0)cP)Q`Og{P|8RRXpj5bgrSmEzSMfBn+{{vpNxw?;5UX;iv9sYxy_`IQHs$i<61a_iv^L>h8s-`D(`e@|IgS*Fj zNGM876Gf;3D8*1UX9a%v>yJKD*QkCwW2AirU(L{qNA)JghmGItc;(H<$!ABY&gBy1vJIEUj-b8%el*o|VkG)LqNx#TG>Jvj^jIte!!+RY z)T4j$7+PoF1AkRBf}R#^T=-q|PaK1$c<4UH)Hpq3$4WA|xtr!ZQLC=*vNE>O6E9kp+5X0eKB$6>C(lPwI@3#oY zhS_%x7e|j!$yG?ECXmh~EH~^OeuK}+sWoJse3Z3?ha3n`MM9KvA?uqpEnBg4Q46)7 zM$p%a$@l;+O}vfvx%XjH`}a{(-HHth9!JaUwV0*VqGR48^gWNYN<&~7x)y$e!X>e` zZ5!6KZoxbKuV9XUDI%#M1~IVh?pNSdeb~6@$y`v|yk=XK+fHxnDqnUK4&=QRNyIVf zYbDM*cI>~qIy*a7=z7uqkw@agd(<=y-Q7L!ty_23SGdXmahO<;N=wB+j;lNm%=OHC zy zU|>La6h%92y4IPufI$9>Xu!@y`TaNgtg&41@PwMwBdmSm7)xAWDLoqjZ==P2#*k7! z3o1)cVSI3KP_!?d8G^Lg0FtLXC~JYdxi|c%h~lXEixY=%VSFF@!*3&&9>(Rb|iK54Cx5;s~PY5iaV1het%w`dgQFBAJ;aFK zImQC}(|QaCFYUm1JVfzSc)ebv=)ObI)0jwJb``}Zj9J0n0Xgn*Zc(rFM9$xh_makZbm-at_v5^SW zM1y1SW@%+FuIy*WR)i3A2N_q;(YO`O!A|Ts^%z}9ZepCj3ytlw#x%N_fNrKKtPh`< z|1{UqF`4LxHaCQ79+E=uUXCOZ35jAMRz%R%0(P!0FMv=sk>Nr8%+OzY^c-M9@+fz=G`qa@v4sF5u-2289-#$**LWnyNNDwDf1( zkUiMnw|y$tn>pQP=Vn!#|17L^5AGrjtBkN$D@v)Z7LXc5EFhLB4<;7Wehh)CMqX|W zqsiZaO^benJ_hwa&V0ub$-_HUk**?g6fm9|!@kguU6*zhK)$qn-<3*kFrYPIaqR=V zUaUvk>@F_89b@tHs8R!*QKY;INJ<2_U+K6Ca3e9Gsl2{qY0%a7J?uICWgHuLfj+MB z=GkAN1&ifT#2u}B+2S#~$5jA(Qn^;H%CCmIae4AE-Dsng|Hl*Ov!z72k3ZnJs{pp| z+pW`DDueC#mEWOf=ucJ!dTL}hzOeiS-i?m2E;`EKz4<&Lu~NnW?peqVU^@<+T3KKu z{yrI%Qy-Z%HEvLUz}n^~m?7x`xuCtNR#L2En!T>dQtIKdS#V-Hzt3RtwTeYtmQ&dR z6qXZvac*oc@BUYEH%@Ylv_1&tSjkbzzU6*h1(3^C`;1z;g_SmOtclS?KWk2VYE zM*oS<=C483XckW?GN|1jfh3Ro(h - - -