diff --git a/CMakeLists.txt b/CMakeLists.txt index 5de6fc8..e80e401 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,7 @@ target_include_directories(tg2sip PRIVATE target_link_libraries(tg2sip PRIVATE ${PJSIP_LIBRARIES} + ${OPUS_LIBRARIES} libtgvoip Threads::Threads Td::TdStatic) diff --git a/appveyor.yml b/appveyor.yml index 2b99921..ab4a627 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,7 +1,7 @@ version: 1.0.0+{build} image: - - Previous Ubuntu + - Ubuntu services: - docker @@ -27,7 +27,7 @@ environment: init: - sh: | docker login -u "$docker_login" -p "$docker_password" - docker pull "$docker_image":"$docker_tag" + docker pull "$docker_image":"$docker_tag" install: - sh: docker build buildenv/ -f buildenv/Dockerfile."$docker_tag" --cache-from "$docker_image":"$docker_tag" -t "$docker_image":"$docker_tag" @@ -35,9 +35,9 @@ install: build_script: - sh: >- mkdir build; - docker run --rm -v "$(pwd)":/src "$docker_image" /bin/bash -c " + docker run --rm -v "$(pwd)":/src "$docker_image":"$docker_tag" /bin/bash -c " mkdir build && cd build; - cmake -DCMAKE_BUILD_TYPE=Release /src; + export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig && cmake -DCMAKE_BUILD_TYPE=Release /src cmake --build .; chmod +x tg2sip; chmod +x gen_db; diff --git a/buildenv/Dockerfile.centos7 b/buildenv/Dockerfile.centos7 index 3502758..79e10e9 100644 --- a/buildenv/Dockerfile.centos7 +++ b/buildenv/Dockerfile.centos7 @@ -50,4 +50,8 @@ RUN source /opt/rh/devtoolset-7/enable \ && cmake -DCMAKE_BUILD_TYPE=Release -DSPDLOG_BUILD_EXAMPLES=OFF -DSPDLOG_BUILD_TESTING=OFF .. \ && cmake --build . --target install \ && cd / \ - && rm -rf spdlog \ No newline at end of file + && rm -rf spdlog + +COPY centos_entrypoint.sh / + +ENTRYPOINT ["/centos_entrypoint.sh"] \ No newline at end of file diff --git a/buildenv/centos_entrypoint.sh b/buildenv/centos_entrypoint.sh new file mode 100755 index 0000000..6a0bf18 --- /dev/null +++ b/buildenv/centos_entrypoint.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +set -e +source /opt/rh/devtoolset-7/enable + +exec "$@" \ No newline at end of file diff --git a/buildenv/config_site.h b/buildenv/config_site.h old mode 100755 new mode 100644 diff --git a/libtgvoip/Android.mk b/libtgvoip/Android.mk index 23ef1c6..ad0f744 100644 --- a/libtgvoip/Android.mk +++ b/libtgvoip/Android.mk @@ -1,58 +1,349 @@ -LOCAL_MODULE := WebRtcAec +LOCAL_PATH := $(call my-dir) -LOCAL_SRC_FILES := ./libtgvoip/external/libWebRtcAec_android_$(TARGET_ARCH_ABI).a +LOCAL_MODULE := voip +LOCAL_CPPFLAGS := -Wall -std=c++11 -DANDROID -finline-functions -ffast-math -Os -fno-strict-aliasing -O3 -frtti -D__STDC_LIMIT_MACROS -Wno-unknown-pragmas +LOCAL_CFLAGS := -O3 -DUSE_KISS_FFT -fexceptions -DWEBRTC_APM_DEBUG_DUMP=0 -DWEBRTC_POSIX -DWEBRTC_ANDROID -D__STDC_LIMIT_MACROS -DFIXED_POINT -DWEBRTC_NS_FLOAT +LOCAL_EXPORT_LDLIBS := -llog -lOpenSLES -include $(PREBUILT_STATIC_LIBRARY) +MY_DIR := libtgvoip -include $(CLEAR_VARS) +LOCAL_C_INCLUDES := $(LOCAL_PATH)/../opus/include $(LOCAL_PATH)/../boringssl/include/ $(LOCAL_PATH)/webrtc_dsp/ -LOCAL_MODULE := voip -LOCAL_CPPFLAGS := -Wall -std=c++11 -DANDROID -finline-functions -ffast-math -Os -fno-strict-aliasing -O3 -LOCAL_CFLAGS := -O3 -DUSE_KISS_FFT -fexceptions - -ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) -# LOCAL_CPPFLAGS += -mfloat-abi=softfp -mfpu=neon -# LOCAL_CFLAGS += -mfloat-abi=softfp -mfpu=neon -DFLOATING_POINT -# LOCAL_ARM_NEON := true +ifeq ($(TARGET_ARCH_ABI),$(filter $(TARGET_ARCH_ABI),armeabi-v7a arm64-v8a)) +CC_NEON := cc.neon +LOCAL_CFLAGS += -DWEBRTC_HAS_NEON else - LOCAL_CFLAGS += -DFIXED_POINT - ifeq ($(TARGET_ARCH_ABI),armeabi) -# LOCAL_CPPFLAGS += -mfloat-abi=softfp -mfpu=neon -# LOCAL_CFLAGS += -mfloat-abi=softfp -mfpu=neon - else - ifeq ($(TARGET_ARCH_ABI),x86) - - endif - endif +CC_NEON := cc endif -MY_DIR := libtgvoip - -LOCAL_C_INCLUDES := jni/opus/include jni/boringssl/include/ +LOCAL_CFLAGS += $(TGVOIP_ADDITIONAL_CFLAGS) LOCAL_SRC_FILES := \ -./libtgvoip/logging.cpp \ -./libtgvoip/VoIPController.cpp \ -./libtgvoip/BufferInputStream.cpp \ -./libtgvoip/BufferOutputStream.cpp \ -./libtgvoip/BlockingQueue.cpp \ -./libtgvoip/audio/AudioInput.cpp \ -./libtgvoip/os/android/AudioInputOpenSLES.cpp \ -./libtgvoip/MediaStreamItf.cpp \ -./libtgvoip/audio/AudioOutput.cpp \ -./libtgvoip/OpusEncoder.cpp \ -./libtgvoip/os/android/AudioOutputOpenSLES.cpp \ -./libtgvoip/JitterBuffer.cpp \ -./libtgvoip/OpusDecoder.cpp \ -./libtgvoip/BufferPool.cpp \ -./libtgvoip/os/android/OpenSLEngineWrapper.cpp \ -./libtgvoip/os/android/AudioInputAndroid.cpp \ -./libtgvoip/os/android/AudioOutputAndroid.cpp \ -./libtgvoip/EchoCanceller.cpp \ -./libtgvoip/CongestionControl.cpp \ -./libtgvoip/VoIPServerConfig.cpp \ -./libtgvoip/NetworkSocket.cpp +./logging.cpp \ +./VoIPController.cpp \ +./VoIPGroupController.cpp \ +./Buffers.cpp \ +./BlockingQueue.cpp \ +./audio/AudioInput.cpp \ +./os/android/AudioInputOpenSLES.cpp \ +./MediaStreamItf.cpp \ +./audio/AudioOutput.cpp \ +./OpusEncoder.cpp \ +./os/android/AudioOutputOpenSLES.cpp \ +./JitterBuffer.cpp \ +./OpusDecoder.cpp \ +./os/android/OpenSLEngineWrapper.cpp \ +./os/android/AudioInputAndroid.cpp \ +./os/android/AudioOutputAndroid.cpp \ +./EchoCanceller.cpp \ +./CongestionControl.cpp \ +./VoIPServerConfig.cpp \ +./audio/Resampler.cpp \ +./NetworkSocket.cpp \ +./os/posix/NetworkSocketPosix.cpp \ +./PacketReassembler.cpp \ +./MessageThread.cpp \ +./json11.cpp \ +./audio/AudioIO.cpp \ +./video/VideoRenderer.cpp \ +./video/VideoSource.cpp \ +./os/android/VideoSourceAndroid.cpp \ +./os/android/VideoRendererAndroid.cpp \ +./client/android/tg_voip_jni.cpp -include $(BUILD_STATIC_LIBRARY) +# WebRTC signal processing + +LOCAL_SRC_FILES += \ +./webrtc_dsp/system_wrappers/source/field_trial.cc \ +./webrtc_dsp/system_wrappers/source/metrics.cc \ +./webrtc_dsp/system_wrappers/source/cpu_features.cc \ +./webrtc_dsp/absl/strings/internal/memutil.cc \ +./webrtc_dsp/absl/strings/string_view.cc \ +./webrtc_dsp/absl/strings/ascii.cc \ +./webrtc_dsp/absl/types/bad_optional_access.cc \ +./webrtc_dsp/absl/types/optional.cc \ +./webrtc_dsp/absl/base/internal/raw_logging.cc \ +./webrtc_dsp/absl/base/internal/throw_delegate.cc \ +./webrtc_dsp/rtc_base/race_checker.cc \ +./webrtc_dsp/rtc_base/strings/string_builder.cc \ +./webrtc_dsp/rtc_base/memory/aligned_malloc.cc \ +./webrtc_dsp/rtc_base/timeutils.cc \ +./webrtc_dsp/rtc_base/platform_file.cc \ +./webrtc_dsp/rtc_base/string_to_number.cc \ +./webrtc_dsp/rtc_base/thread_checker_impl.cc \ +./webrtc_dsp/rtc_base/stringencode.cc \ +./webrtc_dsp/rtc_base/stringutils.cc \ +./webrtc_dsp/rtc_base/checks.cc \ +./webrtc_dsp/rtc_base/platform_thread.cc \ +./webrtc_dsp/rtc_base/criticalsection.cc \ +./webrtc_dsp/rtc_base/platform_thread_types.cc \ +./webrtc_dsp/rtc_base/event.cc \ +./webrtc_dsp/rtc_base/event_tracer.cc \ +./webrtc_dsp/rtc_base/logging_webrtc.cc \ +./webrtc_dsp/third_party/rnnoise/src/rnn_vad_weights.cc \ +./webrtc_dsp/third_party/rnnoise/src/kiss_fft.cc \ +./webrtc_dsp/api/audio/audio_frame.cc \ +./webrtc_dsp/api/audio/echo_canceller3_config.cc \ +./webrtc_dsp/api/audio/echo_canceller3_factory.cc \ +./webrtc_dsp/modules/third_party/fft/fft.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_estimator.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines_logist.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filterbanks.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/transform.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_filter.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filter_functions.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/decode.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lattice.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/intialize.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_tables.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_analysis.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines_hist.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/entropy_coding.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac_vad.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/crc.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/decode_bwe.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac.c \ +./webrtc_dsp/modules/audio_processing/rms_level.cc \ +./webrtc_dsp/modules/audio_processing/echo_detector/normalized_covariance_estimator.cc \ +./webrtc_dsp/modules/audio_processing/echo_detector/moving_max.cc \ +./webrtc_dsp/modules/audio_processing/echo_detector/circular_buffer.cc \ +./webrtc_dsp/modules/audio_processing/echo_detector/mean_variance_estimator.cc \ +./webrtc_dsp/modules/audio_processing/splitting_filter.cc \ +./webrtc_dsp/modules/audio_processing/gain_control_impl.cc \ +./webrtc_dsp/modules/audio_processing/ns/nsx_core.c \ +./webrtc_dsp/modules/audio_processing/ns/noise_suppression_x.c \ +./webrtc_dsp/modules/audio_processing/ns/nsx_core_c.c \ +./webrtc_dsp/modules/audio_processing/ns/ns_core.c \ +./webrtc_dsp/modules/audio_processing/ns/noise_suppression.c \ +./webrtc_dsp/modules/audio_processing/audio_buffer.cc \ +./webrtc_dsp/modules/audio_processing/typing_detection.cc \ +./webrtc_dsp/modules/audio_processing/include/audio_processing_statistics.cc \ +./webrtc_dsp/modules/audio_processing/include/audio_generator_factory.cc \ +./webrtc_dsp/modules/audio_processing/include/aec_dump.cc \ +./webrtc_dsp/modules/audio_processing/include/audio_processing.cc \ +./webrtc_dsp/modules/audio_processing/include/config.cc \ +./webrtc_dsp/modules/audio_processing/agc2/interpolated_gain_curve.cc \ +./webrtc_dsp/modules/audio_processing/agc2/agc2_common.cc \ +./webrtc_dsp/modules/audio_processing/agc2/gain_applier.cc \ +./webrtc_dsp/modules/audio_processing/agc2/adaptive_agc.cc \ +./webrtc_dsp/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc \ +./webrtc_dsp/modules/audio_processing/agc2/limiter.cc \ +./webrtc_dsp/modules/audio_processing/agc2/saturation_protector.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features_internal.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/rnn.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search_internal.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/features_extraction.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/fft_util.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/lp_residual.cc \ +./webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.cc \ +./webrtc_dsp/modules/audio_processing/agc2/vector_float_frame.cc \ +./webrtc_dsp/modules/audio_processing/agc2/noise_level_estimator.cc \ +./webrtc_dsp/modules/audio_processing/agc2/agc2_testing_common.cc \ +./webrtc_dsp/modules/audio_processing/agc2/fixed_digital_level_estimator.cc \ +./webrtc_dsp/modules/audio_processing/agc2/fixed_gain_controller.cc \ +./webrtc_dsp/modules/audio_processing/agc2/vad_with_level.cc \ +./webrtc_dsp/modules/audio_processing/agc2/limiter_db_gain_curve.cc \ +./webrtc_dsp/modules/audio_processing/agc2/down_sampler.cc \ +./webrtc_dsp/modules/audio_processing/agc2/signal_classifier.cc \ +./webrtc_dsp/modules/audio_processing/agc2/noise_spectrum_estimator.cc \ +./webrtc_dsp/modules/audio_processing/agc2/compute_interpolated_gain_curve.cc \ +./webrtc_dsp/modules/audio_processing/agc2/biquad_filter.cc \ +./webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator.cc \ +./webrtc_dsp/modules/audio_processing/transient/moving_moments.cc \ +./webrtc_dsp/modules/audio_processing/transient/wpd_tree.cc \ +./webrtc_dsp/modules/audio_processing/transient/wpd_node.cc \ +./webrtc_dsp/modules/audio_processing/transient/transient_suppressor.cc \ +./webrtc_dsp/modules/audio_processing/transient/transient_detector.cc \ +./webrtc_dsp/modules/audio_processing/low_cut_filter.cc \ +./webrtc_dsp/modules/audio_processing/level_estimator_impl.cc \ +./webrtc_dsp/modules/audio_processing/three_band_filter_bank.cc \ +./webrtc_dsp/modules/audio_processing/aec/echo_cancellation.cc \ +./webrtc_dsp/modules/audio_processing/aec/aec_resampler.cc \ +./webrtc_dsp/modules/audio_processing/aec/aec_core.cc \ +./webrtc_dsp/modules/audio_processing/voice_detection_impl.cc \ +./webrtc_dsp/modules/audio_processing/echo_cancellation_impl.cc \ +./webrtc_dsp/modules/audio_processing/gain_control_for_experimental_agc.cc \ +./webrtc_dsp/modules/audio_processing/agc/agc.cc \ +./webrtc_dsp/modules/audio_processing/agc/loudness_histogram.cc \ +./webrtc_dsp/modules/audio_processing/agc/agc_manager_direct.cc \ +./webrtc_dsp/modules/audio_processing/agc/legacy/analog_agc.c \ +./webrtc_dsp/modules/audio_processing/agc/legacy/digital_agc.c \ +./webrtc_dsp/modules/audio_processing/agc/utility.cc \ +./webrtc_dsp/modules/audio_processing/audio_processing_impl.cc \ +./webrtc_dsp/modules/audio_processing/audio_generator/file_audio_generator.cc \ +./webrtc_dsp/modules/audio_processing/gain_controller2.cc \ +./webrtc_dsp/modules/audio_processing/residual_echo_detector.cc \ +./webrtc_dsp/modules/audio_processing/noise_suppression_impl.cc \ +./webrtc_dsp/modules/audio_processing/aecm/aecm_core.cc \ +./webrtc_dsp/modules/audio_processing/aecm/aecm_core_c.cc \ +./webrtc_dsp/modules/audio_processing/aecm/echo_control_mobile.cc \ +./webrtc_dsp/modules/audio_processing/aec3/render_reverb_model.cc \ +./webrtc_dsp/modules/audio_processing/aec3/reverb_model_fallback.cc \ +./webrtc_dsp/modules/audio_processing/aec3/echo_remover_metrics.cc \ +./webrtc_dsp/modules/audio_processing/aec3/matched_filter_lag_aggregator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer2.cc \ +./webrtc_dsp/modules/audio_processing/aec3/echo_path_variability.cc \ +./webrtc_dsp/modules/audio_processing/aec3/frame_blocker.cc \ +./webrtc_dsp/modules/audio_processing/aec3/subtractor.cc \ +./webrtc_dsp/modules/audio_processing/aec3/aec3_fft.cc \ +./webrtc_dsp/modules/audio_processing/aec3/fullband_erle_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/suppression_filter.$(CC_NEON) \ +./webrtc_dsp/modules/audio_processing/aec3/block_processor.cc \ +./webrtc_dsp/modules/audio_processing/aec3/subband_erle_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller_metrics.cc \ +./webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/vector_buffer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/erl_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/aec_state.cc \ +./webrtc_dsp/modules/audio_processing/aec3/adaptive_fir_filter.$(CC_NEON) \ +./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller.cc \ +./webrtc_dsp/modules/audio_processing/aec3/skew_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/echo_path_delay_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/block_framer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/erle_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/reverb_model.cc \ +./webrtc_dsp/modules/audio_processing/aec3/cascaded_biquad_filter.cc \ +./webrtc_dsp/modules/audio_processing/aec3/render_buffer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/subtractor_output.cc \ +./webrtc_dsp/modules/audio_processing/aec3/stationarity_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/render_signal_analyzer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/subtractor_output_analyzer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/suppression_gain.$(CC_NEON) \ +./webrtc_dsp/modules/audio_processing/aec3/echo_audibility.cc \ +./webrtc_dsp/modules/audio_processing/aec3/block_processor_metrics.cc \ +./webrtc_dsp/modules/audio_processing/aec3/moving_average.cc \ +./webrtc_dsp/modules/audio_processing/aec3/reverb_model_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/aec3_common.cc \ +./webrtc_dsp/modules/audio_processing/aec3/residual_echo_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/matched_filter.$(CC_NEON) \ +./webrtc_dsp/modules/audio_processing/aec3/reverb_decay_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller2.cc \ +./webrtc_dsp/modules/audio_processing/aec3/suppression_gain_limiter.cc \ +./webrtc_dsp/modules/audio_processing/aec3/main_filter_update_gain.cc \ +./webrtc_dsp/modules/audio_processing/aec3/echo_remover.cc \ +./webrtc_dsp/modules/audio_processing/aec3/downsampled_render_buffer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/matrix_buffer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/block_processor2.cc \ +./webrtc_dsp/modules/audio_processing/aec3/echo_canceller3.cc \ +./webrtc_dsp/modules/audio_processing/aec3/block_delay_buffer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/fft_buffer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/comfort_noise_generator.$(CC_NEON) \ +./webrtc_dsp/modules/audio_processing/aec3/shadow_filter_update_gain.cc \ +./webrtc_dsp/modules/audio_processing/aec3/filter_analyzer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/reverb_frequency_response.cc \ +./webrtc_dsp/modules/audio_processing/aec3/decimator.cc \ +./webrtc_dsp/modules/audio_processing/echo_control_mobile_impl.cc \ +./webrtc_dsp/modules/audio_processing/logging/apm_data_dumper.cc \ +./webrtc_dsp/modules/audio_processing/vad/voice_activity_detector.cc \ +./webrtc_dsp/modules/audio_processing/vad/standalone_vad.cc \ +./webrtc_dsp/modules/audio_processing/vad/pitch_internal.cc \ +./webrtc_dsp/modules/audio_processing/vad/vad_circular_buffer.cc \ +./webrtc_dsp/modules/audio_processing/vad/vad_audio_proc.cc \ +./webrtc_dsp/modules/audio_processing/vad/pole_zero_filter.cc \ +./webrtc_dsp/modules/audio_processing/vad/pitch_based_vad.cc \ +./webrtc_dsp/modules/audio_processing/vad/gmm.cc \ +./webrtc_dsp/modules/audio_processing/utility/ooura_fft.cc \ +./webrtc_dsp/modules/audio_processing/utility/delay_estimator_wrapper.cc \ +./webrtc_dsp/modules/audio_processing/utility/delay_estimator.cc \ +./webrtc_dsp/modules/audio_processing/utility/block_mean_calculator.cc \ +./webrtc_dsp/common_audio/window_generator.cc \ +./webrtc_dsp/common_audio/channel_buffer.cc \ +./webrtc_dsp/common_audio/fir_filter_factory.cc \ +./webrtc_dsp/common_audio/wav_header.cc \ +./webrtc_dsp/common_audio/real_fourier_ooura.cc \ +./webrtc_dsp/common_audio/audio_util.cc \ +./webrtc_dsp/common_audio/resampler/push_sinc_resampler.cc \ +./webrtc_dsp/common_audio/resampler/resampler.cc \ +./webrtc_dsp/common_audio/resampler/push_resampler.cc \ +./webrtc_dsp/common_audio/resampler/sinc_resampler.cc \ +./webrtc_dsp/common_audio/resampler/sinusoidal_linear_chirp_source.cc \ +./webrtc_dsp/common_audio/wav_file.cc \ +./webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor.c \ +./webrtc_dsp/common_audio/third_party/fft4g/fft4g.c \ +./webrtc_dsp/common_audio/audio_converter.cc \ +./webrtc_dsp/common_audio/real_fourier.cc \ +./webrtc_dsp/common_audio/sparse_fir_filter.cc \ +./webrtc_dsp/common_audio/smoothing_filter.cc \ +./webrtc_dsp/common_audio/fir_filter_c.cc \ +./webrtc_dsp/common_audio/ring_buffer.c \ +./webrtc_dsp/common_audio/signal_processing/complex_fft.c \ +./webrtc_dsp/common_audio/signal_processing/filter_ma_fast_q12.c \ +./webrtc_dsp/common_audio/signal_processing/levinson_durbin.c \ +./webrtc_dsp/common_audio/signal_processing/dot_product_with_scale.cc \ +./webrtc_dsp/common_audio/signal_processing/auto_corr_to_refl_coef.c \ +./webrtc_dsp/common_audio/signal_processing/resample_by_2_internal.c \ +./webrtc_dsp/common_audio/signal_processing/energy.c \ +./webrtc_dsp/common_audio/signal_processing/sqrt_of_one_minus_x_squared.c \ +./webrtc_dsp/common_audio/signal_processing/downsample_fast.c \ +./webrtc_dsp/common_audio/signal_processing/splitting_filter1.c \ +./webrtc_dsp/common_audio/signal_processing/filter_ar_fast_q12.c \ +./webrtc_dsp/common_audio/signal_processing/spl_init.c \ +./webrtc_dsp/common_audio/signal_processing/lpc_to_refl_coef.c \ +./webrtc_dsp/common_audio/signal_processing/cross_correlation.c \ +./webrtc_dsp/common_audio/signal_processing/division_operations.c \ +./webrtc_dsp/common_audio/signal_processing/auto_correlation.c \ +./webrtc_dsp/common_audio/signal_processing/get_scaling_square.c \ +./webrtc_dsp/common_audio/signal_processing/resample.c \ +./webrtc_dsp/common_audio/signal_processing/min_max_operations.c \ +./webrtc_dsp/common_audio/signal_processing/refl_coef_to_lpc.c \ +./webrtc_dsp/common_audio/signal_processing/filter_ar.c \ +./webrtc_dsp/common_audio/signal_processing/vector_scaling_operations.c \ +./webrtc_dsp/common_audio/signal_processing/resample_fractional.c \ +./webrtc_dsp/common_audio/signal_processing/real_fft.c \ +./webrtc_dsp/common_audio/signal_processing/ilbc_specific_functions.c \ +./webrtc_dsp/common_audio/signal_processing/complex_bit_reverse.c \ +./webrtc_dsp/common_audio/signal_processing/randomization_functions.c \ +./webrtc_dsp/common_audio/signal_processing/copy_set_operations.c \ +./webrtc_dsp/common_audio/signal_processing/resample_by_2.c \ +./webrtc_dsp/common_audio/signal_processing/get_hanning_window.c \ +./webrtc_dsp/common_audio/signal_processing/resample_48khz.c \ +./webrtc_dsp/common_audio/signal_processing/spl_inl.c \ +./webrtc_dsp/common_audio/signal_processing/spl_sqrt.c \ +./webrtc_dsp/common_audio/vad/vad_sp.c \ +./webrtc_dsp/common_audio/vad/vad.cc \ +./webrtc_dsp/common_audio/vad/webrtc_vad.c \ +./webrtc_dsp/common_audio/vad/vad_filterbank.c \ +./webrtc_dsp/common_audio/vad/vad_core.c \ +./webrtc_dsp/common_audio/vad/vad_gmm.c -include $(CLEAR_VARS) +ifeq ($(TARGET_ARCH_ABI),$(filter $(TARGET_ARCH_ABI),armeabi-v7a arm64-v8a)) +LOCAL_SRC_FILES += \ +./webrtc_dsp/modules/audio_processing/ns/nsx_core_neon.c.neon \ +./webrtc_dsp/modules/audio_processing/aec/aec_core_neon.cc.neon \ +./webrtc_dsp/modules/audio_processing/aecm/aecm_core_neon.cc.neon \ +./webrtc_dsp/modules/audio_processing/utility/ooura_fft_neon.cc.neon \ +./webrtc_dsp/common_audio/fir_filter_neon.cc.neon \ +./webrtc_dsp/common_audio/resampler/sinc_resampler_neon.cc.neon \ +./webrtc_dsp/common_audio/signal_processing/downsample_fast_neon.c.neon \ +./webrtc_dsp/common_audio/signal_processing/min_max_operations_neon.c.neon \ +./webrtc_dsp/common_audio/signal_processing/cross_correlation_neon.c.neon +endif + +ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) +LOCAL_SRC_FILES += \ +./webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor_arm.S.neon \ +./webrtc_dsp/common_audio/signal_processing/complex_bit_reverse_arm.S.neon \ +./webrtc_dsp/common_audio/signal_processing/filter_ar_fast_q12_armv7.S.neon +endif + +ifeq ($(TARGET_ARCH_ABI),$(filter $(TARGET_ARCH_ABI),x86 x86_64)) +LOCAL_SRC_FILES += \ +./webrtc_dsp/modules/audio_processing/aec/aec_core_sse2.cc \ +./webrtc_dsp/modules/audio_processing/utility/ooura_fft_sse2.cc \ +./webrtc_dsp/common_audio/fir_filter_sse.cc \ +./webrtc_dsp/common_audio/resampler/sinc_resampler_sse.cc +endif + +include $(BUILD_STATIC_LIBRARY) diff --git a/libtgvoip/BlockingQueue.h b/libtgvoip/BlockingQueue.h index 0184348..df7eda3 100644 --- a/libtgvoip/BlockingQueue.h +++ b/libtgvoip/BlockingQueue.h @@ -10,6 +10,7 @@ #include #include #include "threading.h" +#include "utils.h" using namespace std; @@ -18,6 +19,7 @@ namespace tgvoip{ template class BlockingQueue{ public: + TGVOIP_DISALLOW_COPY_AND_ASSIGN(BlockingQueue); BlockingQueue(size_t capacity) : semaphore(capacity, 0){ this->capacity=capacity; overflowCallback=NULL; diff --git a/libtgvoip/BufferInputStream.cpp b/libtgvoip/BufferInputStream.cpp deleted file mode 100644 index e4319f7..0000000 --- a/libtgvoip/BufferInputStream.cpp +++ /dev/null @@ -1,113 +0,0 @@ -// -// libtgvoip is free and unencumbered public domain software. -// For more information, see http://unlicense.org or the UNLICENSE file -// you should have received with this source code distribution. -// - -#include "BufferInputStream.h" -#include -#include -#include -#include - -using namespace tgvoip; - -BufferInputStream::BufferInputStream(unsigned char* data, size_t length){ - this->buffer=data; - this->length=length; - offset=0; -} - -BufferInputStream::~BufferInputStream(){ - -} - - -void BufferInputStream::Seek(size_t offset){ - if(offset>length){ - throw std::out_of_range("Not enough bytes in buffer"); - } - this->offset=offset; -} - -size_t BufferInputStream::GetLength(){ - return length; -} - -size_t BufferInputStream::GetOffset(){ - return offset; -} - -size_t BufferInputStream::Remaining(){ - return length-offset; -} - -unsigned char BufferInputStream::ReadByte(){ - EnsureEnoughRemaining(1); - return (unsigned char)buffer[offset++]; -} - -int32_t BufferInputStream::ReadInt32(){ - EnsureEnoughRemaining(4); - int32_t res=((int32_t)buffer[offset] & 0xFF) | - (((int32_t)buffer[offset+1] & 0xFF) << 8) | - (((int32_t)buffer[offset+2] & 0xFF) << 16) | - (((int32_t)buffer[offset+3] & 0xFF) << 24); - offset+=4; - return res; -} - -int64_t BufferInputStream::ReadInt64(){ - EnsureEnoughRemaining(8); - int64_t res=((int64_t)buffer[offset] & 0xFF) | - (((int64_t)buffer[offset+1] & 0xFF) << 8) | - (((int64_t)buffer[offset+2] & 0xFF) << 16) | - (((int64_t)buffer[offset+3] & 0xFF) << 24) | - (((int64_t)buffer[offset+4] & 0xFF) << 32) | - (((int64_t)buffer[offset+5] & 0xFF) << 40) | - (((int64_t)buffer[offset+6] & 0xFF) << 48) | - (((int64_t)buffer[offset+7] & 0xFF) << 56); - offset+=8; - return res; -} - -int16_t BufferInputStream::ReadInt16(){ - EnsureEnoughRemaining(2); - int16_t res=(uint16_t)buffer[offset] | ((uint16_t)buffer[offset+1] << 8); - offset+=2; - return res; -} - - -int32_t BufferInputStream::ReadTlLength(){ - unsigned char l=ReadByte(); - if(l<254) - return l; - assert(length-offset>=3); - EnsureEnoughRemaining(3); - int32_t res=((int32_t)buffer[offset] & 0xFF) | - (((int32_t)buffer[offset+1] & 0xFF) << 8) | - (((int32_t)buffer[offset+2] & 0xFF) << 16); - offset+=3; - return res; -} - -void BufferInputStream::ReadBytes(unsigned char *to, size_t count){ - EnsureEnoughRemaining(count); - memcpy(to, buffer+offset, count); - offset+=count; -} - -BufferInputStream BufferInputStream::GetPartBuffer(size_t length, bool advance){ - EnsureEnoughRemaining(length); - BufferInputStream s=BufferInputStream(buffer+offset, length); - if(advance) - offset+=length; - return s; -} - -void BufferInputStream::EnsureEnoughRemaining(size_t need){ - if(length-offset -#include - -namespace tgvoip{ -class BufferInputStream{ - -public: - BufferInputStream(unsigned char* data, size_t length); - ~BufferInputStream(); - void Seek(size_t offset); - size_t GetLength(); - size_t GetOffset(); - size_t Remaining(); - unsigned char ReadByte(); - int64_t ReadInt64(); - int32_t ReadInt32(); - int16_t ReadInt16(); - int32_t ReadTlLength(); - void ReadBytes(unsigned char* to, size_t count); - BufferInputStream GetPartBuffer(size_t length, bool advance); - -private: - void EnsureEnoughRemaining(size_t need); - unsigned char* buffer; - size_t length; - size_t offset; -}; -} - -#endif //LIBTGVOIP_BUFFERINPUTSTREAM_H diff --git a/libtgvoip/BufferOutputStream.cpp b/libtgvoip/BufferOutputStream.cpp deleted file mode 100644 index 1512b5a..0000000 --- a/libtgvoip/BufferOutputStream.cpp +++ /dev/null @@ -1,104 +0,0 @@ -// -// libtgvoip is free and unencumbered public domain software. -// For more information, see http://unlicense.org or the UNLICENSE file -// you should have received with this source code distribution. -// - -#include "BufferOutputStream.h" -#include -#include - -using namespace tgvoip; - -BufferOutputStream::BufferOutputStream(size_t size){ - buffer=(unsigned char*) malloc(size); - offset=0; - this->size=size; - bufferProvided=false; -} - -BufferOutputStream::BufferOutputStream(unsigned char *buffer, size_t size){ - this->buffer=buffer; - this->size=size; - offset=0; - bufferProvided=true; -} - -BufferOutputStream::~BufferOutputStream(){ - if(!bufferProvided) - free(buffer); -} - -void BufferOutputStream::WriteByte(unsigned char byte){ - this->ExpandBufferIfNeeded(1); - buffer[offset++]=byte; -} - -void BufferOutputStream::WriteInt32(int32_t i){ - this->ExpandBufferIfNeeded(4); - buffer[offset+3]=(unsigned char)((i >> 24) & 0xFF); - buffer[offset+2]=(unsigned char)((i >> 16) & 0xFF); - buffer[offset+1]=(unsigned char)((i >> 8) & 0xFF); - buffer[offset]=(unsigned char)(i & 0xFF); - offset+=4; -} - -void BufferOutputStream::WriteInt64(int64_t i){ - this->ExpandBufferIfNeeded(8); - buffer[offset+7]=(unsigned char)((i >> 56) & 0xFF); - buffer[offset+6]=(unsigned char)((i >> 48) & 0xFF); - buffer[offset+5]=(unsigned char)((i >> 40) & 0xFF); - buffer[offset+4]=(unsigned char)((i >> 32) & 0xFF); - buffer[offset+3]=(unsigned char)((i >> 24) & 0xFF); - buffer[offset+2]=(unsigned char)((i >> 16) & 0xFF); - buffer[offset+1]=(unsigned char)((i >> 8) & 0xFF); - buffer[offset]=(unsigned char)(i & 0xFF); - offset+=8; -} - -void BufferOutputStream::WriteInt16(int16_t i){ - this->ExpandBufferIfNeeded(2); - buffer[offset+1]=(unsigned char)((i >> 8) & 0xFF); - buffer[offset]=(unsigned char)(i & 0xFF); - offset+=2; -} - -void BufferOutputStream::WriteBytes(unsigned char *bytes, size_t count){ - this->ExpandBufferIfNeeded(count); - memcpy(buffer+offset, bytes, count); - offset+=count; -} - -unsigned char *BufferOutputStream::GetBuffer(){ - return buffer; -} - -size_t BufferOutputStream::GetLength(){ - return offset; -} - -void BufferOutputStream::ExpandBufferIfNeeded(size_t need){ - if(offset+need>size){ - if(bufferProvided){ - throw std::out_of_range("buffer overflow"); - } - if(need<1024){ - buffer=(unsigned char *) realloc(buffer, size+1024); - size+=1024; - }else{ - buffer=(unsigned char *) realloc(buffer, size+need); - size+=need; - } - } -} - - -void BufferOutputStream::Reset(){ - offset=0; -} - -void BufferOutputStream::Rewind(size_t numBytes){ - if(numBytes>offset) - throw std::out_of_range("buffer underflow"); - offset-=numBytes; -} diff --git a/libtgvoip/BufferOutputStream.h b/libtgvoip/BufferOutputStream.h deleted file mode 100644 index fa64408..0000000 --- a/libtgvoip/BufferOutputStream.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// libtgvoip is free and unencumbered public domain software. -// For more information, see http://unlicense.org or the UNLICENSE file -// you should have received with this source code distribution. -// - -#ifndef LIBTGVOIP_BUFFEROUTPUTSTREAM_H -#define LIBTGVOIP_BUFFEROUTPUTSTREAM_H - -#include -#include - -namespace tgvoip{ -class BufferOutputStream{ - -public: - BufferOutputStream(size_t size); - BufferOutputStream(unsigned char* buffer, size_t size); - ~BufferOutputStream(); - void WriteByte(unsigned char byte); - void WriteInt64(int64_t i); - void WriteInt32(int32_t i); - void WriteInt16(int16_t i); - void WriteBytes(unsigned char* bytes, size_t count); - unsigned char* GetBuffer(); - size_t GetLength(); - void Reset(); - void Rewind(size_t numBytes); - -private: - void ExpandBufferIfNeeded(size_t need); - unsigned char* buffer; - size_t size; - size_t offset; - bool bufferProvided; -}; -} - -#endif //LIBTGVOIP_BUFFEROUTPUTSTREAM_H diff --git a/libtgvoip/BufferPool.cpp b/libtgvoip/BufferPool.cpp deleted file mode 100644 index 59c03a5..0000000 --- a/libtgvoip/BufferPool.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// -// libtgvoip is free and unencumbered public domain software. -// For more information, see http://unlicense.org or the UNLICENSE file -// you should have received with this source code distribution. -// - -#include "BufferPool.h" -#include "logging.h" -#include -#include - -using namespace tgvoip; - -BufferPool::BufferPool(unsigned int size, unsigned int count){ - assert(count<=64); - buffers[0]=(unsigned char*) malloc(size*count); - bufferCount=count; - unsigned int i; - for(i=1;isize=size; -} - -BufferPool::~BufferPool(){ - free(buffers[0]); -} - -unsigned char* BufferPool::Get(){ - MutexGuard m(mutex); - int i; - for(i=0;i> i) & 1)){ - usedBuffers|=(1LL << i); - return buffers[i]; - } - } - return NULL; -} - -void BufferPool::Reuse(unsigned char* buffer){ - MutexGuard m(mutex); - int i; - for(i=0;i -#include "threading.h" - -namespace tgvoip{ -class BufferPool{ -public: - BufferPool(unsigned int size, unsigned int count); - ~BufferPool(); - unsigned char* Get(); - void Reuse(unsigned char* buffer); - size_t GetSingleBufferSize(); - size_t GetBufferCount(); - -private: - uint64_t usedBuffers; - int bufferCount; - size_t size; - unsigned char* buffers[64]; - Mutex mutex; -}; -} - -#endif //LIBTGVOIP_BUFFERPOOL_H diff --git a/libtgvoip/Buffers.cpp b/libtgvoip/Buffers.cpp index 5375df1..227be98 100644 --- a/libtgvoip/Buffers.cpp +++ b/libtgvoip/Buffers.cpp @@ -14,14 +14,20 @@ using namespace tgvoip; -#pragma mark -- BufferInputStream +#pragma mark - BufferInputStream -BufferInputStream::BufferInputStream(unsigned char* data, size_t length){ +BufferInputStream::BufferInputStream(const unsigned char* data, size_t length){ this->buffer=data; this->length=length; offset=0; } +BufferInputStream::BufferInputStream(const Buffer &buffer){ + this->buffer=*buffer; + this->length=buffer.Length(); + offset=0; +} + BufferInputStream::~BufferInputStream(){ } @@ -102,6 +108,10 @@ void BufferInputStream::ReadBytes(unsigned char *to, size_t count){ offset+=count; } +void BufferInputStream::ReadBytes(Buffer &to){ + ReadBytes(*to, to.Length()); +} + BufferInputStream BufferInputStream::GetPartBuffer(size_t length, bool advance){ EnsureEnoughRemaining(length); BufferInputStream s=BufferInputStream(buffer+offset, length); @@ -116,7 +126,7 @@ void BufferInputStream::EnsureEnoughRemaining(size_t need){ } } -#pragma mark -- BufferOutputStream +#pragma mark - BufferOutputStream BufferOutputStream::BufferOutputStream(size_t size){ buffer=(unsigned char*) malloc(size); @@ -171,16 +181,22 @@ void BufferOutputStream::WriteInt16(int16_t i){ offset+=2; } -void BufferOutputStream::WriteBytes(unsigned char *bytes, size_t count){ +void BufferOutputStream::WriteBytes(const unsigned char *bytes, size_t count){ this->ExpandBufferIfNeeded(count); memcpy(buffer+offset, bytes, count); offset+=count; } -void BufferOutputStream::WriteBytes(Buffer &buffer){ +void BufferOutputStream::WriteBytes(const Buffer &buffer){ WriteBytes(*buffer, buffer.Length()); } +void BufferOutputStream::WriteBytes(const Buffer &buffer, size_t offset, size_t count){ + if(offset+count>buffer.Length()) + throw std::out_of_range("offset out of buffer bounds"); + WriteBytes(*buffer+offset, count); +} + unsigned char *BufferOutputStream::GetBuffer(){ return buffer; } @@ -215,7 +231,7 @@ void BufferOutputStream::Rewind(size_t numBytes){ offset-=numBytes; } -#pragma mark -- BufferPool +#pragma mark - BufferPool BufferPool::BufferPool(unsigned int size, unsigned int count){ assert(count<=64); @@ -266,5 +282,5 @@ size_t BufferPool::GetBufferCount(){ return (size_t) bufferCount; } -#pragma mark -- Buffer +#pragma mark - Buffer diff --git a/libtgvoip/Buffers.h b/libtgvoip/Buffers.h index 23f4afa..9a6436a 100644 --- a/libtgvoip/Buffers.h +++ b/libtgvoip/Buffers.h @@ -17,6 +17,7 @@ #include #include #include "threading.h" +#include "utils.h" namespace tgvoip{ class Buffer; @@ -24,7 +25,8 @@ namespace tgvoip{ class BufferInputStream{ public: - BufferInputStream(unsigned char* data, size_t length); + BufferInputStream(const unsigned char* data, size_t length); + BufferInputStream(const Buffer& buffer); ~BufferInputStream(); void Seek(size_t offset); size_t GetLength(); @@ -36,11 +38,12 @@ namespace tgvoip{ int16_t ReadInt16(); int32_t ReadTlLength(); void ReadBytes(unsigned char* to, size_t count); + void ReadBytes(Buffer& to); BufferInputStream GetPartBuffer(size_t length, bool advance); private: void EnsureEnoughRemaining(size_t need); - unsigned char* buffer; + const unsigned char* buffer; size_t length; size_t offset; }; @@ -48,16 +51,17 @@ namespace tgvoip{ class BufferOutputStream{ friend class Buffer; public: + TGVOIP_DISALLOW_COPY_AND_ASSIGN(BufferOutputStream); BufferOutputStream(size_t size); BufferOutputStream(unsigned char* buffer, size_t size); - BufferOutputStream(const BufferOutputStream& other)=delete; ~BufferOutputStream(); void WriteByte(unsigned char byte); void WriteInt64(int64_t i); void WriteInt32(int32_t i); void WriteInt16(int16_t i); - void WriteBytes(unsigned char* bytes, size_t count); - void WriteBytes(Buffer& buffer); + void WriteBytes(const unsigned char* bytes, size_t count); + void WriteBytes(const Buffer& buffer); + void WriteBytes(const Buffer& buffer, size_t offset, size_t count); unsigned char* GetBuffer(); size_t GetLength(); void Reset(); @@ -86,6 +90,7 @@ namespace tgvoip{ class BufferPool{ public: + TGVOIP_DISALLOW_COPY_AND_ASSIGN(BufferPool); BufferPool(unsigned int size, unsigned int count); ~BufferPool(); unsigned char* Get(); @@ -110,7 +115,7 @@ namespace tgvoip{ data=NULL; length=capacity; }; - Buffer(const Buffer& other)=delete; + TGVOIP_DISALLOW_COPY_AND_ASSIGN(Buffer); // use Buffer::CopyOf to copy contents explicitly Buffer(Buffer&& other) noexcept { data=other.data; length=other.length; @@ -156,7 +161,7 @@ namespace tgvoip{ const unsigned char* operator*() const{ return data; } - void CopyFrom(Buffer& other, size_t count, size_t srcOffset=0, size_t dstOffset=0){ + void CopyFrom(const Buffer& other, size_t count, size_t srcOffset=0, size_t dstOffset=0){ if(!other.data) throw std::invalid_argument("CopyFrom can't copy from NULL"); if(other.length #include - -#ifndef TGVOIP_NO_DSP -#ifndef TGVOIP_USE_DESKTOP_DSP -#include "webrtc/modules/audio_processing/aecm/echo_control_mobile.h" -#include "webrtc/modules/audio_processing/ns/noise_suppression_x.h" -#else -#include "webrtc/modules/audio_processing/aec/echo_cancellation.h" -//#include "webrtc/modules/audio_processing/ns/noise_suppression.h" -#include "webrtc/modules/audio_processing/ns/noise_suppression_x.h" -#endif -#include "webrtc/modules/audio_processing/splitting_filter.h" -#include "webrtc/common_audio/channel_buffer.h" -#include "webrtc/modules/audio_processing/agc/legacy/gain_control.h" -#endif - -#define AEC_FRAME_SIZE 160 -#define OFFSET_STEP AEC_FRAME_SIZE*2 - -//#define CLAMP(x, min, max) (xmin ? x : min) : max) -#define CLAMP(x, min, max) x +#include using namespace tgvoip; -#ifdef TGVOIP_USE_DESKTOP_DSP -namespace webrtc{ - void WebRtcAec_enable_delay_agnostic(AecCore* self, int enable); -} -#endif - EchoCanceller::EchoCanceller(bool enableAEC, bool enableNS, bool enableAGC){ #ifndef TGVOIP_NO_DSP this->enableAEC=enableAEC; @@ -46,70 +27,65 @@ EchoCanceller::EchoCanceller(bool enableAEC, bool enableNS, bool enableAGC){ this->enableNS=enableNS; isOn=true; - splittingFilter=new webrtc::SplittingFilter(1, 3, 960); - splittingFilterFarend=new webrtc::SplittingFilter(1, 3, 960); - - splittingFilterIn=new webrtc::IFChannelBuffer(960, 1, 1); - splittingFilterFarendIn=new webrtc::IFChannelBuffer(960, 1, 1); - splittingFilterOut=new webrtc::IFChannelBuffer(960, 1, 3); - splittingFilterFarendOut=new webrtc::IFChannelBuffer(960, 1, 3); + webrtc::Config extraConfig; +#ifdef TGVOIP_USE_DESKTOP_DSP + extraConfig.Set(new webrtc::DelayAgnostic(true)); +#endif + + apm=webrtc::AudioProcessingBuilder().Create(extraConfig); - if(enableAEC){ + webrtc::AudioProcessing::Config config; + config.echo_canceller.enabled = enableAEC; #ifndef TGVOIP_USE_DESKTOP_DSP - aec=WebRtcAecm_Create(); - WebRtcAecm_Init(aec, 16000); - AecmConfig cfg; - cfg.cngMode=AecmFalse; - cfg.echoMode=0; - WebRtcAecm_set_config(aec, cfg); + config.echo_canceller.mobile_mode = true; #else - aec=webrtc::WebRtcAec_Create(); - webrtc::WebRtcAec_Init(aec, 48000, 48000); - webrtc::WebRtcAec_enable_delay_agnostic(webrtc::WebRtcAec_aec_core(aec), 1); - webrtc::AecConfig config; - config.metricsMode=webrtc::kAecFalse; - config.nlpMode=webrtc::kAecNlpAggressive; - config.skewMode=webrtc::kAecFalse; - config.delay_logging=webrtc::kAecFalse; - webrtc::WebRtcAec_set_config(aec, config); + config.echo_canceller.mobile_mode = false; #endif - - farendQueue=new BlockingQueue(11); - farendBufferPool=new BufferPool(960*2, 10); - running=true; - - bufferFarendThread=new Thread(new MethodPointer(&EchoCanceller::RunBufferFarendThread, this), NULL); - bufferFarendThread->Start(); - }else{ - aec=NULL; + config.high_pass_filter.enabled = enableAEC; + config.gain_controller2.enabled = enableAGC; + apm->ApplyConfig(config); + + webrtc::NoiseSuppression::Level nsLevel; +#ifdef __APPLE__ + switch(ServerConfig::GetSharedInstance()->GetInt("webrtc_ns_level_vpio", 0)){ +#else + switch(ServerConfig::GetSharedInstance()->GetInt("webrtc_ns_level", 2)){ +#endif + case 0: + nsLevel=webrtc::NoiseSuppression::Level::kLow; + break; + case 1: + nsLevel=webrtc::NoiseSuppression::Level::kModerate; + break; + case 3: + nsLevel=webrtc::NoiseSuppression::Level::kVeryHigh; + break; + case 2: + default: + nsLevel=webrtc::NoiseSuppression::Level::kHigh; + break; + } + apm->noise_suppression()->set_level(nsLevel); + apm->noise_suppression()->Enable(enableNS); + if(enableAGC){ + apm->gain_control()->set_mode(webrtc::GainControl::Mode::kAdaptiveDigital); + apm->gain_control()->set_target_level_dbfs(ServerConfig::GetSharedInstance()->GetInt("webrtc_agc_target_level", 9)); + apm->gain_control()->enable_limiter(ServerConfig::GetSharedInstance()->GetBoolean("webrtc_agc_enable_limiter", true)); + apm->gain_control()->set_compression_gain_db(ServerConfig::GetSharedInstance()->GetInt("webrtc_agc_compression_gain", 20)); } + apm->voice_detection()->set_likelihood(webrtc::VoiceDetection::Likelihood::kVeryLowLikelihood); - if(enableNS){ -//#ifndef TGVOIP_USE_DESKTOP_DSP - ns=WebRtcNsx_Create(); - WebRtcNsx_Init((NsxHandle*)ns, 48000); - WebRtcNsx_set_policy((NsxHandle*)ns, 0); -/*#else - ns=WebRtcNs_Create(); - WebRtcNs_Init((NsHandle*)ns, 48000); - WebRtcNs_set_policy((NsHandle*)ns, 1); -#endif*/ - }else{ - ns=NULL; - } + audioFrame=new webrtc::AudioFrame(); + audioFrame->samples_per_channel_=480; + audioFrame->sample_rate_hz_=48000; + audioFrame->num_channels_=1; + + farendQueue=new BlockingQueue(11); + farendBufferPool=new BufferPool(960*2, 10); + running=true; + bufferFarendThread=new Thread(std::bind(&EchoCanceller::RunBufferFarendThread, this)); + bufferFarendThread->Start(); - if(enableAGC){ - agc=WebRtcAgc_Create(); - WebRtcAgcConfig agcConfig; - agcConfig.compressionGaindB = 20; - agcConfig.limiterEnable = 1; - agcConfig.targetLevelDbfs = 9; - WebRtcAgc_Init(agc, 0, 255, kAgcModeAdaptiveDigital, 48000); - WebRtcAgc_set_config(agc, agcConfig); - agcMicLevel=0; - }else{ - agc=NULL; - } #else this->enableAEC=this->enableAGC=enableAGC=this->enableNS=enableNS=false; isOn=true; @@ -118,38 +94,8 @@ EchoCanceller::EchoCanceller(bool enableAEC, bool enableNS, bool enableAGC){ EchoCanceller::~EchoCanceller(){ #ifndef TGVOIP_NO_DSP - if(enableAEC){ - running=false; - farendQueue->Put(NULL); - bufferFarendThread->Join(); - delete bufferFarendThread; - delete farendQueue; - delete farendBufferPool; -#ifndef TGVOIP_USE_DESKTOP_DSP - WebRtcAecm_Free(aec); -#else - webrtc::WebRtcAec_Free(aec); -#endif - } - if(enableNS){ -//#ifndef TGVOIP_USE_DESKTOP_DSP - WebRtcNsx_Free((NsxHandle*)ns); -/*#else - WebRtcNs_Free((NsHandle*)ns); -#endif*/ - } - if(enableAGC){ - WebRtcAgc_Free(agc); - } - //webrtc::WebRtcAec_Free(state); - - delete (webrtc::SplittingFilter*)splittingFilter; - delete (webrtc::SplittingFilter*)splittingFilterFarend; - - delete (webrtc::IFChannelBuffer*)splittingFilterIn; - delete (webrtc::IFChannelBuffer*)splittingFilterOut; - delete (webrtc::IFChannelBuffer*)splittingFilterFarendIn; - delete (webrtc::IFChannelBuffer*)splittingFilterFarendOut; + delete apm; + delete audioFrame; #endif } @@ -165,11 +111,6 @@ void EchoCanceller::Stop(){ void EchoCanceller::SpeakerOutCallback(unsigned char* data, size_t len){ if(len!=960*2 || !enableAEC || !isOn) return; - /*size_t offset=0; - while(offsetGet(); if(buf){ @@ -180,27 +121,20 @@ void EchoCanceller::SpeakerOutCallback(unsigned char* data, size_t len){ } #ifndef TGVOIP_NO_DSP -void EchoCanceller::RunBufferFarendThread(void* arg){ +void EchoCanceller::RunBufferFarendThread(){ + webrtc::AudioFrame frame; + frame.num_channels_=1; + frame.sample_rate_hz_=48000; + frame.samples_per_channel_=480; while(running){ int16_t* samplesIn=farendQueue->GetBlocking(); if(samplesIn){ - webrtc::IFChannelBuffer* bufIn=(webrtc::IFChannelBuffer*) splittingFilterFarendIn; - webrtc::IFChannelBuffer* bufOut=(webrtc::IFChannelBuffer*) splittingFilterFarendOut; - memcpy(bufIn->ibuf()->bands(0)[0], samplesIn, 960*2); - farendBufferPool->Reuse((unsigned char *) samplesIn); - ((webrtc::SplittingFilter*)splittingFilterFarend)->Analysis(bufIn, bufOut); - aecMutex.Lock(); - //outstandingFarendFrames++; - //LOGV("BufferFarend: %d frames", outstandingFarendFrames); -#ifndef TGVOIP_USE_DESKTOP_DSP - WebRtcAecm_BufferFarend(aec, bufOut->ibuf_const()->bands(0)[0], 160); - WebRtcAecm_BufferFarend(aec, bufOut->ibuf_const()->bands(0)[0]+160, 160); -#else - webrtc::WebRtcAec_BufferFarend(aec, bufOut->fbuf_const()->bands(0)[0], 160); - webrtc::WebRtcAec_BufferFarend(aec, bufOut->fbuf_const()->bands(0)[0]+160, 160); -#endif - aecMutex.Unlock(); + memcpy(frame.mutable_data(), samplesIn, 480*2); + apm->ProcessReverseStream(&frame); + memcpy(frame.mutable_data(), samplesIn+480, 480*2); + apm->ProcessReverseStream(&frame); didBufferFarend=true; + farendBufferPool->Reuse(reinterpret_cast(samplesIn)); } } } @@ -210,176 +144,54 @@ void EchoCanceller::Enable(bool enabled){ isOn=enabled; } -void EchoCanceller::ProcessInput(unsigned char* data, unsigned char* out, size_t len){ - int i; +void EchoCanceller::ProcessInput(int16_t* inOut, size_t numSamples, bool& hasVoice){ +#ifndef TGVOIP_NO_DSP if(!isOn || (!enableAEC && !enableAGC && !enableNS)){ - memcpy(out, data, len); return; } -#ifndef TGVOIP_NO_DSP - int16_t* samplesIn=(int16_t*)data; - int16_t* samplesOut=(int16_t*)out; - - webrtc::IFChannelBuffer* bufIn=(webrtc::IFChannelBuffer*) splittingFilterIn; - webrtc::IFChannelBuffer* bufOut=(webrtc::IFChannelBuffer*) splittingFilterOut; - - memcpy(bufIn->ibuf()->bands(0)[0], samplesIn, 960*2); - - ((webrtc::SplittingFilter*)splittingFilter)->Analysis(bufIn, bufOut); - -#ifndef TGVOIP_USE_DESKTOP_DSP - if(enableAEC && enableNS){ - int16_t _nsOut[3][320]; - int16_t* nsIn[3]; - int16_t* nsOut[3]; - for(i=0;i<3;i++){ - nsIn[i]=(int16_t*)bufOut->ibuf_const()->bands(0)[i]; - nsOut[i]=_nsOut[i]; - } - WebRtcNsx_Process((NsxHandle*)ns, (const short *const *) nsIn, 3, nsOut); - for(i=0;i<3;i++){ - nsOut[i]+=160; - nsIn[i]+=160; - } - WebRtcNsx_Process((NsxHandle*)ns, (const short *const *) nsIn, 3, nsOut); - - memcpy(bufOut->ibuf()->bands(0)[1], _nsOut[1], 320*2*2); - - aecMutex.Lock(); - WebRtcAecm_Process(aec, bufOut->ibuf()->bands(0)[0], _nsOut[0], samplesOut, AEC_FRAME_SIZE, (int16_t) tgvoip::audio::AudioOutput::GetEstimatedDelay()); - WebRtcAecm_Process(aec, bufOut->ibuf()->bands(0)[0]+160, _nsOut[0]+160, samplesOut+160, AEC_FRAME_SIZE, (int16_t) (tgvoip::audio::AudioOutput::GetEstimatedDelay()+audio::AudioInput::GetEstimatedDelay())); - aecMutex.Unlock(); - memcpy(bufOut->ibuf()->bands(0)[0], samplesOut, 320*2); - }else if(enableAEC){ - aecMutex.Lock(); - WebRtcAecm_Process(aec, bufOut->ibuf()->bands(0)[0], NULL, samplesOut, AEC_FRAME_SIZE, (int16_t) tgvoip::audio::AudioOutput::GetEstimatedDelay()); - WebRtcAecm_Process(aec, bufOut->ibuf()->bands(0)[0]+160, NULL, samplesOut+160, AEC_FRAME_SIZE, (int16_t) (tgvoip::audio::AudioOutput::GetEstimatedDelay()+audio::AudioInput::GetEstimatedDelay())); - aecMutex.Unlock(); - memcpy(bufOut->ibuf()->bands(0)[0], samplesOut, 320*2); - }else if(enableNS){ - int16_t _nsOut[3][320]; - int16_t* nsIn[3]; - int16_t* nsOut[3]; - for(i=0;i<3;i++){ - nsIn[i]=(int16_t*)bufOut->ibuf_const()->bands(0)[i]; - nsOut[i]=_nsOut[i]; - } - WebRtcNsx_Process((NsxHandle*)ns, (const short *const *) nsIn, 3, nsOut); - for(i=0;i<3;i++){ - nsOut[i]+=160; - nsIn[i]+=160; - } - WebRtcNsx_Process((NsxHandle*)ns, (const short *const *) nsIn, 3, nsOut); - - memcpy(bufOut->ibuf()->bands(0)[0], _nsOut[0], 320*2); - memcpy(bufOut->ibuf()->bands(0)[1], _nsOut[1], 320*2); - memcpy(bufOut->ibuf()->bands(0)[2], _nsOut[2], 320*2); - } -#else - /*if(enableNS){ - float _nsOut[3][320]; - const float* nsIn[3]; - float* nsOut[3]; - for(i=0;i<3;i++){ - nsIn[i]=bufOut->fbuf_const()->bands(0)[i]; - nsOut[i]=_nsOut[i]; - } - WebRtcNs_Process((NsHandle*)ns, nsIn, 3, nsOut); - for(i=0;i<3;i++){ - nsOut[i]+=160; - nsIn[i]+=160; - } - WebRtcNs_Process((NsHandle*)ns, nsIn, 3, nsOut); - - memcpy(bufOut->fbuf()->bands(0)[0], _nsOut[0], 320*4); - memcpy(bufOut->fbuf()->bands(0)[1], _nsOut[1], 320*4); - memcpy(bufOut->fbuf()->bands(0)[2], _nsOut[2], 320*4); - }*/ - if(enableNS){ - int16_t _nsOut[3][320]; - int16_t* nsIn[3]; - int16_t* nsOut[3]; - for(i=0;i<3;i++){ - nsIn[i]=(int16_t*)bufOut->ibuf_const()->bands(0)[i]; - nsOut[i]=_nsOut[i]; - } - WebRtcNsx_Process((NsxHandle*)ns, (const short *const *)nsIn, 3, nsOut); - for(i=0;i<3;i++){ - nsOut[i]+=160; - nsIn[i]+=160; - } - WebRtcNsx_Process((NsxHandle*)ns, (const short *const *)nsIn, 3, nsOut); - - memcpy(bufOut->ibuf()->bands(0)[0], _nsOut[0], 320*2); - memcpy(bufOut->ibuf()->bands(0)[1], _nsOut[1], 320*2); - memcpy(bufOut->ibuf()->bands(0)[2], _nsOut[2], 320*2); - } - - if(enableAEC){ - const float* aecIn[3]; - float* aecOut[3]; - float _aecOut[3][320]; - for(i=0;i<3;i++){ - aecIn[i]=bufOut->fbuf_const()->bands(0)[i]; - aecOut[i]=_aecOut[i]; - } - webrtc::WebRtcAec_Process(aec, aecIn, 3, aecOut, AEC_FRAME_SIZE, audio::AudioOutput::GetEstimatedDelay()+audio::AudioInput::GetEstimatedDelay(), 0); - for(i=0;i<3;i++){ - aecOut[i]+=160; - aecIn[i]+=160; - } - webrtc::WebRtcAec_Process(aec, aecIn, 3, aecOut, AEC_FRAME_SIZE, audio::AudioOutput::GetEstimatedDelay()+audio::AudioInput::GetEstimatedDelay(), 0); - //outstandingFarendFrames--; - //LOGV("Process: %d frames", outstandingFarendFrames); - - memcpy(bufOut->fbuf()->bands(0)[0], _aecOut[0], 320*4); - memcpy(bufOut->fbuf()->bands(0)[1], _aecOut[1], 320*4); - memcpy(bufOut->fbuf()->bands(0)[2], _aecOut[2], 320*4); - } -#endif - - if(enableAGC){ - int16_t _agcOut[3][320]; - int16_t* agcIn[3]; - int16_t* agcOut[3]; - for(i=0;i<3;i++){ - agcIn[i]=(int16_t*)bufOut->ibuf_const()->bands(0)[i]; - agcOut[i]=_agcOut[i]; - } - uint8_t saturation; - WebRtcAgc_AddMic(agc, agcIn, 3, 160); - WebRtcAgc_Process(agc, (const int16_t *const *) agcIn, 3, 160, agcOut, agcMicLevel, &agcMicLevel, 0, &saturation); - for(i=0;i<3;i++){ - agcOut[i]+=160; - agcIn[i]+=160; - } - WebRtcAgc_AddMic(agc, agcIn, 3, 160); - WebRtcAgc_Process(agc, (const int16_t *const *) agcIn, 3, 160, agcOut, agcMicLevel, &agcMicLevel, 0, &saturation); - //LOGV("AGC mic level %d", agcMicLevel); - memcpy(bufOut->ibuf()->bands(0)[0], _agcOut[0], 320*2); - memcpy(bufOut->ibuf()->bands(0)[1], _agcOut[1], 320*2); - memcpy(bufOut->ibuf()->bands(0)[2], _agcOut[2], 320*2); - } - - ((webrtc::SplittingFilter*)splittingFilter)->Synthesis(bufOut, bufIn); - - memcpy(samplesOut, bufIn->ibuf_const()->bands(0)[0], 960*2); + int delay=audio::AudioInput::GetEstimatedDelay()+audio::AudioOutput::GetEstimatedDelay(); + assert(numSamples==960); + + memcpy(audioFrame->mutable_data(), inOut, 480*2); + if(enableAEC) + apm->set_stream_delay_ms(delay); + apm->ProcessStream(audioFrame); + if(enableVAD) + hasVoice=apm->voice_detection()->stream_has_voice(); + memcpy(inOut, audioFrame->data(), 480*2); + memcpy(audioFrame->mutable_data(), inOut+480, 480*2); + if(enableAEC) + apm->set_stream_delay_ms(delay); + apm->ProcessStream(audioFrame); + if(enableVAD){ + hasVoice=hasVoice || apm->voice_detection()->stream_has_voice(); + } + memcpy(inOut+480, audioFrame->data(), 480*2); #endif } void EchoCanceller::SetAECStrength(int strength){ #ifndef TGVOIP_NO_DSP - if(aec){ + /*if(aec){ #ifndef TGVOIP_USE_DESKTOP_DSP AecmConfig cfg; cfg.cngMode=AecmFalse; cfg.echoMode=(int16_t) strength; WebRtcAecm_set_config(aec, cfg); #endif - } + }*/ +#endif +} + +void EchoCanceller::SetVoiceDetectionEnabled(bool enabled){ + enableVAD=enabled; +#ifndef TGVOIP_NO_DSP + apm->voice_detection()->Enable(enabled); #endif } +using namespace tgvoip::effects; + AudioEffect::~AudioEffect(){ } @@ -388,73 +200,41 @@ void AudioEffect::SetPassThrough(bool passThrough){ this->passThrough=passThrough; } -AutomaticGainControl::AutomaticGainControl(){ -#ifndef TGVOIP_NO_DSP - splittingFilter=new webrtc::SplittingFilter(1, 3, 960); - splittingFilterIn=new webrtc::IFChannelBuffer(960, 1, 1); - splittingFilterOut=new webrtc::IFChannelBuffer(960, 1, 3); - - agc=WebRtcAgc_Create(); - WebRtcAgcConfig agcConfig; - agcConfig.compressionGaindB = 9; - agcConfig.limiterEnable = 1; - agcConfig.targetLevelDbfs = 3; - WebRtcAgc_Init(agc, 0, 255, kAgcModeAdaptiveDigital, 48000); - WebRtcAgc_set_config(agc, agcConfig); - agcMicLevel=0; -#endif -} +Volume::Volume(){ -AutomaticGainControl::~AutomaticGainControl(){ -#ifndef TGVOIP_NO_DSP - delete (webrtc::SplittingFilter*)splittingFilter; - delete (webrtc::IFChannelBuffer*)splittingFilterIn; - delete (webrtc::IFChannelBuffer*)splittingFilterOut; - WebRtcAgc_Free(agc); -#endif } -void AutomaticGainControl::Process(int16_t *inOut, size_t numSamples){ -#ifndef TGVOIP_NO_DSP - if(passThrough) - return; - if(numSamples!=960){ - LOGW("AutomaticGainControl only works on 960-sample buffers (got %u samples)", (unsigned int)numSamples); - return; - } - //LOGV("processing frame through AGC"); - - webrtc::IFChannelBuffer* bufIn=(webrtc::IFChannelBuffer*) splittingFilterIn; - webrtc::IFChannelBuffer* bufOut=(webrtc::IFChannelBuffer*) splittingFilterOut; - - memcpy(bufIn->ibuf()->bands(0)[0], inOut, 960*2); +Volume::~Volume(){ - ((webrtc::SplittingFilter*)splittingFilter)->Analysis(bufIn, bufOut); +} - int i; - int16_t _agcOut[3][320]; - int16_t* agcIn[3]; - int16_t* agcOut[3]; - for(i=0;i<3;i++){ - agcIn[i]=(int16_t*)bufOut->ibuf_const()->bands(0)[i]; - agcOut[i]=_agcOut[i]; +void Volume::Process(int16_t* inOut, size_t numSamples){ + if(level==1.0f || passThrough){ + return; } - uint8_t saturation; - WebRtcAgc_AddMic(agc, agcIn, 3, 160); - WebRtcAgc_Process(agc, (const int16_t *const *) agcIn, 3, 160, agcOut, agcMicLevel, &agcMicLevel, 0, &saturation); - for(i=0;i<3;i++){ - agcOut[i]+=160; - agcIn[i]+=160; + for(size_t i=0;i32767.0f) + inOut[i]=INT16_MAX; + else if(sample<-32768.0f) + inOut[i]=INT16_MIN; + else + inOut[i]=(int16_t)sample; } - WebRtcAgc_AddMic(agc, agcIn, 3, 160); - WebRtcAgc_Process(agc, (const int16_t *const *) agcIn, 3, 160, agcOut, agcMicLevel, &agcMicLevel, 0, &saturation); - memcpy(bufOut->ibuf()->bands(0)[0], _agcOut[0], 320*2); - memcpy(bufOut->ibuf()->bands(0)[1], _agcOut[1], 320*2); - memcpy(bufOut->ibuf()->bands(0)[2], _agcOut[2], 320*2); - - ((webrtc::SplittingFilter*)splittingFilter)->Synthesis(bufOut, bufIn); +} - memcpy(inOut, bufIn->ibuf_const()->bands(0)[0], 960*2); -#endif +void Volume::SetLevel(float level){ + this->level=level; + float db; + if(level<1.0f) + db=-50.0f*(1.0f-level); + else if(level>1.0f && level<=2.0f) + db=10.0f*(level-1.0f); + else + db=0.0f; + multiplier=expf(db/20.0f * logf(10.0f)); } +float Volume::GetLevel(){ + return level; +} diff --git a/libtgvoip/EchoCanceller.h b/libtgvoip/EchoCanceller.h index c80eeff..5f26e1a 100755 --- a/libtgvoip/EchoCanceller.h +++ b/libtgvoip/EchoCanceller.h @@ -11,69 +11,73 @@ #include "Buffers.h" #include "BlockingQueue.h" #include "MediaStreamItf.h" +#include "utils.h" + +namespace webrtc{ + class AudioProcessing; + class AudioFrame; +} namespace tgvoip{ class EchoCanceller{ public: + TGVOIP_DISALLOW_COPY_AND_ASSIGN(EchoCanceller); EchoCanceller(bool enableAEC, bool enableNS, bool enableAGC); virtual ~EchoCanceller(); virtual void Start(); virtual void Stop(); void SpeakerOutCallback(unsigned char* data, size_t len); void Enable(bool enabled); - void ProcessInput(unsigned char* data, unsigned char* out, size_t len); + void ProcessInput(int16_t* inOut, size_t numSamples, bool& hasVoice); void SetAECStrength(int strength); + void SetVoiceDetectionEnabled(bool enabled); private: bool enableAEC; bool enableAGC; bool enableNS; + bool enableVAD=false; bool isOn; #ifndef TGVOIP_NO_DSP - void RunBufferFarendThread(void* arg); + webrtc::AudioProcessing* apm=NULL; + webrtc::AudioFrame* audioFrame=NULL; + void RunBufferFarendThread(); bool didBufferFarend; - Mutex aecMutex; - void* aec; - void* splittingFilter; // webrtc::SplittingFilter - void* splittingFilterIn; // webrtc::IFChannelBuffer - void* splittingFilterOut; // webrtc::IFChannelBuffer - void* splittingFilterFarend; // webrtc::SplittingFilter - void* splittingFilterFarendIn; // webrtc::IFChannelBuffer - void* splittingFilterFarendOut; // webrtc::IFChannelBuffer Thread* bufferFarendThread; BlockingQueue* farendQueue; BufferPool* farendBufferPool; bool running; - void* ns; // NsxHandle - void* agc; - int32_t agcMicLevel; - //int32_t outstandingFarendFrames=0; #endif }; - class AudioEffect{ - public: - virtual ~AudioEffect()=0; - virtual void Process(int16_t* inOut, size_t numSamples)=0; - virtual void SetPassThrough(bool passThrough); - protected: - bool passThrough; - }; +namespace effects{ - class AutomaticGainControl : public AudioEffect{ - public: - AutomaticGainControl(); - virtual ~AutomaticGainControl(); - virtual void Process(int16_t* inOut, size_t numSamples); +class AudioEffect{ +public: + virtual ~AudioEffect()=0; + virtual void Process(int16_t* inOut, size_t numSamples)=0; + virtual void SetPassThrough(bool passThrough); +protected: + bool passThrough=false; +}; - private: - void* agc; - void* splittingFilter; - void* splittingFilterIn; - void* splittingFilterOut; - int32_t agcMicLevel; - }; +class Volume : public AudioEffect{ +public: + Volume(); + virtual ~Volume(); + virtual void Process(int16_t* inOut, size_t numSamples); + /** + * Level is (0.0, 2.0] + */ + void SetLevel(float level); + float GetLevel(); +private: + float level=1.0f; + float multiplier=1.0f; }; +} +} + #endif //LIBTGVOIP_ECHOCANCELLER_H diff --git a/libtgvoip/JitterBuffer.cpp b/libtgvoip/JitterBuffer.cpp old mode 100644 new mode 100755 index 91ad37c..18bf2ad --- a/libtgvoip/JitterBuffer.cpp +++ b/libtgvoip/JitterBuffer.cpp @@ -26,7 +26,7 @@ JitterBuffer::JitterBuffer(MediaStreamItf *out, uint32_t step):bufferPool(JITTER maxMinDelay=(uint32_t) ServerConfig::GetSharedInstance()->GetInt("jitter_max_delay_40", 15); maxUsedSlots=(uint32_t) ServerConfig::GetSharedInstance()->GetInt("jitter_max_slots_40", 30); }else{ - minMinDelay=(uint32_t) ServerConfig::GetSharedInstance()->GetInt("jitter_min_delay_60", 1); + minMinDelay=(uint32_t) ServerConfig::GetSharedInstance()->GetInt("jitter_min_delay_60", 2); maxMinDelay=(uint32_t) ServerConfig::GetSharedInstance()->GetInt("jitter_max_delay_60", 10); maxUsedSlots=(uint32_t) ServerConfig::GetSharedInstance()->GetInt("jitter_max_slots_60", 20); } @@ -51,14 +51,14 @@ JitterBuffer::~JitterBuffer(){ } void JitterBuffer::SetMinPacketCount(uint32_t count){ - if(minDelay==count) - return; + LOGI("jitter: set min packet count %u", count); minDelay=count; + minMinDelay=count; //Reset(); } int JitterBuffer::GetMinPacketCount(){ - return minDelay; + return (int)minDelay; } size_t JitterBuffer::CallbackIn(unsigned char *data, size_t len, void *param){ @@ -110,6 +110,26 @@ size_t JitterBuffer::HandleOutput(unsigned char *buffer, size_t len, int offsetI pkt.buffer=buffer; pkt.size=len; MutexGuard m(mutex); + if(first){ + first=false; + unsigned int delay=GetCurrentDelay(); + if(GetCurrentDelay()>5){ + LOGW("jitter: delay too big upon start (%u), dropping packets", delay); + while(delay>GetMinPacketCount()){ + for(int i=0;itimestamp)-step*minDelay; + nextTimestamp=(int64_t)(((int64_t)pkt->timestamp)-step*minDelay); + first=true; LOGI("jitter: resyncing, next timestamp = %lld (step=%d, minDelay=%f)", (long long int)nextTimestamp, step, minDelay); } @@ -351,7 +372,7 @@ void JitterBuffer::Tick(){ if(stddevDelay>maxMinDelay) stddevDelay=maxMinDelay; if(stddevDelay!=minDelay){ - int32_t diff=stddevDelay-minDelay; + int32_t diff=(int32_t)(stddevDelay-minDelay); if(diff>0){ dontDecMinDelay=100; } diff --git a/libtgvoip/JitterBuffer.h b/libtgvoip/JitterBuffer.h index 8e185d5..ddbe447 100644 --- a/libtgvoip/JitterBuffer.h +++ b/libtgvoip/JitterBuffer.h @@ -42,7 +42,7 @@ class JitterBuffer{ private: struct jitter_packet_t{ - unsigned char* buffer; + unsigned char* buffer=NULL; size_t size; uint32_t timestamp; bool isEC; @@ -87,6 +87,7 @@ class JitterBuffer{ int outstandingDelayChange=0; unsigned int dontChangeDelay=0; double avgDelay=0; + bool first=true; #ifdef TGVOIP_DUMP_JITTER_STATS FILE* dump; #endif diff --git a/libtgvoip/Makefile.am b/libtgvoip/Makefile.am index 0bef64a..91b2d33 100644 --- a/libtgvoip/Makefile.am +++ b/libtgvoip/Makefile.am @@ -22,7 +22,10 @@ audio/AudioIO.cpp \ audio/AudioInput.cpp \ audio/AudioOutput.cpp \ audio/Resampler.cpp \ -os/posix/NetworkSocketPosix.cpp +os/posix/NetworkSocketPosix.cpp \ +video/VideoSource.cpp \ +video/VideoRenderer.cpp \ +json11.cpp TGVOIP_HDRS = \ VoIPController.h \ @@ -45,7 +48,11 @@ audio/AudioIO.h \ audio/AudioInput.h \ audio/AudioOutput.h \ audio/Resampler.h \ -os/posix/NetworkSocketPosix.h +os/posix/NetworkSocketPosix.h \ +video/VideoSource.h \ +video/VideoRenderer.h \ +json11.hpp \ +utils.h if TARGET_OS_OSX @@ -92,73 +99,287 @@ endif endif if ENABLE_DSP -CFLAGS += -DWEBRTC_POSIX -DWEBRTC_APM_DEBUG_DUMP=0 -I$(top_srcdir)/webrtc_dsp +CFLAGS += -DWEBRTC_POSIX -DWEBRTC_APM_DEBUG_DUMP=0 -DWEBRTC_NS_FLOAT -I$(top_srcdir)/webrtc_dsp CCASFLAGS += -I$(top_srcdir)/webrtc_dsp SRC += \ -webrtc_dsp/webrtc/common_audio/ring_buffer.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/auto_corr_to_refl_coef.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/auto_correlation.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/complex_fft.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/copy_set_operations.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/cross_correlation.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/division_operations.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/dot_product_with_scale.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/downsample_fast.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/energy.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/filter_ar.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/filter_ar_fast_q12.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/filter_ma_fast_q12.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/get_hanning_window.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/get_scaling_square.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/ilbc_specific_functions.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/levinson_durbin.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/lpc_to_refl_coef.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/min_max_operations.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/randomization_functions.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/real_fft.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/refl_coef_to_lpc.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/resample.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/resample_48khz.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2_internal.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/resample_fractional.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/spl_init.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/spl_inl.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/splitting_filter_impl.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/sqrt_of_one_minus_x_squared.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/vector_scaling_operations.c - -SRC += \ -webrtc_dsp/webrtc/base/checks.cc \ -webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core.cc \ -webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core_c.cc \ -webrtc_dsp/webrtc/modules/audio_processing/aecm/echo_control_mobile.cc \ -webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator.cc \ -webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_wrapper.cc \ -webrtc_dsp/webrtc/modules/audio_processing/three_band_filter_bank.cc \ -webrtc_dsp/webrtc/modules/audio_processing/splitting_filter.cc \ -webrtc_dsp/webrtc/system_wrappers/source/cpu_features.cc \ -webrtc_dsp/webrtc/common_audio/sparse_fir_filter.cc \ -webrtc_dsp/webrtc/common_audio/channel_buffer.cc \ -webrtc_dsp/webrtc/common_audio/audio_util.cc +./webrtc_dsp/system_wrappers/source/field_trial.cc \ +./webrtc_dsp/system_wrappers/source/metrics.cc \ +./webrtc_dsp/system_wrappers/source/cpu_features.cc \ +./webrtc_dsp/absl/strings/internal/memutil.cc \ +./webrtc_dsp/absl/strings/string_view.cc \ +./webrtc_dsp/absl/strings/ascii.cc \ +./webrtc_dsp/absl/types/bad_optional_access.cc \ +./webrtc_dsp/absl/types/optional.cc \ +./webrtc_dsp/absl/base/internal/raw_logging.cc \ +./webrtc_dsp/absl/base/internal/throw_delegate.cc \ +./webrtc_dsp/rtc_base/race_checker.cc \ +./webrtc_dsp/rtc_base/strings/string_builder.cc \ +./webrtc_dsp/rtc_base/memory/aligned_malloc.cc \ +./webrtc_dsp/rtc_base/timeutils.cc \ +./webrtc_dsp/rtc_base/platform_file.cc \ +./webrtc_dsp/rtc_base/string_to_number.cc \ +./webrtc_dsp/rtc_base/thread_checker_impl.cc \ +./webrtc_dsp/rtc_base/stringencode.cc \ +./webrtc_dsp/rtc_base/stringutils.cc \ +./webrtc_dsp/rtc_base/checks.cc \ +./webrtc_dsp/rtc_base/platform_thread.cc \ +./webrtc_dsp/rtc_base/logging_webrtc.cc \ +./webrtc_dsp/rtc_base/criticalsection.cc \ +./webrtc_dsp/rtc_base/platform_thread_types.cc \ +./webrtc_dsp/rtc_base/event.cc \ +./webrtc_dsp/rtc_base/event_tracer.cc \ +./webrtc_dsp/third_party/rnnoise/src/rnn_vad_weights.cc \ +./webrtc_dsp/third_party/rnnoise/src/kiss_fft.cc \ +./webrtc_dsp/api/audio/audio_frame.cc \ +./webrtc_dsp/api/audio/echo_canceller3_config.cc \ +./webrtc_dsp/api/audio/echo_canceller3_factory.cc \ +./webrtc_dsp/modules/third_party/fft/fft.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_estimator.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines_logist.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filterbanks.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/transform.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_filter.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filter_functions.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/decode.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lattice.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/intialize.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_tables.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_analysis.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines_hist.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/entropy_coding.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac_vad.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/crc.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/decode_bwe.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.c \ +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac.c \ +./webrtc_dsp/modules/audio_processing/rms_level.cc \ +./webrtc_dsp/modules/audio_processing/echo_detector/normalized_covariance_estimator.cc \ +./webrtc_dsp/modules/audio_processing/echo_detector/moving_max.cc \ +./webrtc_dsp/modules/audio_processing/echo_detector/circular_buffer.cc \ +./webrtc_dsp/modules/audio_processing/echo_detector/mean_variance_estimator.cc \ +./webrtc_dsp/modules/audio_processing/splitting_filter.cc \ +./webrtc_dsp/modules/audio_processing/gain_control_impl.cc \ +./webrtc_dsp/modules/audio_processing/ns/nsx_core.c \ +./webrtc_dsp/modules/audio_processing/ns/noise_suppression_x.c \ +./webrtc_dsp/modules/audio_processing/ns/nsx_core_c.c \ +./webrtc_dsp/modules/audio_processing/ns/ns_core.c \ +./webrtc_dsp/modules/audio_processing/ns/noise_suppression.c \ +./webrtc_dsp/modules/audio_processing/audio_buffer.cc \ +./webrtc_dsp/modules/audio_processing/typing_detection.cc \ +./webrtc_dsp/modules/audio_processing/include/audio_processing_statistics.cc \ +./webrtc_dsp/modules/audio_processing/include/audio_generator_factory.cc \ +./webrtc_dsp/modules/audio_processing/include/aec_dump.cc \ +./webrtc_dsp/modules/audio_processing/include/audio_processing.cc \ +./webrtc_dsp/modules/audio_processing/include/config.cc \ +./webrtc_dsp/modules/audio_processing/agc2/interpolated_gain_curve.cc \ +./webrtc_dsp/modules/audio_processing/agc2/agc2_common.cc \ +./webrtc_dsp/modules/audio_processing/agc2/gain_applier.cc \ +./webrtc_dsp/modules/audio_processing/agc2/adaptive_agc.cc \ +./webrtc_dsp/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc \ +./webrtc_dsp/modules/audio_processing/agc2/limiter.cc \ +./webrtc_dsp/modules/audio_processing/agc2/saturation_protector.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features_internal.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/rnn.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search_internal.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/features_extraction.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/fft_util.cc \ +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/lp_residual.cc \ +./webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.cc \ +./webrtc_dsp/modules/audio_processing/agc2/vector_float_frame.cc \ +./webrtc_dsp/modules/audio_processing/agc2/noise_level_estimator.cc \ +./webrtc_dsp/modules/audio_processing/agc2/agc2_testing_common.cc \ +./webrtc_dsp/modules/audio_processing/agc2/fixed_digital_level_estimator.cc \ +./webrtc_dsp/modules/audio_processing/agc2/fixed_gain_controller.cc \ +./webrtc_dsp/modules/audio_processing/agc2/vad_with_level.cc \ +./webrtc_dsp/modules/audio_processing/agc2/limiter_db_gain_curve.cc \ +./webrtc_dsp/modules/audio_processing/agc2/down_sampler.cc \ +./webrtc_dsp/modules/audio_processing/agc2/signal_classifier.cc \ +./webrtc_dsp/modules/audio_processing/agc2/noise_spectrum_estimator.cc \ +./webrtc_dsp/modules/audio_processing/agc2/compute_interpolated_gain_curve.cc \ +./webrtc_dsp/modules/audio_processing/agc2/biquad_filter.cc \ +./webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator.cc \ +./webrtc_dsp/modules/audio_processing/transient/moving_moments.cc \ +./webrtc_dsp/modules/audio_processing/transient/wpd_tree.cc \ +./webrtc_dsp/modules/audio_processing/transient/wpd_node.cc \ +./webrtc_dsp/modules/audio_processing/transient/transient_suppressor.cc \ +./webrtc_dsp/modules/audio_processing/transient/transient_detector.cc \ +./webrtc_dsp/modules/audio_processing/low_cut_filter.cc \ +./webrtc_dsp/modules/audio_processing/level_estimator_impl.cc \ +./webrtc_dsp/modules/audio_processing/three_band_filter_bank.cc \ +./webrtc_dsp/modules/audio_processing/aec/echo_cancellation.cc \ +./webrtc_dsp/modules/audio_processing/aec/aec_resampler.cc \ +./webrtc_dsp/modules/audio_processing/aec/aec_core.cc \ +./webrtc_dsp/modules/audio_processing/voice_detection_impl.cc \ +./webrtc_dsp/modules/audio_processing/echo_cancellation_impl.cc \ +./webrtc_dsp/modules/audio_processing/gain_control_for_experimental_agc.cc \ +./webrtc_dsp/modules/audio_processing/agc/agc.cc \ +./webrtc_dsp/modules/audio_processing/agc/loudness_histogram.cc \ +./webrtc_dsp/modules/audio_processing/agc/agc_manager_direct.cc \ +./webrtc_dsp/modules/audio_processing/agc/legacy/analog_agc.c \ +./webrtc_dsp/modules/audio_processing/agc/legacy/digital_agc.c \ +./webrtc_dsp/modules/audio_processing/agc/utility.cc \ +./webrtc_dsp/modules/audio_processing/audio_processing_impl.cc \ +./webrtc_dsp/modules/audio_processing/audio_generator/file_audio_generator.cc \ +./webrtc_dsp/modules/audio_processing/gain_controller2.cc \ +./webrtc_dsp/modules/audio_processing/residual_echo_detector.cc \ +./webrtc_dsp/modules/audio_processing/noise_suppression_impl.cc \ +./webrtc_dsp/modules/audio_processing/aecm/aecm_core.cc \ +./webrtc_dsp/modules/audio_processing/aecm/aecm_core_c.cc \ +./webrtc_dsp/modules/audio_processing/aecm/echo_control_mobile.cc \ +./webrtc_dsp/modules/audio_processing/aec3/render_reverb_model.cc \ +./webrtc_dsp/modules/audio_processing/aec3/reverb_model_fallback.cc \ +./webrtc_dsp/modules/audio_processing/aec3/echo_remover_metrics.cc \ +./webrtc_dsp/modules/audio_processing/aec3/matched_filter_lag_aggregator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer2.cc \ +./webrtc_dsp/modules/audio_processing/aec3/echo_path_variability.cc \ +./webrtc_dsp/modules/audio_processing/aec3/frame_blocker.cc \ +./webrtc_dsp/modules/audio_processing/aec3/subtractor.cc \ +./webrtc_dsp/modules/audio_processing/aec3/aec3_fft.cc \ +./webrtc_dsp/modules/audio_processing/aec3/fullband_erle_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/suppression_filter.cc \ +./webrtc_dsp/modules/audio_processing/aec3/block_processor.cc \ +./webrtc_dsp/modules/audio_processing/aec3/subband_erle_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller_metrics.cc \ +./webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/vector_buffer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/erl_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/aec_state.cc \ +./webrtc_dsp/modules/audio_processing/aec3/adaptive_fir_filter.cc \ +./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller.cc \ +./webrtc_dsp/modules/audio_processing/aec3/skew_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/echo_path_delay_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/block_framer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/erle_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/reverb_model.cc \ +./webrtc_dsp/modules/audio_processing/aec3/cascaded_biquad_filter.cc \ +./webrtc_dsp/modules/audio_processing/aec3/render_buffer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/subtractor_output.cc \ +./webrtc_dsp/modules/audio_processing/aec3/stationarity_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/render_signal_analyzer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/subtractor_output_analyzer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/suppression_gain.cc \ +./webrtc_dsp/modules/audio_processing/aec3/echo_audibility.cc \ +./webrtc_dsp/modules/audio_processing/aec3/block_processor_metrics.cc \ +./webrtc_dsp/modules/audio_processing/aec3/moving_average.cc \ +./webrtc_dsp/modules/audio_processing/aec3/reverb_model_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/aec3_common.cc \ +./webrtc_dsp/modules/audio_processing/aec3/residual_echo_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/matched_filter.cc \ +./webrtc_dsp/modules/audio_processing/aec3/reverb_decay_estimator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller2.cc \ +./webrtc_dsp/modules/audio_processing/aec3/suppression_gain_limiter.cc \ +./webrtc_dsp/modules/audio_processing/aec3/main_filter_update_gain.cc \ +./webrtc_dsp/modules/audio_processing/aec3/echo_remover.cc \ +./webrtc_dsp/modules/audio_processing/aec3/downsampled_render_buffer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/matrix_buffer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/block_processor2.cc \ +./webrtc_dsp/modules/audio_processing/aec3/echo_canceller3.cc \ +./webrtc_dsp/modules/audio_processing/aec3/block_delay_buffer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/fft_buffer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/comfort_noise_generator.cc \ +./webrtc_dsp/modules/audio_processing/aec3/shadow_filter_update_gain.cc \ +./webrtc_dsp/modules/audio_processing/aec3/filter_analyzer.cc \ +./webrtc_dsp/modules/audio_processing/aec3/reverb_frequency_response.cc \ +./webrtc_dsp/modules/audio_processing/aec3/decimator.cc \ +./webrtc_dsp/modules/audio_processing/echo_control_mobile_impl.cc \ +./webrtc_dsp/modules/audio_processing/logging/apm_data_dumper.cc \ +./webrtc_dsp/modules/audio_processing/vad/voice_activity_detector.cc \ +./webrtc_dsp/modules/audio_processing/vad/standalone_vad.cc \ +./webrtc_dsp/modules/audio_processing/vad/pitch_internal.cc \ +./webrtc_dsp/modules/audio_processing/vad/vad_circular_buffer.cc \ +./webrtc_dsp/modules/audio_processing/vad/vad_audio_proc.cc \ +./webrtc_dsp/modules/audio_processing/vad/pole_zero_filter.cc \ +./webrtc_dsp/modules/audio_processing/vad/pitch_based_vad.cc \ +./webrtc_dsp/modules/audio_processing/vad/gmm.cc \ +./webrtc_dsp/modules/audio_processing/utility/ooura_fft.cc \ +./webrtc_dsp/modules/audio_processing/utility/delay_estimator_wrapper.cc \ +./webrtc_dsp/modules/audio_processing/utility/delay_estimator.cc \ +./webrtc_dsp/modules/audio_processing/utility/block_mean_calculator.cc \ +./webrtc_dsp/common_audio/window_generator.cc \ +./webrtc_dsp/common_audio/channel_buffer.cc \ +./webrtc_dsp/common_audio/fir_filter_factory.cc \ +./webrtc_dsp/common_audio/wav_header.cc \ +./webrtc_dsp/common_audio/real_fourier_ooura.cc \ +./webrtc_dsp/common_audio/audio_util.cc \ +./webrtc_dsp/common_audio/fir_filter_sse.cc \ +./webrtc_dsp/common_audio/resampler/push_sinc_resampler.cc \ +./webrtc_dsp/common_audio/resampler/resampler.cc \ +./webrtc_dsp/common_audio/resampler/sinc_resampler_sse.cc \ +./webrtc_dsp/common_audio/resampler/push_resampler.cc \ +./webrtc_dsp/common_audio/resampler/sinc_resampler.cc \ +./webrtc_dsp/common_audio/resampler/sinusoidal_linear_chirp_source.cc \ +./webrtc_dsp/common_audio/wav_file.cc \ +./webrtc_dsp/common_audio/third_party/fft4g/fft4g.c \ +./webrtc_dsp/common_audio/audio_converter.cc \ +./webrtc_dsp/common_audio/real_fourier.cc \ +./webrtc_dsp/common_audio/sparse_fir_filter.cc \ +./webrtc_dsp/common_audio/smoothing_filter.cc \ +./webrtc_dsp/common_audio/fir_filter_c.cc \ +./webrtc_dsp/common_audio/ring_buffer.c \ +./webrtc_dsp/common_audio/signal_processing/complex_fft.c \ +./webrtc_dsp/common_audio/signal_processing/filter_ma_fast_q12.c \ +./webrtc_dsp/common_audio/signal_processing/splitting_filter1.c \ +./webrtc_dsp/common_audio/signal_processing/levinson_durbin.c \ +./webrtc_dsp/common_audio/signal_processing/dot_product_with_scale.cc \ +./webrtc_dsp/common_audio/signal_processing/auto_corr_to_refl_coef.c \ +./webrtc_dsp/common_audio/signal_processing/resample_by_2_internal.c \ +./webrtc_dsp/common_audio/signal_processing/energy.c \ +./webrtc_dsp/common_audio/signal_processing/sqrt_of_one_minus_x_squared.c \ +./webrtc_dsp/common_audio/signal_processing/downsample_fast.c \ +./webrtc_dsp/common_audio/signal_processing/filter_ar_fast_q12.c \ +./webrtc_dsp/common_audio/signal_processing/spl_init.c \ +./webrtc_dsp/common_audio/signal_processing/lpc_to_refl_coef.c \ +./webrtc_dsp/common_audio/signal_processing/cross_correlation.c \ +./webrtc_dsp/common_audio/signal_processing/division_operations.c \ +./webrtc_dsp/common_audio/signal_processing/auto_correlation.c \ +./webrtc_dsp/common_audio/signal_processing/get_scaling_square.c \ +./webrtc_dsp/common_audio/signal_processing/resample.c \ +./webrtc_dsp/common_audio/signal_processing/min_max_operations.c \ +./webrtc_dsp/common_audio/signal_processing/refl_coef_to_lpc.c \ +./webrtc_dsp/common_audio/signal_processing/filter_ar.c \ +./webrtc_dsp/common_audio/signal_processing/vector_scaling_operations.c \ +./webrtc_dsp/common_audio/signal_processing/resample_fractional.c \ +./webrtc_dsp/common_audio/signal_processing/real_fft.c \ +./webrtc_dsp/common_audio/signal_processing/ilbc_specific_functions.c \ +./webrtc_dsp/common_audio/signal_processing/randomization_functions.c \ +./webrtc_dsp/common_audio/signal_processing/copy_set_operations.c \ +./webrtc_dsp/common_audio/signal_processing/resample_by_2.c \ +./webrtc_dsp/common_audio/signal_processing/get_hanning_window.c \ +./webrtc_dsp/common_audio/signal_processing/resample_48khz.c \ +./webrtc_dsp/common_audio/signal_processing/spl_inl.c \ +./webrtc_dsp/common_audio/signal_processing/spl_sqrt.c \ +./webrtc_dsp/common_audio/vad/vad_sp.c \ +./webrtc_dsp/common_audio/vad/vad.cc \ +./webrtc_dsp/common_audio/vad/webrtc_vad.c \ +./webrtc_dsp/common_audio/vad/vad_filterbank.c \ +./webrtc_dsp/common_audio/vad/vad_core.c \ +./webrtc_dsp/common_audio/vad/vad_gmm.c +if TARGET_OS_OSX +CFLAGS += -DWEBRTC_MAC SRC += \ -webrtc_dsp/webrtc/modules/audio_processing/utility/block_mean_calculator.cc \ -webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft.cc \ -webrtc_dsp/webrtc/modules/audio_processing/logging/apm_data_dumper.cc \ -webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core.cc \ -webrtc_dsp/webrtc/modules/audio_processing/aec/aec_resampler.cc \ -webrtc_dsp/webrtc/modules/audio_processing/aec/echo_cancellation.cc \ -webrtc_dsp/webrtc/common_audio/wav_header.cc \ -webrtc_dsp/webrtc/common_audio/wav_file.cc \ -webrtc_dsp/webrtc/base/stringutils.cc +webrtc_dsp/rtc_base/logging_mac.mm \ +webrtc_dsp/rtc_base/logging_mac.h +else +CFLAGS += -DWEBRTC_LINUX +endif if TARGET_CPU_X86 SRC += \ -webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_sse2.cc \ -webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc +webrtc_dsp/modules/audio_processing/aec/aec_core_sse2.cc \ +webrtc_dsp/modules/audio_processing/utility/ooura_fft_sse2.cc endif if ENABLE_AUDIO_CALLBACK @@ -171,99 +392,347 @@ endif if TARGET_CPU_ARM SRC += \ -webrtc_dsp/webrtc/common_audio/signal_processing/complex_bit_reverse_arm.S \ -webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt_floor_arm.S +webrtc_dsp/common_audio/signal_processing/complex_bit_reverse_arm.S \ +webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor_arm.S if TARGET_CPU_ARMV7 CFLAGS += -mfpu=neon -mfloat-abi=hard CCASFLAGS += -mfpu=neon -mfloat-abi=hard SRC += \ -webrtc_dsp/webrtc/common_audio/signal_processing/cross_correlation_neon.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/downsample_fast_neon.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/min_max_operations_neon.c \ -webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_neon.cc \ -webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core_neon.cc \ -webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core_neon.c \ -webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_neon.cc -# webrtc_dsp/webrtc/common_audio/signal_processing/filter_ar_fast_q12_armv7.S +webrtc_dsp/common_audio/signal_processing/cross_correlation_neon.c \ +webrtc_dsp/common_audio/signal_processing/downsample_fast_neon.c \ +webrtc_dsp/common_audio/signal_processing/min_max_operations_neon.c \ +webrtc_dsp/modules/audio_processing/aec/aec_core_neon.cc \ +webrtc_dsp/modules/audio_processing/aecm/aecm_core_neon.cc \ +webrtc_dsp/modules/audio_processing/ns/nsx_core_neon.c \ +webrtc_dsp/modules/audio_processing/utility/ooura_fft_neon.cc +# webrtc_dsp/common_audio/signal_processing/filter_ar_fast_q12_armv7.S endif else SRC += \ -webrtc_dsp/webrtc/common_audio/signal_processing/complex_bit_reverse.c \ -webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt_floor.c +webrtc_dsp/common_audio/signal_processing/complex_bit_reverse.c \ +webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor.c endif -SRC += \ -webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression_x.c \ -webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression.c \ -webrtc_dsp/webrtc/modules/audio_processing/ns/ns_core.c \ -webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core_c.c \ -webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core.c \ -webrtc_dsp/webrtc/common_audio/fft4g.c - -SRC += \ -webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/analog_agc.c \ -webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/digital_agc.c - # headers SRC += \ -webrtc_dsp/webrtc/base/array_view.h \ -webrtc_dsp/webrtc/base/atomicops.h \ -webrtc_dsp/webrtc/base/basictypes.h \ -webrtc_dsp/webrtc/base/checks.h \ -webrtc_dsp/webrtc/base/constructormagic.h \ -webrtc_dsp/webrtc/base/safe_compare.h \ -webrtc_dsp/webrtc/base/safe_conversions.h \ -webrtc_dsp/webrtc/base/safe_conversions_impl.h \ -webrtc_dsp/webrtc/base/sanitizer.h \ -webrtc_dsp/webrtc/base/stringutils.h \ -webrtc_dsp/webrtc/base/type_traits.h \ -webrtc_dsp/webrtc/common_audio/channel_buffer.h \ -webrtc_dsp/webrtc/common_audio/fft4g.h \ -webrtc_dsp/webrtc/common_audio/include/audio_util.h \ -webrtc_dsp/webrtc/common_audio/ring_buffer.h \ -webrtc_dsp/webrtc/common_audio/signal_processing/complex_fft_tables.h \ -webrtc_dsp/webrtc/common_audio/signal_processing/include/real_fft.h \ -webrtc_dsp/webrtc/common_audio/signal_processing/include/signal_processing_library.h \ -webrtc_dsp/webrtc/common_audio/signal_processing/include/spl_inl.h \ -webrtc_dsp/webrtc/common_audio/signal_processing/include/spl_inl_armv7.h \ -webrtc_dsp/webrtc/common_audio/signal_processing/include/spl_inl_mips.h \ -webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2_internal.h \ -webrtc_dsp/webrtc/common_audio/sparse_fir_filter.h \ -webrtc_dsp/webrtc/common_audio/wav_file.h \ -webrtc_dsp/webrtc/common_audio/wav_header.h \ -webrtc_dsp/webrtc/modules/audio_processing/aec/aec_common.h \ -webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core.h \ -webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_optimized_methods.h \ -webrtc_dsp/webrtc/modules/audio_processing/aec/aec_resampler.h \ -webrtc_dsp/webrtc/modules/audio_processing/aec/echo_cancellation.h \ -webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core.h \ -webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_defines.h \ -webrtc_dsp/webrtc/modules/audio_processing/aecm/echo_control_mobile.h \ -webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/analog_agc.h \ -webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/digital_agc.h \ -webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/gain_control.h \ -webrtc_dsp/webrtc/modules/audio_processing/logging/apm_data_dumper.h \ -webrtc_dsp/webrtc/modules/audio_processing/ns/defines.h \ -webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression.h \ -webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression_x.h \ -webrtc_dsp/webrtc/modules/audio_processing/ns/ns_core.h \ -webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core.h \ -webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_defines.h \ -webrtc_dsp/webrtc/modules/audio_processing/ns/windows_private.h \ -webrtc_dsp/webrtc/modules/audio_processing/splitting_filter.h \ -webrtc_dsp/webrtc/modules/audio_processing/three_band_filter_bank.h \ -webrtc_dsp/webrtc/modules/audio_processing/utility/block_mean_calculator.h \ -webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator.h \ -webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_internal.h \ -webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h \ -webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft.h \ -webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_tables_common.h \ -webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_tables_neon_sse2.h \ -webrtc_dsp/webrtc/system_wrappers/include/asm_defines.h \ -webrtc_dsp/webrtc/system_wrappers/include/compile_assert_c.h \ -webrtc_dsp/webrtc/system_wrappers/include/cpu_features_wrapper.h \ -webrtc_dsp/webrtc/system_wrappers/include/metrics.h \ -webrtc_dsp/webrtc/typedefs.h +webrtc_dsp/system_wrappers/include/field_trial.h \ +webrtc_dsp/system_wrappers/include/cpu_features_wrapper.h \ +webrtc_dsp/system_wrappers/include/asm_defines.h \ +webrtc_dsp/system_wrappers/include/metrics.h \ +webrtc_dsp/system_wrappers/include/compile_assert_c.h \ +webrtc_dsp/typedefs.h \ +webrtc_dsp/absl/strings/internal/memutil.h \ +webrtc_dsp/absl/strings/ascii.h \ +webrtc_dsp/absl/strings/string_view.h \ +webrtc_dsp/absl/types/optional.h \ +webrtc_dsp/absl/types/bad_optional_access.h \ +webrtc_dsp/absl/memory/memory.h \ +webrtc_dsp/absl/meta/type_traits.h \ +webrtc_dsp/absl/algorithm/algorithm.h \ +webrtc_dsp/absl/container/inlined_vector.h \ +webrtc_dsp/absl/base/policy_checks.h \ +webrtc_dsp/absl/base/port.h \ +webrtc_dsp/absl/base/config.h \ +webrtc_dsp/absl/base/internal/invoke.h \ +webrtc_dsp/absl/base/internal/inline_variable.h \ +webrtc_dsp/absl/base/internal/atomic_hook.h \ +webrtc_dsp/absl/base/internal/identity.h \ +webrtc_dsp/absl/base/internal/raw_logging.h \ +webrtc_dsp/absl/base/internal/throw_delegate.h \ +webrtc_dsp/absl/base/attributes.h \ +webrtc_dsp/absl/base/macros.h \ +webrtc_dsp/absl/base/optimization.h \ +webrtc_dsp/absl/base/log_severity.h \ +webrtc_dsp/absl/utility/utility.h \ +webrtc_dsp/rtc_base/string_to_number.h \ +webrtc_dsp/rtc_base/constructormagic.h \ +webrtc_dsp/rtc_base/strings/string_builder.h \ +webrtc_dsp/rtc_base/event_tracer.h \ +webrtc_dsp/rtc_base/stringencode.h \ +webrtc_dsp/rtc_base/memory/aligned_malloc.h \ +webrtc_dsp/rtc_base/event.h \ +webrtc_dsp/rtc_base/ignore_wundef.h \ +webrtc_dsp/rtc_base/stringutils.h \ +webrtc_dsp/rtc_base/arraysize.h \ +webrtc_dsp/rtc_base/swap_queue.h \ +webrtc_dsp/rtc_base/trace_event.h \ +webrtc_dsp/rtc_base/checks.h \ +webrtc_dsp/rtc_base/deprecation.h \ +webrtc_dsp/rtc_base/sanitizer.h \ +webrtc_dsp/rtc_base/scoped_ref_ptr.h \ +webrtc_dsp/rtc_base/logging.h \ +webrtc_dsp/rtc_base/timeutils.h \ +webrtc_dsp/rtc_base/atomicops.h \ +webrtc_dsp/rtc_base/numerics/safe_minmax.h \ +webrtc_dsp/rtc_base/numerics/safe_conversions.h \ +webrtc_dsp/rtc_base/numerics/safe_conversions_impl.h \ +webrtc_dsp/rtc_base/numerics/safe_compare.h \ +webrtc_dsp/rtc_base/system/unused.h \ +webrtc_dsp/rtc_base/system/inline.h \ +webrtc_dsp/rtc_base/system/ignore_warnings.h \ +webrtc_dsp/rtc_base/system/asm_defines.h \ +webrtc_dsp/rtc_base/system/rtc_export.h \ +webrtc_dsp/rtc_base/system/arch.h \ +webrtc_dsp/rtc_base/platform_thread.h \ +webrtc_dsp/rtc_base/platform_thread_types.h \ +webrtc_dsp/rtc_base/protobuf_utils.h \ +webrtc_dsp/rtc_base/thread_annotations.h \ +webrtc_dsp/rtc_base/gtest_prod_util.h \ +webrtc_dsp/rtc_base/function_view.h \ +webrtc_dsp/rtc_base/criticalsection.h \ +webrtc_dsp/rtc_base/refcount.h \ +webrtc_dsp/rtc_base/thread_checker_impl.h \ +webrtc_dsp/rtc_base/compile_assert_c.h \ +webrtc_dsp/rtc_base/type_traits.h \ +webrtc_dsp/rtc_base/platform_file.h \ +webrtc_dsp/rtc_base/refcounter.h \ +webrtc_dsp/rtc_base/thread_checker.h \ +webrtc_dsp/rtc_base/race_checker.h \ +webrtc_dsp/rtc_base/refcountedobject.h \ +webrtc_dsp/third_party/rnnoise/src/rnn_activations.h \ +webrtc_dsp/third_party/rnnoise/src/kiss_fft.h \ +webrtc_dsp/third_party/rnnoise/src/rnn_vad_weights.h \ +webrtc_dsp/api/audio/echo_canceller3_config.h \ +webrtc_dsp/api/audio/echo_control.h \ +webrtc_dsp/api/audio/audio_frame.h \ +webrtc_dsp/api/audio/echo_canceller3_factory.h \ +webrtc_dsp/api/array_view.h \ +webrtc_dsp/modules/third_party/fft/fft.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/bandwidth_info.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/include/isac.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/os_specific_inline.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/entropy_coding.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac_vad.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/settings.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/crc.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac_float_type.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/codec.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_estimator.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/structs.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filter_functions.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_filter.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_analysis.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.h \ +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_tables.h \ +webrtc_dsp/modules/audio_processing/echo_detector/moving_max.h \ +webrtc_dsp/modules/audio_processing/echo_detector/circular_buffer.h \ +webrtc_dsp/modules/audio_processing/echo_detector/normalized_covariance_estimator.h \ +webrtc_dsp/modules/audio_processing/echo_detector/mean_variance_estimator.h \ +webrtc_dsp/modules/audio_processing/gain_control_for_experimental_agc.h \ +webrtc_dsp/modules/audio_processing/rms_level.h \ +webrtc_dsp/modules/audio_processing/ns/ns_core.h \ +webrtc_dsp/modules/audio_processing/ns/defines.h \ +webrtc_dsp/modules/audio_processing/ns/noise_suppression.h \ +webrtc_dsp/modules/audio_processing/ns/nsx_core.h \ +webrtc_dsp/modules/audio_processing/ns/windows_private.h \ +webrtc_dsp/modules/audio_processing/ns/noise_suppression_x.h \ +webrtc_dsp/modules/audio_processing/ns/nsx_defines.h \ +webrtc_dsp/modules/audio_processing/residual_echo_detector.h \ +webrtc_dsp/modules/audio_processing/audio_processing_impl.h \ +webrtc_dsp/modules/audio_processing/render_queue_item_verifier.h \ +webrtc_dsp/modules/audio_processing/include/audio_generator.h \ +webrtc_dsp/modules/audio_processing/include/config.h \ +webrtc_dsp/modules/audio_processing/include/audio_frame_view.h \ +webrtc_dsp/modules/audio_processing/include/mock_audio_processing.h \ +webrtc_dsp/modules/audio_processing/include/gain_control.h \ +webrtc_dsp/modules/audio_processing/include/audio_generator_factory.h \ +webrtc_dsp/modules/audio_processing/include/aec_dump.h \ +webrtc_dsp/modules/audio_processing/include/audio_processing_statistics.h \ +webrtc_dsp/modules/audio_processing/include/audio_processing.h \ +webrtc_dsp/modules/audio_processing/agc2/interpolated_gain_curve.h \ +webrtc_dsp/modules/audio_processing/agc2/biquad_filter.h \ +webrtc_dsp/modules/audio_processing/agc2/agc2_testing_common.h \ +webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator.h \ +webrtc_dsp/modules/audio_processing/agc2/signal_classifier.h \ +webrtc_dsp/modules/audio_processing/agc2/vector_float_frame.h \ +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/sequence_buffer.h \ +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/rnn.h \ +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/test_utils.h \ +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_info.h \ +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/lp_residual.h \ +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/ring_buffer.h \ +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/symmetric_matrix_buffer.h \ +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features.h \ +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/features_extraction.h \ +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/common.h \ +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features_internal.h \ +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/fft_util.h \ +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search_internal.h \ +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search.h \ +webrtc_dsp/modules/audio_processing/agc2/fixed_gain_controller.h \ +webrtc_dsp/modules/audio_processing/agc2/down_sampler.h \ +webrtc_dsp/modules/audio_processing/agc2/saturation_protector.h \ +webrtc_dsp/modules/audio_processing/agc2/agc2_common.h \ +webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h \ +webrtc_dsp/modules/audio_processing/agc2/adaptive_digital_gain_applier.h \ +webrtc_dsp/modules/audio_processing/agc2/vad_with_level.h \ +webrtc_dsp/modules/audio_processing/agc2/limiter_db_gain_curve.h \ +webrtc_dsp/modules/audio_processing/agc2/fixed_digital_level_estimator.h \ +webrtc_dsp/modules/audio_processing/agc2/adaptive_agc.h \ +webrtc_dsp/modules/audio_processing/agc2/gain_applier.h \ +webrtc_dsp/modules/audio_processing/agc2/noise_level_estimator.h \ +webrtc_dsp/modules/audio_processing/agc2/compute_interpolated_gain_curve.h \ +webrtc_dsp/modules/audio_processing/agc2/noise_spectrum_estimator.h \ +webrtc_dsp/modules/audio_processing/agc2/limiter.h \ +webrtc_dsp/modules/audio_processing/transient/transient_detector.h \ +webrtc_dsp/modules/audio_processing/transient/transient_suppressor.h \ +webrtc_dsp/modules/audio_processing/transient/daubechies_8_wavelet_coeffs.h \ +webrtc_dsp/modules/audio_processing/transient/common.h \ +webrtc_dsp/modules/audio_processing/transient/wpd_node.h \ +webrtc_dsp/modules/audio_processing/transient/moving_moments.h \ +webrtc_dsp/modules/audio_processing/transient/wpd_tree.h \ +webrtc_dsp/modules/audio_processing/transient/dyadic_decimator.h \ +webrtc_dsp/modules/audio_processing/noise_suppression_impl.h \ +webrtc_dsp/modules/audio_processing/aec/aec_resampler.h \ +webrtc_dsp/modules/audio_processing/aec/echo_cancellation.h \ +webrtc_dsp/modules/audio_processing/aec/aec_core.h \ +webrtc_dsp/modules/audio_processing/aec/aec_core_optimized_methods.h \ +webrtc_dsp/modules/audio_processing/aec/aec_common.h \ +webrtc_dsp/modules/audio_processing/voice_detection_impl.h \ +webrtc_dsp/modules/audio_processing/agc/legacy/analog_agc.h \ +webrtc_dsp/modules/audio_processing/agc/legacy/gain_control.h \ +webrtc_dsp/modules/audio_processing/agc/legacy/digital_agc.h \ +webrtc_dsp/modules/audio_processing/agc/mock_agc.h \ +webrtc_dsp/modules/audio_processing/agc/loudness_histogram.h \ +webrtc_dsp/modules/audio_processing/agc/gain_map_internal.h \ +webrtc_dsp/modules/audio_processing/agc/utility.h \ +webrtc_dsp/modules/audio_processing/agc/agc_manager_direct.h \ +webrtc_dsp/modules/audio_processing/agc/agc.h \ +webrtc_dsp/modules/audio_processing/common.h \ +webrtc_dsp/modules/audio_processing/audio_buffer.h \ +webrtc_dsp/modules/audio_processing/echo_control_mobile_impl.h \ +webrtc_dsp/modules/audio_processing/splitting_filter.h \ +webrtc_dsp/modules/audio_processing/low_cut_filter.h \ +webrtc_dsp/modules/audio_processing/audio_generator/file_audio_generator.h \ +webrtc_dsp/modules/audio_processing/three_band_filter_bank.h \ +webrtc_dsp/modules/audio_processing/echo_cancellation_impl.h \ +webrtc_dsp/modules/audio_processing/level_estimator_impl.h \ +webrtc_dsp/modules/audio_processing/gain_controller2.h \ +webrtc_dsp/modules/audio_processing/aecm/aecm_core.h \ +webrtc_dsp/modules/audio_processing/aecm/aecm_defines.h \ +webrtc_dsp/modules/audio_processing/aecm/echo_control_mobile.h \ +webrtc_dsp/modules/audio_processing/aec3/downsampled_render_buffer.h \ +webrtc_dsp/modules/audio_processing/aec3/subtractor_output_analyzer.h \ +webrtc_dsp/modules/audio_processing/aec3/residual_echo_estimator.h \ +webrtc_dsp/modules/audio_processing/aec3/shadow_filter_update_gain.h \ +webrtc_dsp/modules/audio_processing/aec3/aec_state.h \ +webrtc_dsp/modules/audio_processing/aec3/suppression_filter.h \ +webrtc_dsp/modules/audio_processing/aec3/block_delay_buffer.h \ +webrtc_dsp/modules/audio_processing/aec3/adaptive_fir_filter.h \ +webrtc_dsp/modules/audio_processing/aec3/cascaded_biquad_filter.h \ +webrtc_dsp/modules/audio_processing/aec3/matched_filter.h \ +webrtc_dsp/modules/audio_processing/aec3/subtractor_output.h \ +webrtc_dsp/modules/audio_processing/aec3/render_signal_analyzer.h \ +webrtc_dsp/modules/audio_processing/aec3/aec3_fft.h \ +webrtc_dsp/modules/audio_processing/aec3/echo_remover_metrics.h \ +webrtc_dsp/modules/audio_processing/aec3/filter_analyzer.h \ +webrtc_dsp/modules/audio_processing/aec3/subtractor.h \ +webrtc_dsp/modules/audio_processing/aec3/echo_path_delay_estimator.h \ +webrtc_dsp/modules/audio_processing/aec3/block_processor_metrics.h \ +webrtc_dsp/modules/audio_processing/aec3/fft_data.h \ +webrtc_dsp/modules/audio_processing/aec3/render_delay_controller_metrics.h \ +webrtc_dsp/modules/audio_processing/aec3/comfort_noise_generator.h \ +webrtc_dsp/modules/audio_processing/aec3/erl_estimator.h \ +webrtc_dsp/modules/audio_processing/aec3/echo_remover.h \ +webrtc_dsp/modules/audio_processing/aec3/matrix_buffer.h \ +webrtc_dsp/modules/audio_processing/aec3/reverb_model_estimator.h \ +webrtc_dsp/modules/audio_processing/aec3/echo_path_variability.h \ +webrtc_dsp/modules/audio_processing/aec3/moving_average.h \ +webrtc_dsp/modules/audio_processing/aec3/render_reverb_model.h \ +webrtc_dsp/modules/audio_processing/aec3/render_delay_controller.h \ +webrtc_dsp/modules/audio_processing/aec3/suppression_gain.h \ +webrtc_dsp/modules/audio_processing/aec3/erle_estimator.h \ +webrtc_dsp/modules/audio_processing/aec3/subband_erle_estimator.h \ +webrtc_dsp/modules/audio_processing/aec3/block_processor.h \ +webrtc_dsp/modules/audio_processing/aec3/fullband_erle_estimator.h \ +webrtc_dsp/modules/audio_processing/aec3/stationarity_estimator.h \ +webrtc_dsp/modules/audio_processing/aec3/echo_canceller3.h \ +webrtc_dsp/modules/audio_processing/aec3/skew_estimator.h \ +webrtc_dsp/modules/audio_processing/aec3/render_buffer.h \ +webrtc_dsp/modules/audio_processing/aec3/reverb_model_fallback.h \ +webrtc_dsp/modules/audio_processing/aec3/vector_buffer.h \ +webrtc_dsp/modules/audio_processing/aec3/reverb_frequency_response.h \ +webrtc_dsp/modules/audio_processing/aec3/echo_audibility.h \ +webrtc_dsp/modules/audio_processing/aec3/fft_buffer.h \ +webrtc_dsp/modules/audio_processing/aec3/aec3_common.h \ +webrtc_dsp/modules/audio_processing/aec3/vector_math.h \ +webrtc_dsp/modules/audio_processing/aec3/decimator.h \ +webrtc_dsp/modules/audio_processing/aec3/frame_blocker.h \ +webrtc_dsp/modules/audio_processing/aec3/block_framer.h \ +webrtc_dsp/modules/audio_processing/aec3/suppression_gain_limiter.h \ +webrtc_dsp/modules/audio_processing/aec3/delay_estimate.h \ +webrtc_dsp/modules/audio_processing/aec3/reverb_model.h \ +webrtc_dsp/modules/audio_processing/aec3/main_filter_update_gain.h \ +webrtc_dsp/modules/audio_processing/aec3/matched_filter_lag_aggregator.h \ +webrtc_dsp/modules/audio_processing/aec3/reverb_decay_estimator.h \ +webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer.h \ +webrtc_dsp/modules/audio_processing/gain_control_impl.h \ +webrtc_dsp/modules/audio_processing/typing_detection.h \ +webrtc_dsp/modules/audio_processing/logging/apm_data_dumper.h \ +webrtc_dsp/modules/audio_processing/vad/vad_audio_proc_internal.h \ +webrtc_dsp/modules/audio_processing/vad/vad_circular_buffer.h \ +webrtc_dsp/modules/audio_processing/vad/pitch_based_vad.h \ +webrtc_dsp/modules/audio_processing/vad/pole_zero_filter.h \ +webrtc_dsp/modules/audio_processing/vad/gmm.h \ +webrtc_dsp/modules/audio_processing/vad/common.h \ +webrtc_dsp/modules/audio_processing/vad/vad_audio_proc.h \ +webrtc_dsp/modules/audio_processing/vad/voice_gmm_tables.h \ +webrtc_dsp/modules/audio_processing/vad/noise_gmm_tables.h \ +webrtc_dsp/modules/audio_processing/vad/pitch_internal.h \ +webrtc_dsp/modules/audio_processing/vad/standalone_vad.h \ +webrtc_dsp/modules/audio_processing/vad/voice_activity_detector.h \ +webrtc_dsp/modules/audio_processing/utility/ooura_fft_tables_neon_sse2.h \ +webrtc_dsp/modules/audio_processing/utility/delay_estimator_internal.h \ +webrtc_dsp/modules/audio_processing/utility/ooura_fft.h \ +webrtc_dsp/modules/audio_processing/utility/block_mean_calculator.h \ +webrtc_dsp/modules/audio_processing/utility/delay_estimator.h \ +webrtc_dsp/modules/audio_processing/utility/ooura_fft_tables_common.h \ +webrtc_dsp/modules/audio_processing/utility/delay_estimator_wrapper.h \ +webrtc_dsp/common_audio/mocks/mock_smoothing_filter.h \ +webrtc_dsp/common_audio/wav_file.h \ +webrtc_dsp/common_audio/sparse_fir_filter.h \ +webrtc_dsp/common_audio/fir_filter_sse.h \ +webrtc_dsp/common_audio/window_generator.h \ +webrtc_dsp/common_audio/ring_buffer.h \ +webrtc_dsp/common_audio/fir_filter.h \ +webrtc_dsp/common_audio/include/audio_util.h \ +webrtc_dsp/common_audio/real_fourier_ooura.h \ +webrtc_dsp/common_audio/smoothing_filter.h \ +webrtc_dsp/common_audio/resampler/sinc_resampler.h \ +webrtc_dsp/common_audio/resampler/include/push_resampler.h \ +webrtc_dsp/common_audio/resampler/include/resampler.h \ +webrtc_dsp/common_audio/resampler/push_sinc_resampler.h \ +webrtc_dsp/common_audio/resampler/sinusoidal_linear_chirp_source.h \ +webrtc_dsp/common_audio/fir_filter_factory.h \ +webrtc_dsp/common_audio/audio_converter.h \ +webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor.h \ +webrtc_dsp/common_audio/third_party/fft4g/fft4g.h \ +webrtc_dsp/common_audio/channel_buffer.h \ +webrtc_dsp/common_audio/real_fourier.h \ +webrtc_dsp/common_audio/fir_filter_neon.h \ +webrtc_dsp/common_audio/fir_filter_c.h \ +webrtc_dsp/common_audio/signal_processing/complex_fft_tables.h \ +webrtc_dsp/common_audio/signal_processing/include/signal_processing_library.h \ +webrtc_dsp/common_audio/signal_processing/include/real_fft.h \ +webrtc_dsp/common_audio/signal_processing/include/spl_inl.h \ +webrtc_dsp/common_audio/signal_processing/include/spl_inl_armv7.h \ +webrtc_dsp/common_audio/signal_processing/dot_product_with_scale.h \ +webrtc_dsp/common_audio/signal_processing/resample_by_2_internal.h \ +webrtc_dsp/common_audio/wav_header.h \ +webrtc_dsp/common_audio/vad/vad_core.h \ +webrtc_dsp/common_audio/vad/include/vad.h \ +webrtc_dsp/common_audio/vad/include/webrtc_vad.h \ +webrtc_dsp/common_audio/vad/vad_gmm.h \ +webrtc_dsp/common_audio/vad/vad_sp.h \ +webrtc_dsp/common_audio/vad/vad_filterbank.h else CFLAGS += -DTGVOIP_NO_DSP diff --git a/libtgvoip/Makefile.in b/libtgvoip/Makefile.in index d36463a..8645a62 100644 --- a/libtgvoip/Makefile.in +++ b/libtgvoip/Makefile.in @@ -127,156 +127,633 @@ host_triplet = @host@ @TARGET_OS_OSX_FALSE@@WITH_PULSE_TRUE@os/linux/AudioPulse.h \ @TARGET_OS_OSX_FALSE@@WITH_PULSE_TRUE@os/linux/PulseFunctions.h -@ENABLE_DSP_TRUE@am__append_8 = -DWEBRTC_POSIX -DWEBRTC_APM_DEBUG_DUMP=0 -I$(top_srcdir)/webrtc_dsp +@ENABLE_DSP_TRUE@am__append_8 = -DWEBRTC_POSIX -DWEBRTC_APM_DEBUG_DUMP=0 -DWEBRTC_NS_FLOAT -I$(top_srcdir)/webrtc_dsp @ENABLE_DSP_TRUE@am__append_9 = -I$(top_srcdir)/webrtc_dsp -@ENABLE_DSP_TRUE@am__append_10 = \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/ring_buffer.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/auto_corr_to_refl_coef.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/auto_correlation.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/complex_fft.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/copy_set_operations.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/cross_correlation.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/division_operations.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/dot_product_with_scale.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/downsample_fast.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/energy.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/filter_ar.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/filter_ar_fast_q12.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/filter_ma_fast_q12.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/get_hanning_window.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/get_scaling_square.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/ilbc_specific_functions.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/levinson_durbin.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/lpc_to_refl_coef.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/min_max_operations.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/randomization_functions.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/real_fft.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/refl_coef_to_lpc.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/resample.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/resample_48khz.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2_internal.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/resample_fractional.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/spl_init.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/spl_inl.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/splitting_filter_impl.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/sqrt_of_one_minus_x_squared.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/vector_scaling_operations.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/base/checks.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core_c.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aecm/echo_control_mobile.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_wrapper.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/three_band_filter_bank.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/splitting_filter.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/system_wrappers/source/cpu_features.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/sparse_fir_filter.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/channel_buffer.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/audio_util.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/block_mean_calculator.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/logging/apm_data_dumper.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aec/aec_resampler.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aec/echo_cancellation.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/wav_header.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/wav_file.cc \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/base/stringutils.cc -@ENABLE_DSP_TRUE@@TARGET_CPU_X86_TRUE@am__append_11 = \ -@ENABLE_DSP_TRUE@@TARGET_CPU_X86_TRUE@webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_sse2.cc \ -@ENABLE_DSP_TRUE@@TARGET_CPU_X86_TRUE@webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc - -@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_TRUE@am__append_12 = \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/webrtc/common_audio/signal_processing/complex_bit_reverse_arm.S \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt_floor_arm.S - -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@am__append_13 = -mfpu=neon -mfloat-abi=hard -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@am__append_14 = -mfpu=neon -mfloat-abi=hard -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@am__append_15 = \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/webrtc/common_audio/signal_processing/cross_correlation_neon.c \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/webrtc/common_audio/signal_processing/downsample_fast_neon.c \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/webrtc/common_audio/signal_processing/min_max_operations_neon.c \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_neon.cc \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core_neon.cc \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core_neon.c \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_neon.cc - -# webrtc_dsp/webrtc/common_audio/signal_processing/filter_ar_fast_q12_armv7.S -@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_FALSE@am__append_16 = \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_FALSE@webrtc_dsp/webrtc/common_audio/signal_processing/complex_bit_reverse.c \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_FALSE@webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt_floor.c +@ENABLE_DSP_TRUE@am__append_10 = \ +@ENABLE_DSP_TRUE@./webrtc_dsp/system_wrappers/source/field_trial.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/system_wrappers/source/metrics.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/system_wrappers/source/cpu_features.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/absl/strings/internal/memutil.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/absl/strings/string_view.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/absl/strings/ascii.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/absl/types/bad_optional_access.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/absl/types/optional.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/absl/base/internal/raw_logging.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/absl/base/internal/throw_delegate.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/race_checker.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/strings/string_builder.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/memory/aligned_malloc.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/timeutils.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/platform_file.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/string_to_number.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/thread_checker_impl.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/stringencode.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/stringutils.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/checks.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/platform_thread.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/logging_webrtc.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/criticalsection.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/platform_thread_types.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/event.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/rtc_base/event_tracer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/third_party/rnnoise/src/rnn_vad_weights.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/third_party/rnnoise/src/kiss_fft.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/api/audio/audio_frame.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/api/audio/echo_canceller3_config.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/api/audio/echo_canceller3_factory.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/third_party/fft/fft.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_estimator.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines_logist.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filterbanks.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/transform.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_filter.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filter_functions.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/decode.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lattice.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/intialize.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_tables.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_analysis.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines_hist.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/entropy_coding.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac_vad.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/crc.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/decode_bwe.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/rms_level.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/echo_detector/normalized_covariance_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/echo_detector/moving_max.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/echo_detector/circular_buffer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/echo_detector/mean_variance_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/splitting_filter.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/gain_control_impl.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/ns/nsx_core.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/ns/noise_suppression_x.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/ns/nsx_core_c.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/ns/ns_core.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/ns/noise_suppression.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/audio_buffer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/typing_detection.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/include/audio_processing_statistics.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/include/audio_generator_factory.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/include/aec_dump.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/include/audio_processing.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/include/config.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/interpolated_gain_curve.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/agc2_common.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/gain_applier.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/adaptive_agc.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/limiter.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/saturation_protector.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features_internal.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/rnn.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search_internal.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/features_extraction.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/fft_util.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/lp_residual.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/vector_float_frame.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/noise_level_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/agc2_testing_common.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/fixed_digital_level_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/fixed_gain_controller.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/vad_with_level.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/limiter_db_gain_curve.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/down_sampler.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/signal_classifier.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/noise_spectrum_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/compute_interpolated_gain_curve.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/biquad_filter.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/transient/moving_moments.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/transient/wpd_tree.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/transient/wpd_node.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/transient/transient_suppressor.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/transient/transient_detector.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/low_cut_filter.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/level_estimator_impl.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/three_band_filter_bank.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec/echo_cancellation.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec/aec_resampler.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec/aec_core.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/voice_detection_impl.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/echo_cancellation_impl.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/gain_control_for_experimental_agc.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc/agc.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc/loudness_histogram.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc/agc_manager_direct.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc/legacy/analog_agc.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc/legacy/digital_agc.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/agc/utility.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/audio_processing_impl.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/audio_generator/file_audio_generator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/gain_controller2.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/residual_echo_detector.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/noise_suppression_impl.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aecm/aecm_core.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aecm/aecm_core_c.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aecm/echo_control_mobile.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/render_reverb_model.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/reverb_model_fallback.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/echo_remover_metrics.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/matched_filter_lag_aggregator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer2.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/echo_path_variability.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/frame_blocker.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/subtractor.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/aec3_fft.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/fullband_erle_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/suppression_filter.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/block_processor.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/subband_erle_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller_metrics.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/vector_buffer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/erl_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/aec_state.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/adaptive_fir_filter.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/skew_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/echo_path_delay_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/block_framer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/erle_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/reverb_model.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/cascaded_biquad_filter.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/render_buffer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/subtractor_output.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/stationarity_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/render_signal_analyzer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/subtractor_output_analyzer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/suppression_gain.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/echo_audibility.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/block_processor_metrics.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/moving_average.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/reverb_model_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/aec3_common.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/residual_echo_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/matched_filter.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/reverb_decay_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller2.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/suppression_gain_limiter.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/main_filter_update_gain.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/echo_remover.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/downsampled_render_buffer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/matrix_buffer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/block_processor2.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/echo_canceller3.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/block_delay_buffer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/fft_buffer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/comfort_noise_generator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/shadow_filter_update_gain.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/filter_analyzer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/reverb_frequency_response.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/aec3/decimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/echo_control_mobile_impl.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/logging/apm_data_dumper.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/vad/voice_activity_detector.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/vad/standalone_vad.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/vad/pitch_internal.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/vad/vad_circular_buffer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/vad/vad_audio_proc.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/vad/pole_zero_filter.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/vad/pitch_based_vad.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/vad/gmm.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/utility/ooura_fft.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/utility/delay_estimator_wrapper.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/utility/delay_estimator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/modules/audio_processing/utility/block_mean_calculator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/window_generator.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/channel_buffer.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/fir_filter_factory.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/wav_header.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/real_fourier_ooura.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/audio_util.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/fir_filter_sse.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/resampler/push_sinc_resampler.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/resampler/resampler.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/resampler/sinc_resampler_sse.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/resampler/push_resampler.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/resampler/sinc_resampler.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/resampler/sinusoidal_linear_chirp_source.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/wav_file.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/third_party/fft4g/fft4g.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/audio_converter.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/real_fourier.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/sparse_fir_filter.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/smoothing_filter.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/fir_filter_c.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/ring_buffer.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/complex_fft.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/filter_ma_fast_q12.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/splitting_filter1.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/levinson_durbin.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/dot_product_with_scale.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/auto_corr_to_refl_coef.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/resample_by_2_internal.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/energy.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/sqrt_of_one_minus_x_squared.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/downsample_fast.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/filter_ar_fast_q12.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/spl_init.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/lpc_to_refl_coef.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/cross_correlation.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/division_operations.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/auto_correlation.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/get_scaling_square.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/resample.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/min_max_operations.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/refl_coef_to_lpc.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/filter_ar.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/vector_scaling_operations.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/resample_fractional.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/real_fft.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/ilbc_specific_functions.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/randomization_functions.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/copy_set_operations.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/resample_by_2.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/get_hanning_window.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/resample_48khz.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/spl_inl.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/signal_processing/spl_sqrt.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/vad/vad_sp.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/vad/vad.cc \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/vad/webrtc_vad.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/vad/vad_filterbank.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/vad/vad_core.c \ +@ENABLE_DSP_TRUE@./webrtc_dsp/common_audio/vad/vad_gmm.c + +@ENABLE_DSP_TRUE@@TARGET_OS_OSX_TRUE@am__append_11 = -DWEBRTC_MAC +@ENABLE_DSP_TRUE@@TARGET_OS_OSX_TRUE@am__append_12 = \ +@ENABLE_DSP_TRUE@@TARGET_OS_OSX_TRUE@webrtc_dsp/rtc_base/logging_mac.mm \ +@ENABLE_DSP_TRUE@@TARGET_OS_OSX_TRUE@webrtc_dsp/rtc_base/logging_mac.h + +@ENABLE_DSP_TRUE@@TARGET_OS_OSX_FALSE@am__append_13 = -DWEBRTC_LINUX +@ENABLE_DSP_TRUE@@TARGET_CPU_X86_TRUE@am__append_14 = \ +@ENABLE_DSP_TRUE@@TARGET_CPU_X86_TRUE@webrtc_dsp/modules/audio_processing/aec/aec_core_sse2.cc \ +@ENABLE_DSP_TRUE@@TARGET_CPU_X86_TRUE@webrtc_dsp/modules/audio_processing/utility/ooura_fft_sse2.cc + +@ENABLE_AUDIO_CALLBACK_TRUE@@ENABLE_DSP_TRUE@am__append_15 = -DTGVOIP_USE_CALLBACK_AUDIO_IO +@ENABLE_AUDIO_CALLBACK_TRUE@@ENABLE_DSP_TRUE@am__append_16 = \ +@ENABLE_AUDIO_CALLBACK_TRUE@@ENABLE_DSP_TRUE@audio/AudioIOCallback.cpp + +@ENABLE_AUDIO_CALLBACK_TRUE@@ENABLE_DSP_TRUE@am__append_17 = \ +@ENABLE_AUDIO_CALLBACK_TRUE@@ENABLE_DSP_TRUE@audio/AudioIOCallback.h + +@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_TRUE@am__append_18 = \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/common_audio/signal_processing/complex_bit_reverse_arm.S \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor_arm.S + +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@am__append_19 = -mfpu=neon -mfloat-abi=hard +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@am__append_20 = -mfpu=neon -mfloat-abi=hard +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@am__append_21 = \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/common_audio/signal_processing/cross_correlation_neon.c \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/common_audio/signal_processing/downsample_fast_neon.c \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/common_audio/signal_processing/min_max_operations_neon.c \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/modules/audio_processing/aec/aec_core_neon.cc \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/modules/audio_processing/aecm/aecm_core_neon.cc \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/modules/audio_processing/ns/nsx_core_neon.c \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@webrtc_dsp/modules/audio_processing/utility/ooura_fft_neon.cc + +# webrtc_dsp/common_audio/signal_processing/filter_ar_fast_q12_armv7.S +@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_FALSE@am__append_22 = \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_FALSE@webrtc_dsp/common_audio/signal_processing/complex_bit_reverse.c \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_FALSE@webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor.c # headers -@ENABLE_DSP_TRUE@am__append_17 = webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression_x.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/ns_core.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core_c.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/fft4g.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/analog_agc.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/digital_agc.c \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/base/array_view.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/base/atomicops.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/base/basictypes.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/base/checks.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/base/constructormagic.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/base/safe_compare.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/base/safe_conversions.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/base/safe_conversions_impl.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/base/sanitizer.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/base/stringutils.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/base/type_traits.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/channel_buffer.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/fft4g.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/include/audio_util.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/ring_buffer.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/complex_fft_tables.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/include/real_fft.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/include/signal_processing_library.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/include/spl_inl.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/include/spl_inl_armv7.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/include/spl_inl_mips.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2_internal.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/sparse_fir_filter.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/wav_file.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/wav_header.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aec/aec_common.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_optimized_methods.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aec/aec_resampler.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aec/echo_cancellation.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_defines.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aecm/echo_control_mobile.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/analog_agc.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/digital_agc.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/gain_control.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/logging/apm_data_dumper.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/defines.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression_x.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/ns_core.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_defines.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/windows_private.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/splitting_filter.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/three_band_filter_bank.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/block_mean_calculator.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_internal.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_tables_common.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_tables_neon_sse2.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/system_wrappers/include/asm_defines.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/system_wrappers/include/compile_assert_c.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/system_wrappers/include/cpu_features_wrapper.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/system_wrappers/include/metrics.h \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/typedefs.h -@ENABLE_DSP_FALSE@am__append_18 = -DTGVOIP_NO_DSP +@ENABLE_DSP_TRUE@am__append_23 = \ +@ENABLE_DSP_TRUE@webrtc_dsp/system_wrappers/include/field_trial.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/system_wrappers/include/cpu_features_wrapper.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/system_wrappers/include/asm_defines.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/system_wrappers/include/metrics.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/system_wrappers/include/compile_assert_c.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/typedefs.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/strings/internal/memutil.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/strings/ascii.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/strings/string_view.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/types/optional.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/types/bad_optional_access.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/memory/memory.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/meta/type_traits.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/algorithm/algorithm.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/container/inlined_vector.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/base/policy_checks.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/base/port.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/base/config.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/base/internal/invoke.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/base/internal/inline_variable.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/base/internal/atomic_hook.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/base/internal/identity.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/base/internal/raw_logging.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/base/internal/throw_delegate.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/base/attributes.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/base/macros.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/base/optimization.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/base/log_severity.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/absl/utility/utility.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/string_to_number.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/constructormagic.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/strings/string_builder.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/event_tracer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/stringencode.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/memory/aligned_malloc.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/event.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/ignore_wundef.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/stringutils.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/arraysize.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/swap_queue.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/trace_event.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/checks.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/deprecation.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/sanitizer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/scoped_ref_ptr.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/logging.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/timeutils.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/atomicops.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/numerics/safe_minmax.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/numerics/safe_conversions.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/numerics/safe_conversions_impl.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/numerics/safe_compare.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/system/unused.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/system/inline.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/system/ignore_warnings.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/system/asm_defines.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/system/rtc_export.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/system/arch.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/platform_thread.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/platform_thread_types.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/protobuf_utils.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/thread_annotations.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/gtest_prod_util.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/function_view.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/criticalsection.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/refcount.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/thread_checker_impl.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/compile_assert_c.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/type_traits.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/platform_file.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/refcounter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/thread_checker.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/race_checker.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/rtc_base/refcountedobject.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/third_party/rnnoise/src/rnn_activations.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/third_party/rnnoise/src/kiss_fft.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/third_party/rnnoise/src/rnn_vad_weights.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/api/audio/echo_canceller3_config.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/api/audio/echo_control.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/api/audio/audio_frame.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/api/audio/echo_canceller3_factory.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/api/array_view.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/third_party/fft/fft.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/bandwidth_info.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/include/isac.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/os_specific_inline.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/entropy_coding.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac_vad.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/settings.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/crc.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac_float_type.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/codec.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/structs.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filter_functions.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_filter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_analysis.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_tables.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/echo_detector/moving_max.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/echo_detector/circular_buffer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/echo_detector/normalized_covariance_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/echo_detector/mean_variance_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/gain_control_for_experimental_agc.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/rms_level.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/ns/ns_core.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/ns/defines.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/ns/noise_suppression.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/ns/nsx_core.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/ns/windows_private.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/ns/noise_suppression_x.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/ns/nsx_defines.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/residual_echo_detector.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/audio_processing_impl.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/render_queue_item_verifier.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/include/audio_generator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/include/config.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/include/audio_frame_view.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/include/mock_audio_processing.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/include/gain_control.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/include/audio_generator_factory.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/include/aec_dump.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/include/audio_processing_statistics.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/include/audio_processing.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/interpolated_gain_curve.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/biquad_filter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/agc2_testing_common.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/signal_classifier.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/vector_float_frame.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/rnn_vad/sequence_buffer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/rnn_vad/rnn.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/rnn_vad/test_utils.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_info.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/rnn_vad/lp_residual.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/rnn_vad/ring_buffer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/rnn_vad/symmetric_matrix_buffer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/rnn_vad/features_extraction.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/rnn_vad/common.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features_internal.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/rnn_vad/fft_util.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search_internal.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/fixed_gain_controller.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/down_sampler.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/saturation_protector.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/agc2_common.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/adaptive_digital_gain_applier.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/vad_with_level.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/limiter_db_gain_curve.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/fixed_digital_level_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/adaptive_agc.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/gain_applier.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/noise_level_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/compute_interpolated_gain_curve.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/noise_spectrum_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc2/limiter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/transient/transient_detector.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/transient/transient_suppressor.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/transient/daubechies_8_wavelet_coeffs.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/transient/common.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/transient/wpd_node.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/transient/moving_moments.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/transient/wpd_tree.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/transient/dyadic_decimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/noise_suppression_impl.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec/aec_resampler.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec/echo_cancellation.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec/aec_core.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec/aec_core_optimized_methods.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec/aec_common.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/voice_detection_impl.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc/legacy/analog_agc.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc/legacy/gain_control.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc/legacy/digital_agc.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc/mock_agc.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc/loudness_histogram.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc/gain_map_internal.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc/utility.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc/agc_manager_direct.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/agc/agc.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/common.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/audio_buffer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/echo_control_mobile_impl.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/splitting_filter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/low_cut_filter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/audio_generator/file_audio_generator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/three_band_filter_bank.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/echo_cancellation_impl.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/level_estimator_impl.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/gain_controller2.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aecm/aecm_core.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aecm/aecm_defines.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aecm/echo_control_mobile.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/downsampled_render_buffer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/subtractor_output_analyzer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/residual_echo_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/shadow_filter_update_gain.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/aec_state.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/suppression_filter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/block_delay_buffer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/adaptive_fir_filter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/cascaded_biquad_filter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/matched_filter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/subtractor_output.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/render_signal_analyzer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/aec3_fft.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/echo_remover_metrics.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/filter_analyzer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/subtractor.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/echo_path_delay_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/block_processor_metrics.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/fft_data.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/render_delay_controller_metrics.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/comfort_noise_generator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/erl_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/echo_remover.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/matrix_buffer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/reverb_model_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/echo_path_variability.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/moving_average.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/render_reverb_model.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/render_delay_controller.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/suppression_gain.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/erle_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/subband_erle_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/block_processor.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/fullband_erle_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/stationarity_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/echo_canceller3.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/skew_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/render_buffer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/reverb_model_fallback.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/vector_buffer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/reverb_frequency_response.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/echo_audibility.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/fft_buffer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/aec3_common.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/vector_math.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/decimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/frame_blocker.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/block_framer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/suppression_gain_limiter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/delay_estimate.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/reverb_model.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/main_filter_update_gain.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/matched_filter_lag_aggregator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/reverb_decay_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/gain_control_impl.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/typing_detection.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/logging/apm_data_dumper.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/vad/vad_audio_proc_internal.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/vad/vad_circular_buffer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/vad/pitch_based_vad.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/vad/pole_zero_filter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/vad/gmm.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/vad/common.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/vad/vad_audio_proc.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/vad/voice_gmm_tables.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/vad/noise_gmm_tables.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/vad/pitch_internal.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/vad/standalone_vad.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/vad/voice_activity_detector.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/utility/ooura_fft_tables_neon_sse2.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/utility/delay_estimator_internal.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/utility/ooura_fft.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/utility/block_mean_calculator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/utility/delay_estimator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/utility/ooura_fft_tables_common.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/modules/audio_processing/utility/delay_estimator_wrapper.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/mocks/mock_smoothing_filter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/wav_file.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/sparse_fir_filter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/fir_filter_sse.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/window_generator.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/ring_buffer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/fir_filter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/include/audio_util.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/real_fourier_ooura.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/smoothing_filter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/resampler/sinc_resampler.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/resampler/include/push_resampler.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/resampler/include/resampler.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/resampler/push_sinc_resampler.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/resampler/sinusoidal_linear_chirp_source.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/fir_filter_factory.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/audio_converter.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/third_party/fft4g/fft4g.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/channel_buffer.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/real_fourier.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/fir_filter_neon.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/fir_filter_c.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/signal_processing/complex_fft_tables.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/signal_processing/include/signal_processing_library.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/signal_processing/include/real_fft.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/signal_processing/include/spl_inl.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/signal_processing/include/spl_inl_armv7.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/signal_processing/dot_product_with_scale.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/signal_processing/resample_by_2_internal.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/wav_header.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/vad/vad_core.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/vad/include/vad.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/vad/include/webrtc_vad.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/vad/vad_gmm.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/vad/vad_sp.h \ +@ENABLE_DSP_TRUE@webrtc_dsp/common_audio/vad/vad_filterbank.h + +@ENABLE_DSP_FALSE@am__append_24 = -DTGVOIP_NO_DSP subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac @@ -329,7 +806,8 @@ am__libtgvoip_la_SOURCES_DIST = VoIPController.cpp Buffers.cpp \ PacketReassembler.cpp VoIPGroupController.cpp \ VoIPServerConfig.cpp audio/AudioIO.cpp audio/AudioInput.cpp \ audio/AudioOutput.cpp audio/Resampler.cpp \ - os/posix/NetworkSocketPosix.cpp \ + os/posix/NetworkSocketPosix.cpp video/VideoSource.cpp \ + video/VideoRenderer.cpp json11.cpp \ os/darwin/AudioInputAudioUnit.cpp \ os/darwin/AudioOutputAudioUnit.cpp os/darwin/AudioUnitIO.cpp \ os/darwin/AudioInputAudioUnitOSX.cpp \ @@ -337,152 +815,615 @@ am__libtgvoip_la_SOURCES_DIST = VoIPController.cpp Buffers.cpp \ os/darwin/DarwinSpecific.mm os/linux/AudioInputALSA.cpp \ os/linux/AudioOutputALSA.cpp os/linux/AudioOutputPulse.cpp \ os/linux/AudioInputPulse.cpp os/linux/AudioPulse.cpp \ - webrtc_dsp/webrtc/common_audio/ring_buffer.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/auto_corr_to_refl_coef.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/auto_correlation.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/complex_fft.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/copy_set_operations.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/cross_correlation.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/division_operations.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/dot_product_with_scale.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/downsample_fast.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/energy.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/filter_ar.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/filter_ar_fast_q12.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/filter_ma_fast_q12.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/get_hanning_window.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/get_scaling_square.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/ilbc_specific_functions.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/levinson_durbin.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/lpc_to_refl_coef.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/min_max_operations.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/randomization_functions.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/real_fft.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/refl_coef_to_lpc.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/resample.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/resample_48khz.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2_internal.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/resample_fractional.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/spl_init.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/spl_inl.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/splitting_filter_impl.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/sqrt_of_one_minus_x_squared.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/vector_scaling_operations.c \ - webrtc_dsp/webrtc/base/checks.cc \ - webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core.cc \ - webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core_c.cc \ - webrtc_dsp/webrtc/modules/audio_processing/aecm/echo_control_mobile.cc \ - webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator.cc \ - webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_wrapper.cc \ - webrtc_dsp/webrtc/modules/audio_processing/three_band_filter_bank.cc \ - webrtc_dsp/webrtc/modules/audio_processing/splitting_filter.cc \ - webrtc_dsp/webrtc/system_wrappers/source/cpu_features.cc \ - webrtc_dsp/webrtc/common_audio/sparse_fir_filter.cc \ - webrtc_dsp/webrtc/common_audio/channel_buffer.cc \ - webrtc_dsp/webrtc/common_audio/audio_util.cc \ - webrtc_dsp/webrtc/modules/audio_processing/utility/block_mean_calculator.cc \ - webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft.cc \ - webrtc_dsp/webrtc/modules/audio_processing/logging/apm_data_dumper.cc \ - webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core.cc \ - webrtc_dsp/webrtc/modules/audio_processing/aec/aec_resampler.cc \ - webrtc_dsp/webrtc/modules/audio_processing/aec/echo_cancellation.cc \ - webrtc_dsp/webrtc/common_audio/wav_header.cc \ - webrtc_dsp/webrtc/common_audio/wav_file.cc \ - webrtc_dsp/webrtc/base/stringutils.cc \ - webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_sse2.cc \ - webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc \ - webrtc_dsp/webrtc/common_audio/signal_processing/complex_bit_reverse_arm.S \ - webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt_floor_arm.S \ - webrtc_dsp/webrtc/common_audio/signal_processing/cross_correlation_neon.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/downsample_fast_neon.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/min_max_operations_neon.c \ - webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_neon.cc \ - webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core_neon.cc \ - webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core_neon.c \ - webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_neon.cc \ - webrtc_dsp/webrtc/common_audio/signal_processing/complex_bit_reverse.c \ - webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt_floor.c \ - webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression_x.c \ - webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression.c \ - webrtc_dsp/webrtc/modules/audio_processing/ns/ns_core.c \ - webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core_c.c \ - webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core.c \ - webrtc_dsp/webrtc/common_audio/fft4g.c \ - webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/analog_agc.c \ - webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/digital_agc.c \ - webrtc_dsp/webrtc/base/array_view.h \ - webrtc_dsp/webrtc/base/atomicops.h \ - webrtc_dsp/webrtc/base/basictypes.h \ - webrtc_dsp/webrtc/base/checks.h \ - webrtc_dsp/webrtc/base/constructormagic.h \ - webrtc_dsp/webrtc/base/safe_compare.h \ - webrtc_dsp/webrtc/base/safe_conversions.h \ - webrtc_dsp/webrtc/base/safe_conversions_impl.h \ - webrtc_dsp/webrtc/base/sanitizer.h \ - webrtc_dsp/webrtc/base/stringutils.h \ - webrtc_dsp/webrtc/base/type_traits.h \ - webrtc_dsp/webrtc/common_audio/channel_buffer.h \ - webrtc_dsp/webrtc/common_audio/fft4g.h \ - webrtc_dsp/webrtc/common_audio/include/audio_util.h \ - webrtc_dsp/webrtc/common_audio/ring_buffer.h \ - webrtc_dsp/webrtc/common_audio/signal_processing/complex_fft_tables.h \ - webrtc_dsp/webrtc/common_audio/signal_processing/include/real_fft.h \ - webrtc_dsp/webrtc/common_audio/signal_processing/include/signal_processing_library.h \ - webrtc_dsp/webrtc/common_audio/signal_processing/include/spl_inl.h \ - webrtc_dsp/webrtc/common_audio/signal_processing/include/spl_inl_armv7.h \ - webrtc_dsp/webrtc/common_audio/signal_processing/include/spl_inl_mips.h \ - webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2_internal.h \ - webrtc_dsp/webrtc/common_audio/sparse_fir_filter.h \ - webrtc_dsp/webrtc/common_audio/wav_file.h \ - webrtc_dsp/webrtc/common_audio/wav_header.h \ - webrtc_dsp/webrtc/modules/audio_processing/aec/aec_common.h \ - webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core.h \ - webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_optimized_methods.h \ - webrtc_dsp/webrtc/modules/audio_processing/aec/aec_resampler.h \ - webrtc_dsp/webrtc/modules/audio_processing/aec/echo_cancellation.h \ - webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core.h \ - webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_defines.h \ - webrtc_dsp/webrtc/modules/audio_processing/aecm/echo_control_mobile.h \ - webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/analog_agc.h \ - webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/digital_agc.h \ - webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/gain_control.h \ - webrtc_dsp/webrtc/modules/audio_processing/logging/apm_data_dumper.h \ - webrtc_dsp/webrtc/modules/audio_processing/ns/defines.h \ - webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression.h \ - webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression_x.h \ - webrtc_dsp/webrtc/modules/audio_processing/ns/ns_core.h \ - webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core.h \ - webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_defines.h \ - webrtc_dsp/webrtc/modules/audio_processing/ns/windows_private.h \ - webrtc_dsp/webrtc/modules/audio_processing/splitting_filter.h \ - webrtc_dsp/webrtc/modules/audio_processing/three_band_filter_bank.h \ - webrtc_dsp/webrtc/modules/audio_processing/utility/block_mean_calculator.h \ - webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator.h \ - webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_internal.h \ - webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h \ - webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft.h \ - webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_tables_common.h \ - webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_tables_neon_sse2.h \ - webrtc_dsp/webrtc/system_wrappers/include/asm_defines.h \ - webrtc_dsp/webrtc/system_wrappers/include/compile_assert_c.h \ - webrtc_dsp/webrtc/system_wrappers/include/cpu_features_wrapper.h \ - webrtc_dsp/webrtc/system_wrappers/include/metrics.h \ - webrtc_dsp/webrtc/typedefs.h VoIPController.h Buffers.h \ - BlockingQueue.h PrivateDefines.h CongestionControl.h \ + ./webrtc_dsp/system_wrappers/source/field_trial.cc \ + ./webrtc_dsp/system_wrappers/source/metrics.cc \ + ./webrtc_dsp/system_wrappers/source/cpu_features.cc \ + ./webrtc_dsp/absl/strings/internal/memutil.cc \ + ./webrtc_dsp/absl/strings/string_view.cc \ + ./webrtc_dsp/absl/strings/ascii.cc \ + ./webrtc_dsp/absl/types/bad_optional_access.cc \ + ./webrtc_dsp/absl/types/optional.cc \ + ./webrtc_dsp/absl/base/internal/raw_logging.cc \ + ./webrtc_dsp/absl/base/internal/throw_delegate.cc \ + ./webrtc_dsp/rtc_base/race_checker.cc \ + ./webrtc_dsp/rtc_base/strings/string_builder.cc \ + ./webrtc_dsp/rtc_base/memory/aligned_malloc.cc \ + ./webrtc_dsp/rtc_base/timeutils.cc \ + ./webrtc_dsp/rtc_base/platform_file.cc \ + ./webrtc_dsp/rtc_base/string_to_number.cc \ + ./webrtc_dsp/rtc_base/thread_checker_impl.cc \ + ./webrtc_dsp/rtc_base/stringencode.cc \ + ./webrtc_dsp/rtc_base/stringutils.cc \ + ./webrtc_dsp/rtc_base/checks.cc \ + ./webrtc_dsp/rtc_base/platform_thread.cc \ + ./webrtc_dsp/rtc_base/logging_webrtc.cc \ + ./webrtc_dsp/rtc_base/criticalsection.cc \ + ./webrtc_dsp/rtc_base/platform_thread_types.cc \ + ./webrtc_dsp/rtc_base/event.cc \ + ./webrtc_dsp/rtc_base/event_tracer.cc \ + ./webrtc_dsp/third_party/rnnoise/src/rnn_vad_weights.cc \ + ./webrtc_dsp/third_party/rnnoise/src/kiss_fft.cc \ + ./webrtc_dsp/api/audio/audio_frame.cc \ + ./webrtc_dsp/api/audio/echo_canceller3_config.cc \ + ./webrtc_dsp/api/audio/echo_canceller3_factory.cc \ + ./webrtc_dsp/modules/third_party/fft/fft.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_estimator.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines_logist.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filterbanks.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/transform.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_filter.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filter_functions.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/decode.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lattice.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/intialize.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_tables.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_analysis.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines_hist.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/entropy_coding.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac_vad.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/crc.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/decode_bwe.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.c \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac.c \ + ./webrtc_dsp/modules/audio_processing/rms_level.cc \ + ./webrtc_dsp/modules/audio_processing/echo_detector/normalized_covariance_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/echo_detector/moving_max.cc \ + ./webrtc_dsp/modules/audio_processing/echo_detector/circular_buffer.cc \ + ./webrtc_dsp/modules/audio_processing/echo_detector/mean_variance_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/splitting_filter.cc \ + ./webrtc_dsp/modules/audio_processing/gain_control_impl.cc \ + ./webrtc_dsp/modules/audio_processing/ns/nsx_core.c \ + ./webrtc_dsp/modules/audio_processing/ns/noise_suppression_x.c \ + ./webrtc_dsp/modules/audio_processing/ns/nsx_core_c.c \ + ./webrtc_dsp/modules/audio_processing/ns/ns_core.c \ + ./webrtc_dsp/modules/audio_processing/ns/noise_suppression.c \ + ./webrtc_dsp/modules/audio_processing/audio_buffer.cc \ + ./webrtc_dsp/modules/audio_processing/typing_detection.cc \ + ./webrtc_dsp/modules/audio_processing/include/audio_processing_statistics.cc \ + ./webrtc_dsp/modules/audio_processing/include/audio_generator_factory.cc \ + ./webrtc_dsp/modules/audio_processing/include/aec_dump.cc \ + ./webrtc_dsp/modules/audio_processing/include/audio_processing.cc \ + ./webrtc_dsp/modules/audio_processing/include/config.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/interpolated_gain_curve.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/agc2_common.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/gain_applier.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/adaptive_agc.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/limiter.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/saturation_protector.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features_internal.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/rnn.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search_internal.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/features_extraction.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/fft_util.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/lp_residual.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/vector_float_frame.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/noise_level_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/agc2_testing_common.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/fixed_digital_level_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/fixed_gain_controller.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/vad_with_level.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/limiter_db_gain_curve.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/down_sampler.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/signal_classifier.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/noise_spectrum_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/compute_interpolated_gain_curve.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/biquad_filter.cc \ + ./webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/transient/moving_moments.cc \ + ./webrtc_dsp/modules/audio_processing/transient/wpd_tree.cc \ + ./webrtc_dsp/modules/audio_processing/transient/wpd_node.cc \ + ./webrtc_dsp/modules/audio_processing/transient/transient_suppressor.cc \ + ./webrtc_dsp/modules/audio_processing/transient/transient_detector.cc \ + ./webrtc_dsp/modules/audio_processing/low_cut_filter.cc \ + ./webrtc_dsp/modules/audio_processing/level_estimator_impl.cc \ + ./webrtc_dsp/modules/audio_processing/three_band_filter_bank.cc \ + ./webrtc_dsp/modules/audio_processing/aec/echo_cancellation.cc \ + ./webrtc_dsp/modules/audio_processing/aec/aec_resampler.cc \ + ./webrtc_dsp/modules/audio_processing/aec/aec_core.cc \ + ./webrtc_dsp/modules/audio_processing/voice_detection_impl.cc \ + ./webrtc_dsp/modules/audio_processing/echo_cancellation_impl.cc \ + ./webrtc_dsp/modules/audio_processing/gain_control_for_experimental_agc.cc \ + ./webrtc_dsp/modules/audio_processing/agc/agc.cc \ + ./webrtc_dsp/modules/audio_processing/agc/loudness_histogram.cc \ + ./webrtc_dsp/modules/audio_processing/agc/agc_manager_direct.cc \ + ./webrtc_dsp/modules/audio_processing/agc/legacy/analog_agc.c \ + ./webrtc_dsp/modules/audio_processing/agc/legacy/digital_agc.c \ + ./webrtc_dsp/modules/audio_processing/agc/utility.cc \ + ./webrtc_dsp/modules/audio_processing/audio_processing_impl.cc \ + ./webrtc_dsp/modules/audio_processing/audio_generator/file_audio_generator.cc \ + ./webrtc_dsp/modules/audio_processing/gain_controller2.cc \ + ./webrtc_dsp/modules/audio_processing/residual_echo_detector.cc \ + ./webrtc_dsp/modules/audio_processing/noise_suppression_impl.cc \ + ./webrtc_dsp/modules/audio_processing/aecm/aecm_core.cc \ + ./webrtc_dsp/modules/audio_processing/aecm/aecm_core_c.cc \ + ./webrtc_dsp/modules/audio_processing/aecm/echo_control_mobile.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/render_reverb_model.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/reverb_model_fallback.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/echo_remover_metrics.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/matched_filter_lag_aggregator.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer2.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/echo_path_variability.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/frame_blocker.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/subtractor.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/aec3_fft.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/fullband_erle_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/suppression_filter.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/block_processor.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/subband_erle_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller_metrics.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/vector_buffer.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/erl_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/aec_state.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/adaptive_fir_filter.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/skew_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/echo_path_delay_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/block_framer.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/erle_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/reverb_model.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/cascaded_biquad_filter.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/render_buffer.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/subtractor_output.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/stationarity_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/render_signal_analyzer.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/subtractor_output_analyzer.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/suppression_gain.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/echo_audibility.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/block_processor_metrics.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/moving_average.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/reverb_model_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/aec3_common.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/residual_echo_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/matched_filter.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/reverb_decay_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller2.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/suppression_gain_limiter.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/main_filter_update_gain.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/echo_remover.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/downsampled_render_buffer.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/matrix_buffer.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/block_processor2.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/echo_canceller3.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/block_delay_buffer.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/fft_buffer.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/comfort_noise_generator.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/shadow_filter_update_gain.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/filter_analyzer.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/reverb_frequency_response.cc \ + ./webrtc_dsp/modules/audio_processing/aec3/decimator.cc \ + ./webrtc_dsp/modules/audio_processing/echo_control_mobile_impl.cc \ + ./webrtc_dsp/modules/audio_processing/logging/apm_data_dumper.cc \ + ./webrtc_dsp/modules/audio_processing/vad/voice_activity_detector.cc \ + ./webrtc_dsp/modules/audio_processing/vad/standalone_vad.cc \ + ./webrtc_dsp/modules/audio_processing/vad/pitch_internal.cc \ + ./webrtc_dsp/modules/audio_processing/vad/vad_circular_buffer.cc \ + ./webrtc_dsp/modules/audio_processing/vad/vad_audio_proc.cc \ + ./webrtc_dsp/modules/audio_processing/vad/pole_zero_filter.cc \ + ./webrtc_dsp/modules/audio_processing/vad/pitch_based_vad.cc \ + ./webrtc_dsp/modules/audio_processing/vad/gmm.cc \ + ./webrtc_dsp/modules/audio_processing/utility/ooura_fft.cc \ + ./webrtc_dsp/modules/audio_processing/utility/delay_estimator_wrapper.cc \ + ./webrtc_dsp/modules/audio_processing/utility/delay_estimator.cc \ + ./webrtc_dsp/modules/audio_processing/utility/block_mean_calculator.cc \ + ./webrtc_dsp/common_audio/window_generator.cc \ + ./webrtc_dsp/common_audio/channel_buffer.cc \ + ./webrtc_dsp/common_audio/fir_filter_factory.cc \ + ./webrtc_dsp/common_audio/wav_header.cc \ + ./webrtc_dsp/common_audio/real_fourier_ooura.cc \ + ./webrtc_dsp/common_audio/audio_util.cc \ + ./webrtc_dsp/common_audio/fir_filter_sse.cc \ + ./webrtc_dsp/common_audio/resampler/push_sinc_resampler.cc \ + ./webrtc_dsp/common_audio/resampler/resampler.cc \ + ./webrtc_dsp/common_audio/resampler/sinc_resampler_sse.cc \ + ./webrtc_dsp/common_audio/resampler/push_resampler.cc \ + ./webrtc_dsp/common_audio/resampler/sinc_resampler.cc \ + ./webrtc_dsp/common_audio/resampler/sinusoidal_linear_chirp_source.cc \ + ./webrtc_dsp/common_audio/wav_file.cc \ + ./webrtc_dsp/common_audio/third_party/fft4g/fft4g.c \ + ./webrtc_dsp/common_audio/audio_converter.cc \ + ./webrtc_dsp/common_audio/real_fourier.cc \ + ./webrtc_dsp/common_audio/sparse_fir_filter.cc \ + ./webrtc_dsp/common_audio/smoothing_filter.cc \ + ./webrtc_dsp/common_audio/fir_filter_c.cc \ + ./webrtc_dsp/common_audio/ring_buffer.c \ + ./webrtc_dsp/common_audio/signal_processing/complex_fft.c \ + ./webrtc_dsp/common_audio/signal_processing/filter_ma_fast_q12.c \ + ./webrtc_dsp/common_audio/signal_processing/splitting_filter1.c \ + ./webrtc_dsp/common_audio/signal_processing/levinson_durbin.c \ + ./webrtc_dsp/common_audio/signal_processing/dot_product_with_scale.cc \ + ./webrtc_dsp/common_audio/signal_processing/auto_corr_to_refl_coef.c \ + ./webrtc_dsp/common_audio/signal_processing/resample_by_2_internal.c \ + ./webrtc_dsp/common_audio/signal_processing/energy.c \ + ./webrtc_dsp/common_audio/signal_processing/sqrt_of_one_minus_x_squared.c \ + ./webrtc_dsp/common_audio/signal_processing/downsample_fast.c \ + ./webrtc_dsp/common_audio/signal_processing/filter_ar_fast_q12.c \ + ./webrtc_dsp/common_audio/signal_processing/spl_init.c \ + ./webrtc_dsp/common_audio/signal_processing/lpc_to_refl_coef.c \ + ./webrtc_dsp/common_audio/signal_processing/cross_correlation.c \ + ./webrtc_dsp/common_audio/signal_processing/division_operations.c \ + ./webrtc_dsp/common_audio/signal_processing/auto_correlation.c \ + ./webrtc_dsp/common_audio/signal_processing/get_scaling_square.c \ + ./webrtc_dsp/common_audio/signal_processing/resample.c \ + ./webrtc_dsp/common_audio/signal_processing/min_max_operations.c \ + ./webrtc_dsp/common_audio/signal_processing/refl_coef_to_lpc.c \ + ./webrtc_dsp/common_audio/signal_processing/filter_ar.c \ + ./webrtc_dsp/common_audio/signal_processing/vector_scaling_operations.c \ + ./webrtc_dsp/common_audio/signal_processing/resample_fractional.c \ + ./webrtc_dsp/common_audio/signal_processing/real_fft.c \ + ./webrtc_dsp/common_audio/signal_processing/ilbc_specific_functions.c \ + ./webrtc_dsp/common_audio/signal_processing/randomization_functions.c \ + ./webrtc_dsp/common_audio/signal_processing/copy_set_operations.c \ + ./webrtc_dsp/common_audio/signal_processing/resample_by_2.c \ + ./webrtc_dsp/common_audio/signal_processing/get_hanning_window.c \ + ./webrtc_dsp/common_audio/signal_processing/resample_48khz.c \ + ./webrtc_dsp/common_audio/signal_processing/spl_inl.c \ + ./webrtc_dsp/common_audio/signal_processing/spl_sqrt.c \ + ./webrtc_dsp/common_audio/vad/vad_sp.c \ + ./webrtc_dsp/common_audio/vad/vad.cc \ + ./webrtc_dsp/common_audio/vad/webrtc_vad.c \ + ./webrtc_dsp/common_audio/vad/vad_filterbank.c \ + ./webrtc_dsp/common_audio/vad/vad_core.c \ + ./webrtc_dsp/common_audio/vad/vad_gmm.c \ + webrtc_dsp/rtc_base/logging_mac.mm \ + webrtc_dsp/rtc_base/logging_mac.h \ + webrtc_dsp/modules/audio_processing/aec/aec_core_sse2.cc \ + webrtc_dsp/modules/audio_processing/utility/ooura_fft_sse2.cc \ + audio/AudioIOCallback.cpp \ + webrtc_dsp/common_audio/signal_processing/complex_bit_reverse_arm.S \ + webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor_arm.S \ + webrtc_dsp/common_audio/signal_processing/cross_correlation_neon.c \ + webrtc_dsp/common_audio/signal_processing/downsample_fast_neon.c \ + webrtc_dsp/common_audio/signal_processing/min_max_operations_neon.c \ + webrtc_dsp/modules/audio_processing/aec/aec_core_neon.cc \ + webrtc_dsp/modules/audio_processing/aecm/aecm_core_neon.cc \ + webrtc_dsp/modules/audio_processing/ns/nsx_core_neon.c \ + webrtc_dsp/modules/audio_processing/utility/ooura_fft_neon.cc \ + webrtc_dsp/common_audio/signal_processing/complex_bit_reverse.c \ + webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor.c \ + webrtc_dsp/system_wrappers/include/field_trial.h \ + webrtc_dsp/system_wrappers/include/cpu_features_wrapper.h \ + webrtc_dsp/system_wrappers/include/asm_defines.h \ + webrtc_dsp/system_wrappers/include/metrics.h \ + webrtc_dsp/system_wrappers/include/compile_assert_c.h \ + webrtc_dsp/typedefs.h \ + webrtc_dsp/absl/strings/internal/memutil.h \ + webrtc_dsp/absl/strings/ascii.h \ + webrtc_dsp/absl/strings/string_view.h \ + webrtc_dsp/absl/types/optional.h \ + webrtc_dsp/absl/types/bad_optional_access.h \ + webrtc_dsp/absl/memory/memory.h \ + webrtc_dsp/absl/meta/type_traits.h \ + webrtc_dsp/absl/algorithm/algorithm.h \ + webrtc_dsp/absl/container/inlined_vector.h \ + webrtc_dsp/absl/base/policy_checks.h \ + webrtc_dsp/absl/base/port.h webrtc_dsp/absl/base/config.h \ + webrtc_dsp/absl/base/internal/invoke.h \ + webrtc_dsp/absl/base/internal/inline_variable.h \ + webrtc_dsp/absl/base/internal/atomic_hook.h \ + webrtc_dsp/absl/base/internal/identity.h \ + webrtc_dsp/absl/base/internal/raw_logging.h \ + webrtc_dsp/absl/base/internal/throw_delegate.h \ + webrtc_dsp/absl/base/attributes.h \ + webrtc_dsp/absl/base/macros.h \ + webrtc_dsp/absl/base/optimization.h \ + webrtc_dsp/absl/base/log_severity.h \ + webrtc_dsp/absl/utility/utility.h \ + webrtc_dsp/rtc_base/string_to_number.h \ + webrtc_dsp/rtc_base/constructormagic.h \ + webrtc_dsp/rtc_base/strings/string_builder.h \ + webrtc_dsp/rtc_base/event_tracer.h \ + webrtc_dsp/rtc_base/stringencode.h \ + webrtc_dsp/rtc_base/memory/aligned_malloc.h \ + webrtc_dsp/rtc_base/event.h \ + webrtc_dsp/rtc_base/ignore_wundef.h \ + webrtc_dsp/rtc_base/stringutils.h \ + webrtc_dsp/rtc_base/arraysize.h \ + webrtc_dsp/rtc_base/swap_queue.h \ + webrtc_dsp/rtc_base/trace_event.h webrtc_dsp/rtc_base/checks.h \ + webrtc_dsp/rtc_base/deprecation.h \ + webrtc_dsp/rtc_base/sanitizer.h \ + webrtc_dsp/rtc_base/scoped_ref_ptr.h \ + webrtc_dsp/rtc_base/logging.h webrtc_dsp/rtc_base/timeutils.h \ + webrtc_dsp/rtc_base/atomicops.h \ + webrtc_dsp/rtc_base/numerics/safe_minmax.h \ + webrtc_dsp/rtc_base/numerics/safe_conversions.h \ + webrtc_dsp/rtc_base/numerics/safe_conversions_impl.h \ + webrtc_dsp/rtc_base/numerics/safe_compare.h \ + webrtc_dsp/rtc_base/system/unused.h \ + webrtc_dsp/rtc_base/system/inline.h \ + webrtc_dsp/rtc_base/system/ignore_warnings.h \ + webrtc_dsp/rtc_base/system/asm_defines.h \ + webrtc_dsp/rtc_base/system/rtc_export.h \ + webrtc_dsp/rtc_base/system/arch.h \ + webrtc_dsp/rtc_base/platform_thread.h \ + webrtc_dsp/rtc_base/platform_thread_types.h \ + webrtc_dsp/rtc_base/protobuf_utils.h \ + webrtc_dsp/rtc_base/thread_annotations.h \ + webrtc_dsp/rtc_base/gtest_prod_util.h \ + webrtc_dsp/rtc_base/function_view.h \ + webrtc_dsp/rtc_base/criticalsection.h \ + webrtc_dsp/rtc_base/refcount.h \ + webrtc_dsp/rtc_base/thread_checker_impl.h \ + webrtc_dsp/rtc_base/compile_assert_c.h \ + webrtc_dsp/rtc_base/type_traits.h \ + webrtc_dsp/rtc_base/platform_file.h \ + webrtc_dsp/rtc_base/refcounter.h \ + webrtc_dsp/rtc_base/thread_checker.h \ + webrtc_dsp/rtc_base/race_checker.h \ + webrtc_dsp/rtc_base/refcountedobject.h \ + webrtc_dsp/third_party/rnnoise/src/rnn_activations.h \ + webrtc_dsp/third_party/rnnoise/src/kiss_fft.h \ + webrtc_dsp/third_party/rnnoise/src/rnn_vad_weights.h \ + webrtc_dsp/api/audio/echo_canceller3_config.h \ + webrtc_dsp/api/audio/echo_control.h \ + webrtc_dsp/api/audio/audio_frame.h \ + webrtc_dsp/api/audio/echo_canceller3_factory.h \ + webrtc_dsp/api/array_view.h \ + webrtc_dsp/modules/third_party/fft/fft.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/bandwidth_info.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/include/isac.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/os_specific_inline.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/entropy_coding.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac_vad.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/settings.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/crc.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac_float_type.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/codec.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_estimator.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/structs.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filter_functions.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_filter.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_analysis.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.h \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_tables.h \ + webrtc_dsp/modules/audio_processing/echo_detector/moving_max.h \ + webrtc_dsp/modules/audio_processing/echo_detector/circular_buffer.h \ + webrtc_dsp/modules/audio_processing/echo_detector/normalized_covariance_estimator.h \ + webrtc_dsp/modules/audio_processing/echo_detector/mean_variance_estimator.h \ + webrtc_dsp/modules/audio_processing/gain_control_for_experimental_agc.h \ + webrtc_dsp/modules/audio_processing/rms_level.h \ + webrtc_dsp/modules/audio_processing/ns/ns_core.h \ + webrtc_dsp/modules/audio_processing/ns/defines.h \ + webrtc_dsp/modules/audio_processing/ns/noise_suppression.h \ + webrtc_dsp/modules/audio_processing/ns/nsx_core.h \ + webrtc_dsp/modules/audio_processing/ns/windows_private.h \ + webrtc_dsp/modules/audio_processing/ns/noise_suppression_x.h \ + webrtc_dsp/modules/audio_processing/ns/nsx_defines.h \ + webrtc_dsp/modules/audio_processing/residual_echo_detector.h \ + webrtc_dsp/modules/audio_processing/audio_processing_impl.h \ + webrtc_dsp/modules/audio_processing/render_queue_item_verifier.h \ + webrtc_dsp/modules/audio_processing/include/audio_generator.h \ + webrtc_dsp/modules/audio_processing/include/config.h \ + webrtc_dsp/modules/audio_processing/include/audio_frame_view.h \ + webrtc_dsp/modules/audio_processing/include/mock_audio_processing.h \ + webrtc_dsp/modules/audio_processing/include/gain_control.h \ + webrtc_dsp/modules/audio_processing/include/audio_generator_factory.h \ + webrtc_dsp/modules/audio_processing/include/aec_dump.h \ + webrtc_dsp/modules/audio_processing/include/audio_processing_statistics.h \ + webrtc_dsp/modules/audio_processing/include/audio_processing.h \ + webrtc_dsp/modules/audio_processing/agc2/interpolated_gain_curve.h \ + webrtc_dsp/modules/audio_processing/agc2/biquad_filter.h \ + webrtc_dsp/modules/audio_processing/agc2/agc2_testing_common.h \ + webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator.h \ + webrtc_dsp/modules/audio_processing/agc2/signal_classifier.h \ + webrtc_dsp/modules/audio_processing/agc2/vector_float_frame.h \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/sequence_buffer.h \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/rnn.h \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/test_utils.h \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_info.h \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/lp_residual.h \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/ring_buffer.h \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/symmetric_matrix_buffer.h \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features.h \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/features_extraction.h \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/common.h \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features_internal.h \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/fft_util.h \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search_internal.h \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search.h \ + webrtc_dsp/modules/audio_processing/agc2/fixed_gain_controller.h \ + webrtc_dsp/modules/audio_processing/agc2/down_sampler.h \ + webrtc_dsp/modules/audio_processing/agc2/saturation_protector.h \ + webrtc_dsp/modules/audio_processing/agc2/agc2_common.h \ + webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h \ + webrtc_dsp/modules/audio_processing/agc2/adaptive_digital_gain_applier.h \ + webrtc_dsp/modules/audio_processing/agc2/vad_with_level.h \ + webrtc_dsp/modules/audio_processing/agc2/limiter_db_gain_curve.h \ + webrtc_dsp/modules/audio_processing/agc2/fixed_digital_level_estimator.h \ + webrtc_dsp/modules/audio_processing/agc2/adaptive_agc.h \ + webrtc_dsp/modules/audio_processing/agc2/gain_applier.h \ + webrtc_dsp/modules/audio_processing/agc2/noise_level_estimator.h \ + webrtc_dsp/modules/audio_processing/agc2/compute_interpolated_gain_curve.h \ + webrtc_dsp/modules/audio_processing/agc2/noise_spectrum_estimator.h \ + webrtc_dsp/modules/audio_processing/agc2/limiter.h \ + webrtc_dsp/modules/audio_processing/transient/transient_detector.h \ + webrtc_dsp/modules/audio_processing/transient/transient_suppressor.h \ + webrtc_dsp/modules/audio_processing/transient/daubechies_8_wavelet_coeffs.h \ + webrtc_dsp/modules/audio_processing/transient/common.h \ + webrtc_dsp/modules/audio_processing/transient/wpd_node.h \ + webrtc_dsp/modules/audio_processing/transient/moving_moments.h \ + webrtc_dsp/modules/audio_processing/transient/wpd_tree.h \ + webrtc_dsp/modules/audio_processing/transient/dyadic_decimator.h \ + webrtc_dsp/modules/audio_processing/noise_suppression_impl.h \ + webrtc_dsp/modules/audio_processing/aec/aec_resampler.h \ + webrtc_dsp/modules/audio_processing/aec/echo_cancellation.h \ + webrtc_dsp/modules/audio_processing/aec/aec_core.h \ + webrtc_dsp/modules/audio_processing/aec/aec_core_optimized_methods.h \ + webrtc_dsp/modules/audio_processing/aec/aec_common.h \ + webrtc_dsp/modules/audio_processing/voice_detection_impl.h \ + webrtc_dsp/modules/audio_processing/agc/legacy/analog_agc.h \ + webrtc_dsp/modules/audio_processing/agc/legacy/gain_control.h \ + webrtc_dsp/modules/audio_processing/agc/legacy/digital_agc.h \ + webrtc_dsp/modules/audio_processing/agc/mock_agc.h \ + webrtc_dsp/modules/audio_processing/agc/loudness_histogram.h \ + webrtc_dsp/modules/audio_processing/agc/gain_map_internal.h \ + webrtc_dsp/modules/audio_processing/agc/utility.h \ + webrtc_dsp/modules/audio_processing/agc/agc_manager_direct.h \ + webrtc_dsp/modules/audio_processing/agc/agc.h \ + webrtc_dsp/modules/audio_processing/common.h \ + webrtc_dsp/modules/audio_processing/audio_buffer.h \ + webrtc_dsp/modules/audio_processing/echo_control_mobile_impl.h \ + webrtc_dsp/modules/audio_processing/splitting_filter.h \ + webrtc_dsp/modules/audio_processing/low_cut_filter.h \ + webrtc_dsp/modules/audio_processing/audio_generator/file_audio_generator.h \ + webrtc_dsp/modules/audio_processing/three_band_filter_bank.h \ + webrtc_dsp/modules/audio_processing/echo_cancellation_impl.h \ + webrtc_dsp/modules/audio_processing/level_estimator_impl.h \ + webrtc_dsp/modules/audio_processing/gain_controller2.h \ + webrtc_dsp/modules/audio_processing/aecm/aecm_core.h \ + webrtc_dsp/modules/audio_processing/aecm/aecm_defines.h \ + webrtc_dsp/modules/audio_processing/aecm/echo_control_mobile.h \ + webrtc_dsp/modules/audio_processing/aec3/downsampled_render_buffer.h \ + webrtc_dsp/modules/audio_processing/aec3/subtractor_output_analyzer.h \ + webrtc_dsp/modules/audio_processing/aec3/residual_echo_estimator.h \ + webrtc_dsp/modules/audio_processing/aec3/shadow_filter_update_gain.h \ + webrtc_dsp/modules/audio_processing/aec3/aec_state.h \ + webrtc_dsp/modules/audio_processing/aec3/suppression_filter.h \ + webrtc_dsp/modules/audio_processing/aec3/block_delay_buffer.h \ + webrtc_dsp/modules/audio_processing/aec3/adaptive_fir_filter.h \ + webrtc_dsp/modules/audio_processing/aec3/cascaded_biquad_filter.h \ + webrtc_dsp/modules/audio_processing/aec3/matched_filter.h \ + webrtc_dsp/modules/audio_processing/aec3/subtractor_output.h \ + webrtc_dsp/modules/audio_processing/aec3/render_signal_analyzer.h \ + webrtc_dsp/modules/audio_processing/aec3/aec3_fft.h \ + webrtc_dsp/modules/audio_processing/aec3/echo_remover_metrics.h \ + webrtc_dsp/modules/audio_processing/aec3/filter_analyzer.h \ + webrtc_dsp/modules/audio_processing/aec3/subtractor.h \ + webrtc_dsp/modules/audio_processing/aec3/echo_path_delay_estimator.h \ + webrtc_dsp/modules/audio_processing/aec3/block_processor_metrics.h \ + webrtc_dsp/modules/audio_processing/aec3/fft_data.h \ + webrtc_dsp/modules/audio_processing/aec3/render_delay_controller_metrics.h \ + webrtc_dsp/modules/audio_processing/aec3/comfort_noise_generator.h \ + webrtc_dsp/modules/audio_processing/aec3/erl_estimator.h \ + webrtc_dsp/modules/audio_processing/aec3/echo_remover.h \ + webrtc_dsp/modules/audio_processing/aec3/matrix_buffer.h \ + webrtc_dsp/modules/audio_processing/aec3/reverb_model_estimator.h \ + webrtc_dsp/modules/audio_processing/aec3/echo_path_variability.h \ + webrtc_dsp/modules/audio_processing/aec3/moving_average.h \ + webrtc_dsp/modules/audio_processing/aec3/render_reverb_model.h \ + webrtc_dsp/modules/audio_processing/aec3/render_delay_controller.h \ + webrtc_dsp/modules/audio_processing/aec3/suppression_gain.h \ + webrtc_dsp/modules/audio_processing/aec3/erle_estimator.h \ + webrtc_dsp/modules/audio_processing/aec3/subband_erle_estimator.h \ + webrtc_dsp/modules/audio_processing/aec3/block_processor.h \ + webrtc_dsp/modules/audio_processing/aec3/fullband_erle_estimator.h \ + webrtc_dsp/modules/audio_processing/aec3/stationarity_estimator.h \ + webrtc_dsp/modules/audio_processing/aec3/echo_canceller3.h \ + webrtc_dsp/modules/audio_processing/aec3/skew_estimator.h \ + webrtc_dsp/modules/audio_processing/aec3/render_buffer.h \ + webrtc_dsp/modules/audio_processing/aec3/reverb_model_fallback.h \ + webrtc_dsp/modules/audio_processing/aec3/vector_buffer.h \ + webrtc_dsp/modules/audio_processing/aec3/reverb_frequency_response.h \ + webrtc_dsp/modules/audio_processing/aec3/echo_audibility.h \ + webrtc_dsp/modules/audio_processing/aec3/fft_buffer.h \ + webrtc_dsp/modules/audio_processing/aec3/aec3_common.h \ + webrtc_dsp/modules/audio_processing/aec3/vector_math.h \ + webrtc_dsp/modules/audio_processing/aec3/decimator.h \ + webrtc_dsp/modules/audio_processing/aec3/frame_blocker.h \ + webrtc_dsp/modules/audio_processing/aec3/block_framer.h \ + webrtc_dsp/modules/audio_processing/aec3/suppression_gain_limiter.h \ + webrtc_dsp/modules/audio_processing/aec3/delay_estimate.h \ + webrtc_dsp/modules/audio_processing/aec3/reverb_model.h \ + webrtc_dsp/modules/audio_processing/aec3/main_filter_update_gain.h \ + webrtc_dsp/modules/audio_processing/aec3/matched_filter_lag_aggregator.h \ + webrtc_dsp/modules/audio_processing/aec3/reverb_decay_estimator.h \ + webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer.h \ + webrtc_dsp/modules/audio_processing/gain_control_impl.h \ + webrtc_dsp/modules/audio_processing/typing_detection.h \ + webrtc_dsp/modules/audio_processing/logging/apm_data_dumper.h \ + webrtc_dsp/modules/audio_processing/vad/vad_audio_proc_internal.h \ + webrtc_dsp/modules/audio_processing/vad/vad_circular_buffer.h \ + webrtc_dsp/modules/audio_processing/vad/pitch_based_vad.h \ + webrtc_dsp/modules/audio_processing/vad/pole_zero_filter.h \ + webrtc_dsp/modules/audio_processing/vad/gmm.h \ + webrtc_dsp/modules/audio_processing/vad/common.h \ + webrtc_dsp/modules/audio_processing/vad/vad_audio_proc.h \ + webrtc_dsp/modules/audio_processing/vad/voice_gmm_tables.h \ + webrtc_dsp/modules/audio_processing/vad/noise_gmm_tables.h \ + webrtc_dsp/modules/audio_processing/vad/pitch_internal.h \ + webrtc_dsp/modules/audio_processing/vad/standalone_vad.h \ + webrtc_dsp/modules/audio_processing/vad/voice_activity_detector.h \ + webrtc_dsp/modules/audio_processing/utility/ooura_fft_tables_neon_sse2.h \ + webrtc_dsp/modules/audio_processing/utility/delay_estimator_internal.h \ + webrtc_dsp/modules/audio_processing/utility/ooura_fft.h \ + webrtc_dsp/modules/audio_processing/utility/block_mean_calculator.h \ + webrtc_dsp/modules/audio_processing/utility/delay_estimator.h \ + webrtc_dsp/modules/audio_processing/utility/ooura_fft_tables_common.h \ + webrtc_dsp/modules/audio_processing/utility/delay_estimator_wrapper.h \ + webrtc_dsp/common_audio/mocks/mock_smoothing_filter.h \ + webrtc_dsp/common_audio/wav_file.h \ + webrtc_dsp/common_audio/sparse_fir_filter.h \ + webrtc_dsp/common_audio/fir_filter_sse.h \ + webrtc_dsp/common_audio/window_generator.h \ + webrtc_dsp/common_audio/ring_buffer.h \ + webrtc_dsp/common_audio/fir_filter.h \ + webrtc_dsp/common_audio/include/audio_util.h \ + webrtc_dsp/common_audio/real_fourier_ooura.h \ + webrtc_dsp/common_audio/smoothing_filter.h \ + webrtc_dsp/common_audio/resampler/sinc_resampler.h \ + webrtc_dsp/common_audio/resampler/include/push_resampler.h \ + webrtc_dsp/common_audio/resampler/include/resampler.h \ + webrtc_dsp/common_audio/resampler/push_sinc_resampler.h \ + webrtc_dsp/common_audio/resampler/sinusoidal_linear_chirp_source.h \ + webrtc_dsp/common_audio/fir_filter_factory.h \ + webrtc_dsp/common_audio/audio_converter.h \ + webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor.h \ + webrtc_dsp/common_audio/third_party/fft4g/fft4g.h \ + webrtc_dsp/common_audio/channel_buffer.h \ + webrtc_dsp/common_audio/real_fourier.h \ + webrtc_dsp/common_audio/fir_filter_neon.h \ + webrtc_dsp/common_audio/fir_filter_c.h \ + webrtc_dsp/common_audio/signal_processing/complex_fft_tables.h \ + webrtc_dsp/common_audio/signal_processing/include/signal_processing_library.h \ + webrtc_dsp/common_audio/signal_processing/include/real_fft.h \ + webrtc_dsp/common_audio/signal_processing/include/spl_inl.h \ + webrtc_dsp/common_audio/signal_processing/include/spl_inl_armv7.h \ + webrtc_dsp/common_audio/signal_processing/dot_product_with_scale.h \ + webrtc_dsp/common_audio/signal_processing/resample_by_2_internal.h \ + webrtc_dsp/common_audio/wav_header.h \ + webrtc_dsp/common_audio/vad/vad_core.h \ + webrtc_dsp/common_audio/vad/include/vad.h \ + webrtc_dsp/common_audio/vad/include/webrtc_vad.h \ + webrtc_dsp/common_audio/vad/vad_gmm.h \ + webrtc_dsp/common_audio/vad/vad_sp.h \ + webrtc_dsp/common_audio/vad/vad_filterbank.h VoIPController.h \ + Buffers.h BlockingQueue.h PrivateDefines.h CongestionControl.h \ EchoCanceller.h JitterBuffer.h logging.h threading.h \ MediaStreamItf.h MessageThread.h NetworkSocket.h OpusDecoder.h \ OpusEncoder.h PacketReassembler.h VoIPServerConfig.h \ audio/AudioIO.h audio/AudioInput.h audio/AudioOutput.h \ audio/Resampler.h os/posix/NetworkSocketPosix.h \ + video/VideoSource.h video/VideoRenderer.h json11.hpp utils.h \ os/darwin/AudioInputAudioUnit.h \ os/darwin/AudioOutputAudioUnit.h os/darwin/AudioUnitIO.h \ os/darwin/AudioInputAudioUnitOSX.h \ os/darwin/AudioOutputAudioUnitOSX.h os/darwin/DarwinSpecific.h \ os/linux/AudioInputALSA.h os/linux/AudioOutputALSA.h \ os/linux/AudioOutputPulse.h os/linux/AudioInputPulse.h \ - os/linux/AudioPulse.h os/linux/PulseFunctions.h + os/linux/AudioPulse.h os/linux/PulseFunctions.h \ + audio/AudioIOCallback.h am__dirstamp = $(am__leading_dot)dirstamp @TARGET_OS_OSX_TRUE@am__objects_1 = os/darwin/AudioInputAudioUnit.lo \ @TARGET_OS_OSX_TRUE@ os/darwin/AudioOutputAudioUnit.lo \ @@ -495,94 +1436,300 @@ am__dirstamp = $(am__leading_dot)dirstamp @TARGET_OS_OSX_FALSE@@WITH_PULSE_TRUE@am__objects_3 = os/linux/AudioOutputPulse.lo \ @TARGET_OS_OSX_FALSE@@WITH_PULSE_TRUE@ os/linux/AudioInputPulse.lo \ @TARGET_OS_OSX_FALSE@@WITH_PULSE_TRUE@ os/linux/AudioPulse.lo -@ENABLE_DSP_TRUE@am__objects_4 = webrtc_dsp/webrtc/common_audio/ring_buffer.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/auto_corr_to_refl_coef.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/auto_correlation.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/complex_fft.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/copy_set_operations.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/cross_correlation.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/division_operations.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/dot_product_with_scale.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/downsample_fast.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/energy.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/filter_ar.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/filter_ar_fast_q12.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/filter_ma_fast_q12.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/get_hanning_window.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/get_scaling_square.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/ilbc_specific_functions.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/levinson_durbin.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/lpc_to_refl_coef.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/min_max_operations.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/randomization_functions.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/real_fft.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/refl_coef_to_lpc.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/resample.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/resample_48khz.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2_internal.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/resample_fractional.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/spl_init.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/spl_inl.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/splitting_filter_impl.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/sqrt_of_one_minus_x_squared.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/vector_scaling_operations.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/base/checks.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core_c.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aecm/echo_control_mobile.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_wrapper.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/three_band_filter_bank.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/splitting_filter.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/system_wrappers/source/cpu_features.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/sparse_fir_filter.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/channel_buffer.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/audio_util.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/block_mean_calculator.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/logging/apm_data_dumper.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aec/aec_resampler.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aec/echo_cancellation.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/wav_header.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/wav_file.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/base/stringutils.lo -@ENABLE_DSP_TRUE@@TARGET_CPU_X86_TRUE@am__objects_5 = webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_sse2.lo \ -@ENABLE_DSP_TRUE@@TARGET_CPU_X86_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_sse2.lo -@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_TRUE@am__objects_6 = webrtc_dsp/webrtc/common_audio/signal_processing/complex_bit_reverse_arm.lo \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt_floor_arm.lo -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@am__objects_7 = webrtc_dsp/webrtc/common_audio/signal_processing/cross_correlation_neon.lo \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/downsample_fast_neon.lo \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@ webrtc_dsp/webrtc/common_audio/signal_processing/min_max_operations_neon.lo \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_neon.lo \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core_neon.lo \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core_neon.lo \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_neon.lo -@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_FALSE@am__objects_8 = webrtc_dsp/webrtc/common_audio/signal_processing/complex_bit_reverse.lo \ -@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_FALSE@ webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt_floor.lo -@ENABLE_DSP_TRUE@am__objects_9 = webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression_x.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/ns_core.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core_c.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/common_audio/fft4g.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/analog_agc.lo \ -@ENABLE_DSP_TRUE@ webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/digital_agc.lo -am__objects_10 = VoIPController.lo Buffers.lo CongestionControl.lo \ +@ENABLE_DSP_TRUE@am__objects_4 = ./webrtc_dsp/system_wrappers/source/field_trial.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/system_wrappers/source/metrics.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/system_wrappers/source/cpu_features.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/absl/strings/internal/memutil.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/absl/strings/string_view.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/absl/strings/ascii.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/absl/types/bad_optional_access.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/absl/types/optional.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/absl/base/internal/raw_logging.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/absl/base/internal/throw_delegate.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/race_checker.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/strings/string_builder.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/memory/aligned_malloc.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/timeutils.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/platform_file.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/string_to_number.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/thread_checker_impl.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/stringencode.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/stringutils.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/checks.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/platform_thread.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/logging_webrtc.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/criticalsection.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/platform_thread_types.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/event.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/rtc_base/event_tracer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/third_party/rnnoise/src/rnn_vad_weights.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/third_party/rnnoise/src/kiss_fft.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/api/audio/audio_frame.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/api/audio/echo_canceller3_config.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/api/audio/echo_canceller3_factory.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/third_party/fft/fft.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines_logist.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filterbanks.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/transform.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_filter.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filter_functions.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/decode.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lattice.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/intialize.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_tables.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_analysis.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines_hist.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/entropy_coding.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac_vad.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/crc.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/decode_bwe.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/rms_level.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/echo_detector/normalized_covariance_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/echo_detector/moving_max.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/echo_detector/circular_buffer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/echo_detector/mean_variance_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/splitting_filter.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/gain_control_impl.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/ns/nsx_core.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/ns/noise_suppression_x.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/ns/nsx_core_c.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/ns/ns_core.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/ns/noise_suppression.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/audio_buffer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/typing_detection.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/include/audio_processing_statistics.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/include/audio_generator_factory.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/include/aec_dump.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/include/audio_processing.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/include/config.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/interpolated_gain_curve.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/agc2_common.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/gain_applier.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/adaptive_agc.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/adaptive_digital_gain_applier.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/limiter.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/saturation_protector.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features_internal.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/rnn.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search_internal.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/features_extraction.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/fft_util.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/lp_residual.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/vector_float_frame.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/noise_level_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/agc2_testing_common.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/fixed_digital_level_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/fixed_gain_controller.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/vad_with_level.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/limiter_db_gain_curve.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/down_sampler.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/signal_classifier.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/noise_spectrum_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/compute_interpolated_gain_curve.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/biquad_filter.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/transient/moving_moments.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/transient/wpd_tree.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/transient/wpd_node.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/transient/transient_suppressor.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/transient/transient_detector.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/low_cut_filter.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/level_estimator_impl.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/three_band_filter_bank.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec/echo_cancellation.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec/aec_resampler.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec/aec_core.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/voice_detection_impl.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/echo_cancellation_impl.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/gain_control_for_experimental_agc.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc/agc.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc/loudness_histogram.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc/agc_manager_direct.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc/legacy/analog_agc.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc/legacy/digital_agc.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/agc/utility.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/audio_processing_impl.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/audio_generator/file_audio_generator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/gain_controller2.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/residual_echo_detector.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/noise_suppression_impl.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aecm/aecm_core.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aecm/aecm_core_c.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aecm/echo_control_mobile.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/render_reverb_model.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/reverb_model_fallback.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/echo_remover_metrics.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/matched_filter_lag_aggregator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer2.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/echo_path_variability.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/frame_blocker.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/subtractor.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/aec3_fft.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/fullband_erle_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/suppression_filter.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/block_processor.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/subband_erle_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller_metrics.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/vector_buffer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/erl_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/aec_state.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/adaptive_fir_filter.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/skew_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/echo_path_delay_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/block_framer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/erle_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/reverb_model.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/cascaded_biquad_filter.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/render_buffer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/subtractor_output.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/stationarity_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/render_signal_analyzer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/subtractor_output_analyzer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/suppression_gain.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/echo_audibility.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/block_processor_metrics.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/moving_average.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/reverb_model_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/aec3_common.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/residual_echo_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/matched_filter.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/reverb_decay_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller2.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/suppression_gain_limiter.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/main_filter_update_gain.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/echo_remover.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/downsampled_render_buffer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/matrix_buffer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/block_processor2.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/echo_canceller3.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/block_delay_buffer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/fft_buffer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/comfort_noise_generator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/shadow_filter_update_gain.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/filter_analyzer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/reverb_frequency_response.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/aec3/decimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/echo_control_mobile_impl.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/logging/apm_data_dumper.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/vad/voice_activity_detector.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/vad/standalone_vad.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/vad/pitch_internal.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/vad/vad_circular_buffer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/vad/vad_audio_proc.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/vad/pole_zero_filter.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/vad/pitch_based_vad.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/vad/gmm.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/utility/ooura_fft.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/utility/delay_estimator_wrapper.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/utility/delay_estimator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/modules/audio_processing/utility/block_mean_calculator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/window_generator.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/channel_buffer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/fir_filter_factory.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/wav_header.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/real_fourier_ooura.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/audio_util.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/fir_filter_sse.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/resampler/push_sinc_resampler.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/resampler/resampler.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/resampler/sinc_resampler_sse.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/resampler/push_resampler.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/resampler/sinc_resampler.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/resampler/sinusoidal_linear_chirp_source.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/wav_file.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/third_party/fft4g/fft4g.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/audio_converter.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/real_fourier.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/sparse_fir_filter.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/smoothing_filter.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/fir_filter_c.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/ring_buffer.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/complex_fft.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/filter_ma_fast_q12.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/splitting_filter1.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/levinson_durbin.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/dot_product_with_scale.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/auto_corr_to_refl_coef.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/resample_by_2_internal.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/energy.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/sqrt_of_one_minus_x_squared.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/downsample_fast.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/filter_ar_fast_q12.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/spl_init.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/lpc_to_refl_coef.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/cross_correlation.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/division_operations.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/auto_correlation.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/get_scaling_square.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/resample.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/min_max_operations.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/refl_coef_to_lpc.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/filter_ar.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/vector_scaling_operations.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/resample_fractional.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/real_fft.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/ilbc_specific_functions.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/randomization_functions.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/copy_set_operations.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/resample_by_2.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/get_hanning_window.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/resample_48khz.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/spl_inl.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/signal_processing/spl_sqrt.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/vad/vad_sp.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/vad/vad.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/vad/webrtc_vad.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/vad/vad_filterbank.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/vad/vad_core.lo \ +@ENABLE_DSP_TRUE@ ./webrtc_dsp/common_audio/vad/vad_gmm.lo +@ENABLE_DSP_TRUE@@TARGET_OS_OSX_TRUE@am__objects_5 = webrtc_dsp/rtc_base/logging_mac.lo +@ENABLE_DSP_TRUE@@TARGET_CPU_X86_TRUE@am__objects_6 = webrtc_dsp/modules/audio_processing/aec/aec_core_sse2.lo \ +@ENABLE_DSP_TRUE@@TARGET_CPU_X86_TRUE@ webrtc_dsp/modules/audio_processing/utility/ooura_fft_sse2.lo +@ENABLE_AUDIO_CALLBACK_TRUE@@ENABLE_DSP_TRUE@am__objects_7 = audio/AudioIOCallback.lo +@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_TRUE@am__objects_8 = webrtc_dsp/common_audio/signal_processing/complex_bit_reverse_arm.lo \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_TRUE@ webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor_arm.lo +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@am__objects_9 = webrtc_dsp/common_audio/signal_processing/cross_correlation_neon.lo \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@ webrtc_dsp/common_audio/signal_processing/downsample_fast_neon.lo \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@ webrtc_dsp/common_audio/signal_processing/min_max_operations_neon.lo \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@ webrtc_dsp/modules/audio_processing/aec/aec_core_neon.lo \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@ webrtc_dsp/modules/audio_processing/aecm/aecm_core_neon.lo \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@ webrtc_dsp/modules/audio_processing/ns/nsx_core_neon.lo \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARMV7_TRUE@@TARGET_CPU_ARM_TRUE@ webrtc_dsp/modules/audio_processing/utility/ooura_fft_neon.lo +@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_FALSE@am__objects_10 = webrtc_dsp/common_audio/signal_processing/complex_bit_reverse.lo \ +@ENABLE_DSP_TRUE@@TARGET_CPU_ARM_FALSE@ webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor.lo +am__objects_11 = +am__objects_12 = VoIPController.lo Buffers.lo CongestionControl.lo \ EchoCanceller.lo JitterBuffer.lo logging.lo MediaStreamItf.lo \ MessageThread.lo NetworkSocket.lo OpusDecoder.lo \ OpusEncoder.lo PacketReassembler.lo VoIPGroupController.lo \ VoIPServerConfig.lo audio/AudioIO.lo audio/AudioInput.lo \ audio/AudioOutput.lo audio/Resampler.lo \ - os/posix/NetworkSocketPosix.lo $(am__objects_1) \ + os/posix/NetworkSocketPosix.lo video/VideoSource.lo \ + video/VideoRenderer.lo json11.lo $(am__objects_1) \ $(am__objects_2) $(am__objects_3) $(am__objects_4) \ $(am__objects_5) $(am__objects_6) $(am__objects_7) \ - $(am__objects_8) $(am__objects_9) -am__objects_11 = -am__objects_12 = $(am__objects_11) $(am__objects_11) $(am__objects_11) -am_libtgvoip_la_OBJECTS = $(am__objects_10) $(am__objects_12) + $(am__objects_8) $(am__objects_9) $(am__objects_10) \ + $(am__objects_11) +am__objects_13 = $(am__objects_11) $(am__objects_11) $(am__objects_11) \ + $(am__objects_11) +am_libtgvoip_la_OBJECTS = $(am__objects_12) $(am__objects_13) libtgvoip_la_OBJECTS = $(am_libtgvoip_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -611,9 +1758,275 @@ am__depfiles_remade = ./$(DEPDIR)/Buffers.Plo \ ./$(DEPDIR)/OpusEncoder.Plo ./$(DEPDIR)/PacketReassembler.Plo \ ./$(DEPDIR)/VoIPController.Plo \ ./$(DEPDIR)/VoIPGroupController.Plo \ - ./$(DEPDIR)/VoIPServerConfig.Plo ./$(DEPDIR)/logging.Plo \ - audio/$(DEPDIR)/AudioIO.Plo audio/$(DEPDIR)/AudioInput.Plo \ - audio/$(DEPDIR)/AudioOutput.Plo audio/$(DEPDIR)/Resampler.Plo \ + ./$(DEPDIR)/VoIPServerConfig.Plo ./$(DEPDIR)/json11.Plo \ + ./$(DEPDIR)/logging.Plo \ + ./webrtc_dsp/absl/base/internal/$(DEPDIR)/raw_logging.Plo \ + ./webrtc_dsp/absl/base/internal/$(DEPDIR)/throw_delegate.Plo \ + ./webrtc_dsp/absl/strings/$(DEPDIR)/ascii.Plo \ + ./webrtc_dsp/absl/strings/$(DEPDIR)/string_view.Plo \ + ./webrtc_dsp/absl/strings/internal/$(DEPDIR)/memutil.Plo \ + ./webrtc_dsp/absl/types/$(DEPDIR)/bad_optional_access.Plo \ + ./webrtc_dsp/absl/types/$(DEPDIR)/optional.Plo \ + ./webrtc_dsp/api/audio/$(DEPDIR)/audio_frame.Plo \ + ./webrtc_dsp/api/audio/$(DEPDIR)/echo_canceller3_config.Plo \ + ./webrtc_dsp/api/audio/$(DEPDIR)/echo_canceller3_factory.Plo \ + ./webrtc_dsp/common_audio/$(DEPDIR)/audio_converter.Plo \ + ./webrtc_dsp/common_audio/$(DEPDIR)/audio_util.Plo \ + ./webrtc_dsp/common_audio/$(DEPDIR)/channel_buffer.Plo \ + ./webrtc_dsp/common_audio/$(DEPDIR)/fir_filter_c.Plo \ + ./webrtc_dsp/common_audio/$(DEPDIR)/fir_filter_factory.Plo \ + ./webrtc_dsp/common_audio/$(DEPDIR)/fir_filter_sse.Plo \ + ./webrtc_dsp/common_audio/$(DEPDIR)/real_fourier.Plo \ + ./webrtc_dsp/common_audio/$(DEPDIR)/real_fourier_ooura.Plo \ + ./webrtc_dsp/common_audio/$(DEPDIR)/ring_buffer.Plo \ + ./webrtc_dsp/common_audio/$(DEPDIR)/smoothing_filter.Plo \ + ./webrtc_dsp/common_audio/$(DEPDIR)/sparse_fir_filter.Plo \ + ./webrtc_dsp/common_audio/$(DEPDIR)/wav_file.Plo \ + ./webrtc_dsp/common_audio/$(DEPDIR)/wav_header.Plo \ + ./webrtc_dsp/common_audio/$(DEPDIR)/window_generator.Plo \ + ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/push_resampler.Plo \ + ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/push_sinc_resampler.Plo \ + ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/resampler.Plo \ + ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/sinc_resampler.Plo \ + ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/sinc_resampler_sse.Plo \ + ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/sinusoidal_linear_chirp_source.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/auto_corr_to_refl_coef.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/auto_correlation.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/complex_fft.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/copy_set_operations.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/cross_correlation.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/division_operations.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/dot_product_with_scale.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/downsample_fast.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/energy.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/filter_ar.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/filter_ar_fast_q12.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/filter_ma_fast_q12.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/get_hanning_window.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/get_scaling_square.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/ilbc_specific_functions.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/levinson_durbin.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/lpc_to_refl_coef.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/min_max_operations.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/randomization_functions.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/real_fft.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/refl_coef_to_lpc.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_48khz.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_by_2.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_by_2_internal.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_fractional.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/spl_init.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/spl_inl.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/spl_sqrt.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/splitting_filter1.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/sqrt_of_one_minus_x_squared.Plo \ + ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/vector_scaling_operations.Plo \ + ./webrtc_dsp/common_audio/third_party/fft4g/$(DEPDIR)/fft4g.Plo \ + ./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad.Plo \ + ./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_core.Plo \ + ./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_filterbank.Plo \ + ./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_gmm.Plo \ + ./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_sp.Plo \ + ./webrtc_dsp/common_audio/vad/$(DEPDIR)/webrtc_vad.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/arith_routines.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/arith_routines_hist.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/arith_routines_logist.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/bandwidth_estimator.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/crc.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/decode.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/decode_bwe.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/encode.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/encode_lpc_swb.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/entropy_coding.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/filter_functions.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/filterbanks.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/intialize.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/isac.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/isac_vad.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lattice.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_analysis.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_gain_swb_tables.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_shape_swb12_tables.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_shape_swb16_tables.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_tables.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_estimator.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_filter.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_gain_tables.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_lag_tables.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/spectrum_ar_model_tables.Plo \ + ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/transform.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/audio_buffer.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/audio_processing_impl.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/echo_cancellation_impl.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/echo_control_mobile_impl.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/gain_control_for_experimental_agc.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/gain_control_impl.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/gain_controller2.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/level_estimator_impl.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/low_cut_filter.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/noise_suppression_impl.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/residual_echo_detector.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/rms_level.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/splitting_filter.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/three_band_filter_bank.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/typing_detection.Plo \ + ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/voice_detection_impl.Plo \ + ./webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_core.Plo \ + ./webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_resampler.Plo \ + ./webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/echo_cancellation.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/adaptive_fir_filter.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/aec3_common.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/aec3_fft.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/aec_state.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_delay_buffer.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_framer.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_processor.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_processor2.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_processor_metrics.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/cascaded_biquad_filter.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/comfort_noise_generator.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/decimator.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/downsampled_render_buffer.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_audibility.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_canceller3.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_path_delay_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_path_variability.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_remover.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_remover_metrics.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/erl_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/erle_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/fft_buffer.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/filter_analyzer.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/frame_blocker.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/fullband_erle_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/main_filter_update_gain.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/matched_filter.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/matched_filter_lag_aggregator.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/matrix_buffer.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/moving_average.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_buffer.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_buffer.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_buffer2.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_controller.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_controller2.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_controller_metrics.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_reverb_model.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_signal_analyzer.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/residual_echo_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_decay_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_frequency_response.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_model.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_model_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_model_fallback.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/shadow_filter_update_gain.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/skew_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/stationarity_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subband_erle_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subtractor.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subtractor_output.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subtractor_output_analyzer.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/suppression_filter.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/suppression_gain.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/suppression_gain_limiter.Plo \ + ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/vector_buffer.Plo \ + ./webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/aecm_core.Plo \ + ./webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_c.Plo \ + ./webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/echo_control_mobile.Plo \ + ./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/agc.Plo \ + ./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/agc_manager_direct.Plo \ + ./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/loudness_histogram.Plo \ + ./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/utility.Plo \ + ./webrtc_dsp/modules/audio_processing/agc/legacy/$(DEPDIR)/analog_agc.Plo \ + ./webrtc_dsp/modules/audio_processing/agc/legacy/$(DEPDIR)/digital_agc.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_agc.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_digital_gain_applier.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_mode_level_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_mode_level_estimator_agc.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/agc2_common.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/agc2_testing_common.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/biquad_filter.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/compute_interpolated_gain_curve.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/down_sampler.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/fixed_digital_level_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/fixed_gain_controller.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/gain_applier.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/interpolated_gain_curve.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/limiter.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/limiter_db_gain_curve.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/noise_level_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/noise_spectrum_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/saturation_protector.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/signal_classifier.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/vad_with_level.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/vector_float_frame.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/features_extraction.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/fft_util.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/lp_residual.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/pitch_search.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/pitch_search_internal.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/rnn.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/spectral_features.Plo \ + ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/spectral_features_internal.Plo \ + ./webrtc_dsp/modules/audio_processing/audio_generator/$(DEPDIR)/file_audio_generator.Plo \ + ./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/circular_buffer.Plo \ + ./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/mean_variance_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/moving_max.Plo \ + ./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/normalized_covariance_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/aec_dump.Plo \ + ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/audio_generator_factory.Plo \ + ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/audio_processing.Plo \ + ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/audio_processing_statistics.Plo \ + ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/config.Plo \ + ./webrtc_dsp/modules/audio_processing/logging/$(DEPDIR)/apm_data_dumper.Plo \ + ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/noise_suppression.Plo \ + ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/noise_suppression_x.Plo \ + ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/ns_core.Plo \ + ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/nsx_core.Plo \ + ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/nsx_core_c.Plo \ + ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/moving_moments.Plo \ + ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/transient_detector.Plo \ + ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/transient_suppressor.Plo \ + ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/wpd_node.Plo \ + ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/wpd_tree.Plo \ + ./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/block_mean_calculator.Plo \ + ./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/delay_estimator.Plo \ + ./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/delay_estimator_wrapper.Plo \ + ./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/ooura_fft.Plo \ + ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/gmm.Plo \ + ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/pitch_based_vad.Plo \ + ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/pitch_internal.Plo \ + ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/pole_zero_filter.Plo \ + ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/standalone_vad.Plo \ + ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/vad_audio_proc.Plo \ + ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/vad_circular_buffer.Plo \ + ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/voice_activity_detector.Plo \ + ./webrtc_dsp/modules/third_party/fft/$(DEPDIR)/fft.Plo \ + ./webrtc_dsp/rtc_base/$(DEPDIR)/checks.Plo \ + ./webrtc_dsp/rtc_base/$(DEPDIR)/criticalsection.Plo \ + ./webrtc_dsp/rtc_base/$(DEPDIR)/event.Plo \ + ./webrtc_dsp/rtc_base/$(DEPDIR)/event_tracer.Plo \ + ./webrtc_dsp/rtc_base/$(DEPDIR)/logging_webrtc.Plo \ + ./webrtc_dsp/rtc_base/$(DEPDIR)/platform_file.Plo \ + ./webrtc_dsp/rtc_base/$(DEPDIR)/platform_thread.Plo \ + ./webrtc_dsp/rtc_base/$(DEPDIR)/platform_thread_types.Plo \ + ./webrtc_dsp/rtc_base/$(DEPDIR)/race_checker.Plo \ + ./webrtc_dsp/rtc_base/$(DEPDIR)/string_to_number.Plo \ + ./webrtc_dsp/rtc_base/$(DEPDIR)/stringencode.Plo \ + ./webrtc_dsp/rtc_base/$(DEPDIR)/stringutils.Plo \ + ./webrtc_dsp/rtc_base/$(DEPDIR)/thread_checker_impl.Plo \ + ./webrtc_dsp/rtc_base/$(DEPDIR)/timeutils.Plo \ + ./webrtc_dsp/rtc_base/memory/$(DEPDIR)/aligned_malloc.Plo \ + ./webrtc_dsp/rtc_base/strings/$(DEPDIR)/string_builder.Plo \ + ./webrtc_dsp/system_wrappers/source/$(DEPDIR)/cpu_features.Plo \ + ./webrtc_dsp/system_wrappers/source/$(DEPDIR)/field_trial.Plo \ + ./webrtc_dsp/system_wrappers/source/$(DEPDIR)/metrics.Plo \ + ./webrtc_dsp/third_party/rnnoise/src/$(DEPDIR)/kiss_fft.Plo \ + ./webrtc_dsp/third_party/rnnoise/src/$(DEPDIR)/rnn_vad_weights.Plo \ + audio/$(DEPDIR)/AudioIO.Plo \ + audio/$(DEPDIR)/AudioIOCallback.Plo \ + audio/$(DEPDIR)/AudioInput.Plo audio/$(DEPDIR)/AudioOutput.Plo \ + audio/$(DEPDIR)/Resampler.Plo \ os/darwin/$(DEPDIR)/AudioInputAudioUnit.Plo \ os/darwin/$(DEPDIR)/AudioInputAudioUnitOSX.Plo \ os/darwin/$(DEPDIR)/AudioOutputAudioUnit.Plo \ @@ -626,81 +2039,22 @@ am__depfiles_remade = ./$(DEPDIR)/Buffers.Plo \ os/linux/$(DEPDIR)/AudioOutputPulse.Plo \ os/linux/$(DEPDIR)/AudioPulse.Plo \ os/posix/$(DEPDIR)/NetworkSocketPosix.Plo \ - webrtc_dsp/webrtc/base/$(DEPDIR)/checks.Plo \ - webrtc_dsp/webrtc/base/$(DEPDIR)/stringutils.Plo \ - webrtc_dsp/webrtc/common_audio/$(DEPDIR)/audio_util.Plo \ - webrtc_dsp/webrtc/common_audio/$(DEPDIR)/channel_buffer.Plo \ - webrtc_dsp/webrtc/common_audio/$(DEPDIR)/fft4g.Plo \ - webrtc_dsp/webrtc/common_audio/$(DEPDIR)/ring_buffer.Plo \ - webrtc_dsp/webrtc/common_audio/$(DEPDIR)/sparse_fir_filter.Plo \ - webrtc_dsp/webrtc/common_audio/$(DEPDIR)/wav_file.Plo \ - webrtc_dsp/webrtc/common_audio/$(DEPDIR)/wav_header.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/auto_corr_to_refl_coef.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/auto_correlation.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse_arm.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/complex_fft.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/copy_set_operations.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/cross_correlation.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/cross_correlation_neon.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/division_operations.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/dot_product_with_scale.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/downsample_fast.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/downsample_fast_neon.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/energy.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/filter_ar.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/filter_ar_fast_q12.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/filter_ma_fast_q12.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/get_hanning_window.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/get_scaling_square.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/ilbc_specific_functions.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/levinson_durbin.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/lpc_to_refl_coef.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/min_max_operations.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/min_max_operations_neon.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/randomization_functions.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/real_fft.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/refl_coef_to_lpc.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_48khz.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_by_2.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_by_2_internal.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_fractional.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_init.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_inl.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_sqrt.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_sqrt_floor.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_sqrt_floor_arm.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/splitting_filter_impl.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/sqrt_of_one_minus_x_squared.Plo \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/vector_scaling_operations.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/$(DEPDIR)/splitting_filter.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/$(DEPDIR)/three_band_filter_bank.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_core.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_core_neon.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_core_sse2.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_resampler.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/echo_cancellation.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/aecm_core.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_c.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_neon.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/echo_control_mobile.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(DEPDIR)/analog_agc.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(DEPDIR)/digital_agc.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/logging/$(DEPDIR)/apm_data_dumper.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/noise_suppression.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/noise_suppression_x.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/ns_core.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/nsx_core.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/nsx_core_c.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/nsx_core_neon.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/block_mean_calculator.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/delay_estimator.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/delay_estimator_wrapper.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/ooura_fft.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_neon.Plo \ - webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_sse2.Plo \ - webrtc_dsp/webrtc/system_wrappers/source/$(DEPDIR)/cpu_features.Plo + video/$(DEPDIR)/VideoRenderer.Plo \ + video/$(DEPDIR)/VideoSource.Plo \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse.Plo \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse_arm.Plo \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/cross_correlation_neon.Plo \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/downsample_fast_neon.Plo \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/min_max_operations_neon.Plo \ + webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(DEPDIR)/spl_sqrt_floor.Plo \ + webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(DEPDIR)/spl_sqrt_floor_arm.Plo \ + webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_core_neon.Plo \ + webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_core_sse2.Plo \ + webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_neon.Plo \ + webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/nsx_core_neon.Plo \ + webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_neon.Plo \ + webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_sse2.Plo \ + webrtc_dsp/rtc_base/$(DEPDIR)/logging_mac.Plo am__mv = mv -f CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) @@ -780,13 +2134,15 @@ am__nobase_tgvoipinclude_HEADERS_DIST = VoIPController.h Buffers.h \ OpusEncoder.h PacketReassembler.h VoIPServerConfig.h \ audio/AudioIO.h audio/AudioInput.h audio/AudioOutput.h \ audio/Resampler.h os/posix/NetworkSocketPosix.h \ + video/VideoSource.h video/VideoRenderer.h json11.hpp utils.h \ os/darwin/AudioInputAudioUnit.h \ os/darwin/AudioOutputAudioUnit.h os/darwin/AudioUnitIO.h \ os/darwin/AudioInputAudioUnitOSX.h \ os/darwin/AudioOutputAudioUnitOSX.h os/darwin/DarwinSpecific.h \ os/linux/AudioInputALSA.h os/linux/AudioOutputALSA.h \ os/linux/AudioOutputPulse.h os/linux/AudioInputPulse.h \ - os/linux/AudioPulse.h os/linux/PulseFunctions.h + os/linux/AudioPulse.h os/linux/PulseFunctions.h \ + audio/AudioIOCallback.h HEADERS = $(nobase_tgvoipinclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in @@ -841,10 +2197,11 @@ AWK = @AWK@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ -CCASFLAGS = @CCASFLAGS@ $(am__append_9) $(am__append_14) +CCASFLAGS = @CCASFLAGS@ $(am__append_9) $(am__append_20) CCDEPMODE = @CCDEPMODE@ CFLAGS = -Wall -DHAVE_CONFIG_H -Wno-unknown-pragmas $(am__append_8) \ - $(am__append_13) $(am__append_18) + $(am__append_11) $(am__append_13) $(am__append_15) \ + $(am__append_19) $(am__append_24) CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ @@ -966,18 +2323,21 @@ SRC = VoIPController.cpp Buffers.cpp CongestionControl.cpp \ OpusDecoder.cpp OpusEncoder.cpp PacketReassembler.cpp \ VoIPGroupController.cpp VoIPServerConfig.cpp audio/AudioIO.cpp \ audio/AudioInput.cpp audio/AudioOutput.cpp audio/Resampler.cpp \ - os/posix/NetworkSocketPosix.cpp $(am__append_1) \ + os/posix/NetworkSocketPosix.cpp video/VideoSource.cpp \ + video/VideoRenderer.cpp json11.cpp $(am__append_1) \ $(am__append_4) $(am__append_6) $(am__append_10) \ - $(am__append_11) $(am__append_12) $(am__append_15) \ - $(am__append_16) $(am__append_17) + $(am__append_12) $(am__append_14) $(am__append_16) \ + $(am__append_18) $(am__append_21) $(am__append_22) \ + $(am__append_23) TGVOIP_HDRS = VoIPController.h Buffers.h BlockingQueue.h \ PrivateDefines.h CongestionControl.h EchoCanceller.h \ JitterBuffer.h logging.h threading.h MediaStreamItf.h \ MessageThread.h NetworkSocket.h OpusDecoder.h OpusEncoder.h \ PacketReassembler.h VoIPServerConfig.h audio/AudioIO.h \ audio/AudioInput.h audio/AudioOutput.h audio/Resampler.h \ - os/posix/NetworkSocketPosix.h $(am__append_2) $(am__append_5) \ - $(am__append_7) + os/posix/NetworkSocketPosix.h video/VideoSource.h \ + video/VideoRenderer.h json11.hpp utils.h $(am__append_2) \ + $(am__append_5) $(am__append_7) $(am__append_17) libtgvoip_la_SOURCES = $(SRC) $(TGVOIP_HDRS) tgvoipincludedir = $(includedir)/tgvoip nobase_tgvoipinclude_HEADERS = $(TGVOIP_HDRS) @@ -1091,6 +2451,16 @@ os/posix/$(DEPDIR)/$(am__dirstamp): @: > os/posix/$(DEPDIR)/$(am__dirstamp) os/posix/NetworkSocketPosix.lo: os/posix/$(am__dirstamp) \ os/posix/$(DEPDIR)/$(am__dirstamp) +video/$(am__dirstamp): + @$(MKDIR_P) video + @: > video/$(am__dirstamp) +video/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) video/$(DEPDIR) + @: > video/$(DEPDIR)/$(am__dirstamp) +video/VideoSource.lo: video/$(am__dirstamp) \ + video/$(DEPDIR)/$(am__dirstamp) +video/VideoRenderer.lo: video/$(am__dirstamp) \ + video/$(DEPDIR)/$(am__dirstamp) os/darwin/$(am__dirstamp): @$(MKDIR_P) os/darwin @: > os/darwin/$(am__dirstamp) @@ -1125,246 +2495,1069 @@ os/linux/AudioInputPulse.lo: os/linux/$(am__dirstamp) \ os/linux/$(DEPDIR)/$(am__dirstamp) os/linux/AudioPulse.lo: os/linux/$(am__dirstamp) \ os/linux/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/common_audio - @: > webrtc_dsp/webrtc/common_audio/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/common_audio/$(DEPDIR) - @: > webrtc_dsp/webrtc/common_audio/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/ring_buffer.lo: \ - webrtc_dsp/webrtc/common_audio/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/common_audio/signal_processing - @: > webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR) - @: > webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/auto_corr_to_refl_coef.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/auto_correlation.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/complex_fft.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/copy_set_operations.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/cross_correlation.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/division_operations.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/dot_product_with_scale.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/downsample_fast.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/energy.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/filter_ar.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/filter_ar_fast_q12.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/filter_ma_fast_q12.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/get_hanning_window.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/get_scaling_square.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/ilbc_specific_functions.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/levinson_durbin.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/lpc_to_refl_coef.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/min_max_operations.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/randomization_functions.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/real_fft.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/refl_coef_to_lpc.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/resample.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/resample_48khz.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2_internal.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/resample_fractional.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/spl_init.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/spl_inl.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/splitting_filter_impl.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/sqrt_of_one_minus_x_squared.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/vector_scaling_operations.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/base/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/base - @: > webrtc_dsp/webrtc/base/$(am__dirstamp) -webrtc_dsp/webrtc/base/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/base/$(DEPDIR) - @: > webrtc_dsp/webrtc/base/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/base/checks.lo: \ - webrtc_dsp/webrtc/base/$(am__dirstamp) \ - webrtc_dsp/webrtc/base/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/aecm/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/modules/audio_processing/aecm - @: > webrtc_dsp/webrtc/modules/audio_processing/aecm/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR) - @: > webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core.lo: webrtc_dsp/webrtc/modules/audio_processing/aecm/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core_c.lo: webrtc_dsp/webrtc/modules/audio_processing/aecm/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/aecm/echo_control_mobile.lo: webrtc_dsp/webrtc/modules/audio_processing/aecm/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/utility/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/modules/audio_processing/utility - @: > webrtc_dsp/webrtc/modules/audio_processing/utility/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR) - @: > webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator.lo: webrtc_dsp/webrtc/modules/audio_processing/utility/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_wrapper.lo: webrtc_dsp/webrtc/modules/audio_processing/utility/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/modules/audio_processing - @: > webrtc_dsp/webrtc/modules/audio_processing/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/modules/audio_processing/$(DEPDIR) - @: > webrtc_dsp/webrtc/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/three_band_filter_bank.lo: \ - webrtc_dsp/webrtc/modules/audio_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/splitting_filter.lo: \ - webrtc_dsp/webrtc/modules/audio_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/system_wrappers/source/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/system_wrappers/source - @: > webrtc_dsp/webrtc/system_wrappers/source/$(am__dirstamp) -webrtc_dsp/webrtc/system_wrappers/source/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/system_wrappers/source/$(DEPDIR) - @: > webrtc_dsp/webrtc/system_wrappers/source/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/system_wrappers/source/cpu_features.lo: \ - webrtc_dsp/webrtc/system_wrappers/source/$(am__dirstamp) \ - webrtc_dsp/webrtc/system_wrappers/source/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/sparse_fir_filter.lo: \ - webrtc_dsp/webrtc/common_audio/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/channel_buffer.lo: \ - webrtc_dsp/webrtc/common_audio/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/audio_util.lo: \ - webrtc_dsp/webrtc/common_audio/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/utility/block_mean_calculator.lo: webrtc_dsp/webrtc/modules/audio_processing/utility/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft.lo: webrtc_dsp/webrtc/modules/audio_processing/utility/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/logging/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/modules/audio_processing/logging - @: > webrtc_dsp/webrtc/modules/audio_processing/logging/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/logging/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/modules/audio_processing/logging/$(DEPDIR) - @: > webrtc_dsp/webrtc/modules/audio_processing/logging/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/logging/apm_data_dumper.lo: webrtc_dsp/webrtc/modules/audio_processing/logging/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/logging/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/aec/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/modules/audio_processing/aec - @: > webrtc_dsp/webrtc/modules/audio_processing/aec/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR) - @: > webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core.lo: webrtc_dsp/webrtc/modules/audio_processing/aec/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/aec/aec_resampler.lo: webrtc_dsp/webrtc/modules/audio_processing/aec/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/aec/echo_cancellation.lo: webrtc_dsp/webrtc/modules/audio_processing/aec/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/wav_header.lo: \ - webrtc_dsp/webrtc/common_audio/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/wav_file.lo: \ - webrtc_dsp/webrtc/common_audio/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/base/stringutils.lo: \ - webrtc_dsp/webrtc/base/$(am__dirstamp) \ - webrtc_dsp/webrtc/base/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_sse2.lo: webrtc_dsp/webrtc/modules/audio_processing/aec/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_sse2.lo: webrtc_dsp/webrtc/modules/audio_processing/utility/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/complex_bit_reverse_arm.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt_floor_arm.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/cross_correlation_neon.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/downsample_fast_neon.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/min_max_operations_neon.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_neon.lo: webrtc_dsp/webrtc/modules/audio_processing/aec/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core_neon.lo: webrtc_dsp/webrtc/modules/audio_processing/aecm/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/ns/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/modules/audio_processing/ns - @: > webrtc_dsp/webrtc/modules/audio_processing/ns/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR) - @: > webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core_neon.lo: \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_neon.lo: webrtc_dsp/webrtc/modules/audio_processing/utility/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/complex_bit_reverse.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt_floor.lo: webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression_x.lo: \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression.lo: \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/ns/ns_core.lo: \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core_c.lo: \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core.lo: \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/common_audio/fft4g.lo: \ - webrtc_dsp/webrtc/common_audio/$(am__dirstamp) \ - webrtc_dsp/webrtc/common_audio/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/modules/audio_processing/agc/legacy - @: > webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(DEPDIR) - @: > webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/analog_agc.lo: webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(DEPDIR)/$(am__dirstamp) -webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/digital_agc.lo: webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(am__dirstamp) \ - webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/system_wrappers/source/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/system_wrappers/source + @: > webrtc_dsp/system_wrappers/source/$(am__dirstamp) +webrtc_dsp/system_wrappers/source/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/system_wrappers/source/$(DEPDIR) + @: > webrtc_dsp/system_wrappers/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/system_wrappers/source/field_trial.lo: \ + webrtc_dsp/system_wrappers/source/$(am__dirstamp) \ + webrtc_dsp/system_wrappers/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/system_wrappers/source/metrics.lo: \ + webrtc_dsp/system_wrappers/source/$(am__dirstamp) \ + webrtc_dsp/system_wrappers/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/system_wrappers/source/cpu_features.lo: \ + webrtc_dsp/system_wrappers/source/$(am__dirstamp) \ + webrtc_dsp/system_wrappers/source/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/absl/strings/internal/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/absl/strings/internal + @: > webrtc_dsp/absl/strings/internal/$(am__dirstamp) +webrtc_dsp/absl/strings/internal/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/absl/strings/internal/$(DEPDIR) + @: > webrtc_dsp/absl/strings/internal/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/absl/strings/internal/memutil.lo: \ + webrtc_dsp/absl/strings/internal/$(am__dirstamp) \ + webrtc_dsp/absl/strings/internal/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/absl/strings/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/absl/strings + @: > webrtc_dsp/absl/strings/$(am__dirstamp) +webrtc_dsp/absl/strings/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/absl/strings/$(DEPDIR) + @: > webrtc_dsp/absl/strings/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/absl/strings/string_view.lo: \ + webrtc_dsp/absl/strings/$(am__dirstamp) \ + webrtc_dsp/absl/strings/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/absl/strings/ascii.lo: \ + webrtc_dsp/absl/strings/$(am__dirstamp) \ + webrtc_dsp/absl/strings/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/absl/types/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/absl/types + @: > webrtc_dsp/absl/types/$(am__dirstamp) +webrtc_dsp/absl/types/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/absl/types/$(DEPDIR) + @: > webrtc_dsp/absl/types/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/absl/types/bad_optional_access.lo: \ + webrtc_dsp/absl/types/$(am__dirstamp) \ + webrtc_dsp/absl/types/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/absl/types/optional.lo: \ + webrtc_dsp/absl/types/$(am__dirstamp) \ + webrtc_dsp/absl/types/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/absl/base/internal/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/absl/base/internal + @: > webrtc_dsp/absl/base/internal/$(am__dirstamp) +webrtc_dsp/absl/base/internal/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/absl/base/internal/$(DEPDIR) + @: > webrtc_dsp/absl/base/internal/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/absl/base/internal/raw_logging.lo: \ + webrtc_dsp/absl/base/internal/$(am__dirstamp) \ + webrtc_dsp/absl/base/internal/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/absl/base/internal/throw_delegate.lo: \ + webrtc_dsp/absl/base/internal/$(am__dirstamp) \ + webrtc_dsp/absl/base/internal/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/rtc_base/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/rtc_base + @: > webrtc_dsp/rtc_base/$(am__dirstamp) +webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/rtc_base/$(DEPDIR) + @: > webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/race_checker.lo: \ + webrtc_dsp/rtc_base/$(am__dirstamp) \ + webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/rtc_base/strings/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/rtc_base/strings + @: > webrtc_dsp/rtc_base/strings/$(am__dirstamp) +webrtc_dsp/rtc_base/strings/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/rtc_base/strings/$(DEPDIR) + @: > webrtc_dsp/rtc_base/strings/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/strings/string_builder.lo: \ + webrtc_dsp/rtc_base/strings/$(am__dirstamp) \ + webrtc_dsp/rtc_base/strings/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/rtc_base/memory/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/rtc_base/memory + @: > webrtc_dsp/rtc_base/memory/$(am__dirstamp) +webrtc_dsp/rtc_base/memory/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/rtc_base/memory/$(DEPDIR) + @: > webrtc_dsp/rtc_base/memory/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/memory/aligned_malloc.lo: \ + webrtc_dsp/rtc_base/memory/$(am__dirstamp) \ + webrtc_dsp/rtc_base/memory/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/timeutils.lo: \ + webrtc_dsp/rtc_base/$(am__dirstamp) \ + webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/platform_file.lo: \ + webrtc_dsp/rtc_base/$(am__dirstamp) \ + webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/string_to_number.lo: \ + webrtc_dsp/rtc_base/$(am__dirstamp) \ + webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/thread_checker_impl.lo: \ + webrtc_dsp/rtc_base/$(am__dirstamp) \ + webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/stringencode.lo: \ + webrtc_dsp/rtc_base/$(am__dirstamp) \ + webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/stringutils.lo: \ + webrtc_dsp/rtc_base/$(am__dirstamp) \ + webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/checks.lo: webrtc_dsp/rtc_base/$(am__dirstamp) \ + webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/platform_thread.lo: \ + webrtc_dsp/rtc_base/$(am__dirstamp) \ + webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/logging_webrtc.lo: \ + webrtc_dsp/rtc_base/$(am__dirstamp) \ + webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/criticalsection.lo: \ + webrtc_dsp/rtc_base/$(am__dirstamp) \ + webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/platform_thread_types.lo: \ + webrtc_dsp/rtc_base/$(am__dirstamp) \ + webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/event.lo: webrtc_dsp/rtc_base/$(am__dirstamp) \ + webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/rtc_base/event_tracer.lo: \ + webrtc_dsp/rtc_base/$(am__dirstamp) \ + webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/third_party/rnnoise/src/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/third_party/rnnoise/src + @: > webrtc_dsp/third_party/rnnoise/src/$(am__dirstamp) +webrtc_dsp/third_party/rnnoise/src/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/third_party/rnnoise/src/$(DEPDIR) + @: > webrtc_dsp/third_party/rnnoise/src/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/third_party/rnnoise/src/rnn_vad_weights.lo: \ + webrtc_dsp/third_party/rnnoise/src/$(am__dirstamp) \ + webrtc_dsp/third_party/rnnoise/src/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/third_party/rnnoise/src/kiss_fft.lo: \ + webrtc_dsp/third_party/rnnoise/src/$(am__dirstamp) \ + webrtc_dsp/third_party/rnnoise/src/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/api/audio/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/api/audio + @: > webrtc_dsp/api/audio/$(am__dirstamp) +webrtc_dsp/api/audio/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/api/audio/$(DEPDIR) + @: > webrtc_dsp/api/audio/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/api/audio/audio_frame.lo: \ + webrtc_dsp/api/audio/$(am__dirstamp) \ + webrtc_dsp/api/audio/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/api/audio/echo_canceller3_config.lo: \ + webrtc_dsp/api/audio/$(am__dirstamp) \ + webrtc_dsp/api/audio/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/api/audio/echo_canceller3_factory.lo: \ + webrtc_dsp/api/audio/$(am__dirstamp) \ + webrtc_dsp/api/audio/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/third_party/fft/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/third_party/fft + @: > webrtc_dsp/modules/third_party/fft/$(am__dirstamp) +webrtc_dsp/modules/third_party/fft/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/third_party/fft/$(DEPDIR) + @: > webrtc_dsp/modules/third_party/fft/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/third_party/fft/fft.lo: \ + webrtc_dsp/modules/third_party/fft/$(am__dirstamp) \ + webrtc_dsp/modules/third_party/fft/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source + @: > webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) +webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR) + @: > webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_estimator.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines_logist.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filterbanks.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/transform.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_filter.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filter_functions.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/decode.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lattice.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/intialize.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_tables.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_analysis.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines_hist.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/entropy_coding.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac_vad.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/crc.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/decode_bwe.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac.lo: webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) \ + webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing + @: > webrtc_dsp/modules/audio_processing/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/rms_level.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/echo_detector/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/echo_detector + @: > webrtc_dsp/modules/audio_processing/echo_detector/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/echo_detector/normalized_covariance_estimator.lo: webrtc_dsp/modules/audio_processing/echo_detector/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/echo_detector/moving_max.lo: webrtc_dsp/modules/audio_processing/echo_detector/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/echo_detector/circular_buffer.lo: webrtc_dsp/modules/audio_processing/echo_detector/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/echo_detector/mean_variance_estimator.lo: webrtc_dsp/modules/audio_processing/echo_detector/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/splitting_filter.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/gain_control_impl.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/ns/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/ns + @: > webrtc_dsp/modules/audio_processing/ns/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/ns/nsx_core.lo: \ + webrtc_dsp/modules/audio_processing/ns/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/ns/noise_suppression_x.lo: \ + webrtc_dsp/modules/audio_processing/ns/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/ns/nsx_core_c.lo: \ + webrtc_dsp/modules/audio_processing/ns/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/ns/ns_core.lo: \ + webrtc_dsp/modules/audio_processing/ns/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/ns/noise_suppression.lo: \ + webrtc_dsp/modules/audio_processing/ns/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/audio_buffer.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/typing_detection.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/include/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/include + @: > webrtc_dsp/modules/audio_processing/include/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/include/audio_processing_statistics.lo: \ + webrtc_dsp/modules/audio_processing/include/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/include/audio_generator_factory.lo: \ + webrtc_dsp/modules/audio_processing/include/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/include/aec_dump.lo: \ + webrtc_dsp/modules/audio_processing/include/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/include/audio_processing.lo: \ + webrtc_dsp/modules/audio_processing/include/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/include/config.lo: \ + webrtc_dsp/modules/audio_processing/include/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/agc2 + @: > webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/interpolated_gain_curve.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/agc2_common.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/gain_applier.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/adaptive_agc.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/adaptive_digital_gain_applier.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/limiter.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/saturation_protector.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad + @: > webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features_internal.lo: webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/rnn.lo: webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search_internal.lo: webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features.lo: webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search.lo: webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/features_extraction.lo: webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/fft_util.lo: webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/lp_residual.lo: webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/vector_float_frame.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/noise_level_estimator.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/agc2_testing_common.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/fixed_digital_level_estimator.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/fixed_gain_controller.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/vad_with_level.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/limiter_db_gain_curve.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/down_sampler.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/signal_classifier.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/noise_spectrum_estimator.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/compute_interpolated_gain_curve.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/biquad_filter.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator.lo: \ + webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/transient/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/transient + @: > webrtc_dsp/modules/audio_processing/transient/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/transient/moving_moments.lo: \ + webrtc_dsp/modules/audio_processing/transient/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/transient/wpd_tree.lo: \ + webrtc_dsp/modules/audio_processing/transient/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/transient/wpd_node.lo: \ + webrtc_dsp/modules/audio_processing/transient/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/transient/transient_suppressor.lo: \ + webrtc_dsp/modules/audio_processing/transient/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/transient/transient_detector.lo: \ + webrtc_dsp/modules/audio_processing/transient/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/low_cut_filter.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/level_estimator_impl.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/three_band_filter_bank.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/aec/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/aec + @: > webrtc_dsp/modules/audio_processing/aec/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/aec/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec/echo_cancellation.lo: \ + webrtc_dsp/modules/audio_processing/aec/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec/aec_resampler.lo: \ + webrtc_dsp/modules/audio_processing/aec/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec/aec_core.lo: \ + webrtc_dsp/modules/audio_processing/aec/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/voice_detection_impl.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/echo_cancellation_impl.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/gain_control_for_experimental_agc.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/agc/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/agc + @: > webrtc_dsp/modules/audio_processing/agc/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc/agc.lo: \ + webrtc_dsp/modules/audio_processing/agc/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc/loudness_histogram.lo: \ + webrtc_dsp/modules/audio_processing/agc/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc/agc_manager_direct.lo: \ + webrtc_dsp/modules/audio_processing/agc/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/agc/legacy/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/agc/legacy + @: > webrtc_dsp/modules/audio_processing/agc/legacy/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/agc/legacy/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/agc/legacy/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/agc/legacy/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc/legacy/analog_agc.lo: webrtc_dsp/modules/audio_processing/agc/legacy/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc/legacy/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc/legacy/digital_agc.lo: webrtc_dsp/modules/audio_processing/agc/legacy/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc/legacy/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/agc/utility.lo: \ + webrtc_dsp/modules/audio_processing/agc/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/audio_processing_impl.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/audio_generator/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/audio_generator + @: > webrtc_dsp/modules/audio_processing/audio_generator/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/audio_generator/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/audio_generator/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/audio_generator/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/audio_generator/file_audio_generator.lo: webrtc_dsp/modules/audio_processing/audio_generator/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/audio_generator/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/gain_controller2.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/residual_echo_detector.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/noise_suppression_impl.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/aecm/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/aecm + @: > webrtc_dsp/modules/audio_processing/aecm/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aecm/aecm_core.lo: \ + webrtc_dsp/modules/audio_processing/aecm/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aecm/aecm_core_c.lo: \ + webrtc_dsp/modules/audio_processing/aecm/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aecm/echo_control_mobile.lo: \ + webrtc_dsp/modules/audio_processing/aecm/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/aec3 + @: > webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/render_reverb_model.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/reverb_model_fallback.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/echo_remover_metrics.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/matched_filter_lag_aggregator.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer2.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/echo_path_variability.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/frame_blocker.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/subtractor.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/aec3_fft.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/fullband_erle_estimator.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/suppression_filter.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/block_processor.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/subband_erle_estimator.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller_metrics.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/vector_buffer.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/erl_estimator.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/aec_state.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/adaptive_fir_filter.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/skew_estimator.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/echo_path_delay_estimator.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/block_framer.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/erle_estimator.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/reverb_model.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/cascaded_biquad_filter.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/render_buffer.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/subtractor_output.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/stationarity_estimator.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/render_signal_analyzer.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/subtractor_output_analyzer.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/suppression_gain.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/echo_audibility.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/block_processor_metrics.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/moving_average.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/reverb_model_estimator.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/aec3_common.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/residual_echo_estimator.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/matched_filter.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/reverb_decay_estimator.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/render_delay_controller2.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/suppression_gain_limiter.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/main_filter_update_gain.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/echo_remover.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/downsampled_render_buffer.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/matrix_buffer.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/block_processor2.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/echo_canceller3.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/block_delay_buffer.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/fft_buffer.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/comfort_noise_generator.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/shadow_filter_update_gain.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/filter_analyzer.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/reverb_frequency_response.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/aec3/decimator.lo: \ + webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/echo_control_mobile_impl.lo: \ + webrtc_dsp/modules/audio_processing/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/logging/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/logging + @: > webrtc_dsp/modules/audio_processing/logging/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/logging/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/logging/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/logging/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/logging/apm_data_dumper.lo: \ + webrtc_dsp/modules/audio_processing/logging/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/logging/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/vad/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/vad + @: > webrtc_dsp/modules/audio_processing/vad/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/vad/voice_activity_detector.lo: \ + webrtc_dsp/modules/audio_processing/vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/vad/standalone_vad.lo: \ + webrtc_dsp/modules/audio_processing/vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/vad/pitch_internal.lo: \ + webrtc_dsp/modules/audio_processing/vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/vad/vad_circular_buffer.lo: \ + webrtc_dsp/modules/audio_processing/vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/vad/vad_audio_proc.lo: \ + webrtc_dsp/modules/audio_processing/vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/vad/pole_zero_filter.lo: \ + webrtc_dsp/modules/audio_processing/vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/vad/pitch_based_vad.lo: \ + webrtc_dsp/modules/audio_processing/vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/vad/gmm.lo: \ + webrtc_dsp/modules/audio_processing/vad/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/utility/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/utility + @: > webrtc_dsp/modules/audio_processing/utility/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR) + @: > webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/utility/ooura_fft.lo: \ + webrtc_dsp/modules/audio_processing/utility/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/utility/delay_estimator_wrapper.lo: \ + webrtc_dsp/modules/audio_processing/utility/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/utility/delay_estimator.lo: \ + webrtc_dsp/modules/audio_processing/utility/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/modules/audio_processing/utility/block_mean_calculator.lo: \ + webrtc_dsp/modules/audio_processing/utility/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/common_audio/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/common_audio + @: > webrtc_dsp/common_audio/$(am__dirstamp) +webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/common_audio/$(DEPDIR) + @: > webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/window_generator.lo: \ + webrtc_dsp/common_audio/$(am__dirstamp) \ + webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/channel_buffer.lo: \ + webrtc_dsp/common_audio/$(am__dirstamp) \ + webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/fir_filter_factory.lo: \ + webrtc_dsp/common_audio/$(am__dirstamp) \ + webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/wav_header.lo: \ + webrtc_dsp/common_audio/$(am__dirstamp) \ + webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/real_fourier_ooura.lo: \ + webrtc_dsp/common_audio/$(am__dirstamp) \ + webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/audio_util.lo: \ + webrtc_dsp/common_audio/$(am__dirstamp) \ + webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/fir_filter_sse.lo: \ + webrtc_dsp/common_audio/$(am__dirstamp) \ + webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/common_audio/resampler/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/common_audio/resampler + @: > webrtc_dsp/common_audio/resampler/$(am__dirstamp) +webrtc_dsp/common_audio/resampler/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/common_audio/resampler/$(DEPDIR) + @: > webrtc_dsp/common_audio/resampler/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/resampler/push_sinc_resampler.lo: \ + webrtc_dsp/common_audio/resampler/$(am__dirstamp) \ + webrtc_dsp/common_audio/resampler/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/resampler/resampler.lo: \ + webrtc_dsp/common_audio/resampler/$(am__dirstamp) \ + webrtc_dsp/common_audio/resampler/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/resampler/sinc_resampler_sse.lo: \ + webrtc_dsp/common_audio/resampler/$(am__dirstamp) \ + webrtc_dsp/common_audio/resampler/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/resampler/push_resampler.lo: \ + webrtc_dsp/common_audio/resampler/$(am__dirstamp) \ + webrtc_dsp/common_audio/resampler/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/resampler/sinc_resampler.lo: \ + webrtc_dsp/common_audio/resampler/$(am__dirstamp) \ + webrtc_dsp/common_audio/resampler/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/resampler/sinusoidal_linear_chirp_source.lo: \ + webrtc_dsp/common_audio/resampler/$(am__dirstamp) \ + webrtc_dsp/common_audio/resampler/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/wav_file.lo: \ + webrtc_dsp/common_audio/$(am__dirstamp) \ + webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/common_audio/third_party/fft4g/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/common_audio/third_party/fft4g + @: > webrtc_dsp/common_audio/third_party/fft4g/$(am__dirstamp) +webrtc_dsp/common_audio/third_party/fft4g/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/common_audio/third_party/fft4g/$(DEPDIR) + @: > webrtc_dsp/common_audio/third_party/fft4g/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/third_party/fft4g/fft4g.lo: \ + webrtc_dsp/common_audio/third_party/fft4g/$(am__dirstamp) \ + webrtc_dsp/common_audio/third_party/fft4g/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/audio_converter.lo: \ + webrtc_dsp/common_audio/$(am__dirstamp) \ + webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/real_fourier.lo: \ + webrtc_dsp/common_audio/$(am__dirstamp) \ + webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/sparse_fir_filter.lo: \ + webrtc_dsp/common_audio/$(am__dirstamp) \ + webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/smoothing_filter.lo: \ + webrtc_dsp/common_audio/$(am__dirstamp) \ + webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/fir_filter_c.lo: \ + webrtc_dsp/common_audio/$(am__dirstamp) \ + webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/ring_buffer.lo: \ + webrtc_dsp/common_audio/$(am__dirstamp) \ + webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/common_audio/signal_processing/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/common_audio/signal_processing + @: > webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) +webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR) + @: > webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/complex_fft.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/filter_ma_fast_q12.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/splitting_filter1.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/levinson_durbin.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/dot_product_with_scale.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/auto_corr_to_refl_coef.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/resample_by_2_internal.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/energy.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/sqrt_of_one_minus_x_squared.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/downsample_fast.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/filter_ar_fast_q12.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/spl_init.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/lpc_to_refl_coef.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/cross_correlation.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/division_operations.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/auto_correlation.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/get_scaling_square.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/resample.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/min_max_operations.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/refl_coef_to_lpc.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/filter_ar.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/vector_scaling_operations.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/resample_fractional.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/real_fft.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/ilbc_specific_functions.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/randomization_functions.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/copy_set_operations.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/resample_by_2.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/get_hanning_window.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/resample_48khz.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/spl_inl.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/signal_processing/spl_sqrt.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/common_audio/vad/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/common_audio/vad + @: > webrtc_dsp/common_audio/vad/$(am__dirstamp) +webrtc_dsp/common_audio/vad/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ./webrtc_dsp/common_audio/vad/$(DEPDIR) + @: > webrtc_dsp/common_audio/vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/vad/vad_sp.lo: \ + webrtc_dsp/common_audio/vad/$(am__dirstamp) \ + webrtc_dsp/common_audio/vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/vad/vad.lo: \ + webrtc_dsp/common_audio/vad/$(am__dirstamp) \ + webrtc_dsp/common_audio/vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/vad/webrtc_vad.lo: \ + webrtc_dsp/common_audio/vad/$(am__dirstamp) \ + webrtc_dsp/common_audio/vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/vad/vad_filterbank.lo: \ + webrtc_dsp/common_audio/vad/$(am__dirstamp) \ + webrtc_dsp/common_audio/vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/vad/vad_core.lo: \ + webrtc_dsp/common_audio/vad/$(am__dirstamp) \ + webrtc_dsp/common_audio/vad/$(DEPDIR)/$(am__dirstamp) +./webrtc_dsp/common_audio/vad/vad_gmm.lo: \ + webrtc_dsp/common_audio/vad/$(am__dirstamp) \ + webrtc_dsp/common_audio/vad/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/rtc_base/logging_mac.lo: \ + webrtc_dsp/rtc_base/$(am__dirstamp) \ + webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/aec/aec_core_sse2.lo: \ + webrtc_dsp/modules/audio_processing/aec/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/utility/ooura_fft_sse2.lo: \ + webrtc_dsp/modules/audio_processing/utility/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) +audio/AudioIOCallback.lo: audio/$(am__dirstamp) \ + audio/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/common_audio/signal_processing/complex_bit_reverse_arm.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(am__dirstamp): + @$(MKDIR_P) webrtc_dsp/common_audio/third_party/spl_sqrt_floor + @: > webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(am__dirstamp) +webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(DEPDIR) + @: > webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor_arm.lo: webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(am__dirstamp) \ + webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/common_audio/signal_processing/cross_correlation_neon.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/common_audio/signal_processing/downsample_fast_neon.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/common_audio/signal_processing/min_max_operations_neon.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/aec/aec_core_neon.lo: \ + webrtc_dsp/modules/audio_processing/aec/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/aecm/aecm_core_neon.lo: \ + webrtc_dsp/modules/audio_processing/aecm/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/ns/nsx_core_neon.lo: \ + webrtc_dsp/modules/audio_processing/ns/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/modules/audio_processing/utility/ooura_fft_neon.lo: \ + webrtc_dsp/modules/audio_processing/utility/$(am__dirstamp) \ + webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/common_audio/signal_processing/complex_bit_reverse.lo: \ + webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) \ + webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) +webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor.lo: webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(am__dirstamp) \ + webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(DEPDIR)/$(am__dirstamp) libtgvoip.la: $(libtgvoip_la_OBJECTS) $(libtgvoip_la_DEPENDENCIES) $(EXTRA_libtgvoip_la_DEPENDENCIES) $(AM_V_OBJCXXLD)$(OBJCXXLINK) -rpath $(libdir) $(libtgvoip_la_OBJECTS) $(libtgvoip_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) + -rm -f ./webrtc_dsp/absl/base/internal/*.$(OBJEXT) + -rm -f ./webrtc_dsp/absl/base/internal/*.lo + -rm -f ./webrtc_dsp/absl/strings/*.$(OBJEXT) + -rm -f ./webrtc_dsp/absl/strings/*.lo + -rm -f ./webrtc_dsp/absl/strings/internal/*.$(OBJEXT) + -rm -f ./webrtc_dsp/absl/strings/internal/*.lo + -rm -f ./webrtc_dsp/absl/types/*.$(OBJEXT) + -rm -f ./webrtc_dsp/absl/types/*.lo + -rm -f ./webrtc_dsp/api/audio/*.$(OBJEXT) + -rm -f ./webrtc_dsp/api/audio/*.lo + -rm -f ./webrtc_dsp/common_audio/*.$(OBJEXT) + -rm -f ./webrtc_dsp/common_audio/*.lo + -rm -f ./webrtc_dsp/common_audio/resampler/*.$(OBJEXT) + -rm -f ./webrtc_dsp/common_audio/resampler/*.lo + -rm -f ./webrtc_dsp/common_audio/signal_processing/*.$(OBJEXT) + -rm -f ./webrtc_dsp/common_audio/signal_processing/*.lo + -rm -f ./webrtc_dsp/common_audio/third_party/fft4g/*.$(OBJEXT) + -rm -f ./webrtc_dsp/common_audio/third_party/fft4g/*.lo + -rm -f ./webrtc_dsp/common_audio/vad/*.$(OBJEXT) + -rm -f ./webrtc_dsp/common_audio/vad/*.lo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/aec/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/aec/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/aecm/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/aecm/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/agc/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/agc/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/agc/legacy/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/agc/legacy/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/audio_generator/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/audio_generator/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/echo_detector/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/echo_detector/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/include/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/include/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/logging/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/logging/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/ns/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/ns/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/transient/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/transient/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/utility/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/utility/*.lo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/audio_processing/vad/*.lo + -rm -f ./webrtc_dsp/modules/third_party/fft/*.$(OBJEXT) + -rm -f ./webrtc_dsp/modules/third_party/fft/*.lo + -rm -f ./webrtc_dsp/rtc_base/*.$(OBJEXT) + -rm -f ./webrtc_dsp/rtc_base/*.lo + -rm -f ./webrtc_dsp/rtc_base/memory/*.$(OBJEXT) + -rm -f ./webrtc_dsp/rtc_base/memory/*.lo + -rm -f ./webrtc_dsp/rtc_base/strings/*.$(OBJEXT) + -rm -f ./webrtc_dsp/rtc_base/strings/*.lo + -rm -f ./webrtc_dsp/system_wrappers/source/*.$(OBJEXT) + -rm -f ./webrtc_dsp/system_wrappers/source/*.lo + -rm -f ./webrtc_dsp/third_party/rnnoise/src/*.$(OBJEXT) + -rm -f ./webrtc_dsp/third_party/rnnoise/src/*.lo -rm -f audio/*.$(OBJEXT) -rm -f audio/*.lo -rm -f os/darwin/*.$(OBJEXT) @@ -1373,28 +3566,22 @@ mostlyclean-compile: -rm -f os/linux/*.lo -rm -f os/posix/*.$(OBJEXT) -rm -f os/posix/*.lo - -rm -f webrtc_dsp/webrtc/base/*.$(OBJEXT) - -rm -f webrtc_dsp/webrtc/base/*.lo - -rm -f webrtc_dsp/webrtc/common_audio/*.$(OBJEXT) - -rm -f webrtc_dsp/webrtc/common_audio/*.lo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/*.$(OBJEXT) - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/*.lo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/*.$(OBJEXT) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/*.lo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aec/*.$(OBJEXT) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aec/*.lo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aecm/*.$(OBJEXT) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aecm/*.lo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/*.$(OBJEXT) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/*.lo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/logging/*.$(OBJEXT) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/logging/*.lo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/*.$(OBJEXT) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/*.lo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/*.$(OBJEXT) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/*.lo - -rm -f webrtc_dsp/webrtc/system_wrappers/source/*.$(OBJEXT) - -rm -f webrtc_dsp/webrtc/system_wrappers/source/*.lo + -rm -f video/*.$(OBJEXT) + -rm -f video/*.lo + -rm -f webrtc_dsp/common_audio/signal_processing/*.$(OBJEXT) + -rm -f webrtc_dsp/common_audio/signal_processing/*.lo + -rm -f webrtc_dsp/common_audio/third_party/spl_sqrt_floor/*.$(OBJEXT) + -rm -f webrtc_dsp/common_audio/third_party/spl_sqrt_floor/*.lo + -rm -f webrtc_dsp/modules/audio_processing/aec/*.$(OBJEXT) + -rm -f webrtc_dsp/modules/audio_processing/aec/*.lo + -rm -f webrtc_dsp/modules/audio_processing/aecm/*.$(OBJEXT) + -rm -f webrtc_dsp/modules/audio_processing/aecm/*.lo + -rm -f webrtc_dsp/modules/audio_processing/ns/*.$(OBJEXT) + -rm -f webrtc_dsp/modules/audio_processing/ns/*.lo + -rm -f webrtc_dsp/modules/audio_processing/utility/*.$(OBJEXT) + -rm -f webrtc_dsp/modules/audio_processing/utility/*.lo + -rm -f webrtc_dsp/rtc_base/*.$(OBJEXT) + -rm -f webrtc_dsp/rtc_base/*.lo distclean-compile: -rm -f *.tab.c @@ -1412,8 +3599,273 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VoIPController.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VoIPGroupController.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VoIPServerConfig.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json11.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logging.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/absl/base/internal/$(DEPDIR)/raw_logging.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/absl/base/internal/$(DEPDIR)/throw_delegate.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/absl/strings/$(DEPDIR)/ascii.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/absl/strings/$(DEPDIR)/string_view.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/absl/strings/internal/$(DEPDIR)/memutil.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/absl/types/$(DEPDIR)/bad_optional_access.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/absl/types/$(DEPDIR)/optional.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/api/audio/$(DEPDIR)/audio_frame.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/api/audio/$(DEPDIR)/echo_canceller3_config.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/api/audio/$(DEPDIR)/echo_canceller3_factory.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/$(DEPDIR)/audio_converter.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/$(DEPDIR)/audio_util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/$(DEPDIR)/channel_buffer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/$(DEPDIR)/fir_filter_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/$(DEPDIR)/fir_filter_factory.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/$(DEPDIR)/fir_filter_sse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/$(DEPDIR)/real_fourier.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/$(DEPDIR)/real_fourier_ooura.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/$(DEPDIR)/ring_buffer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/$(DEPDIR)/smoothing_filter.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/$(DEPDIR)/sparse_fir_filter.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/$(DEPDIR)/wav_file.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/$(DEPDIR)/wav_header.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/$(DEPDIR)/window_generator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/resampler/$(DEPDIR)/push_resampler.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/resampler/$(DEPDIR)/push_sinc_resampler.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/resampler/$(DEPDIR)/resampler.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/resampler/$(DEPDIR)/sinc_resampler.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/resampler/$(DEPDIR)/sinc_resampler_sse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/resampler/$(DEPDIR)/sinusoidal_linear_chirp_source.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/auto_corr_to_refl_coef.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/auto_correlation.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/complex_fft.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/copy_set_operations.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/cross_correlation.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/division_operations.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/dot_product_with_scale.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/downsample_fast.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/energy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/filter_ar.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/filter_ar_fast_q12.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/filter_ma_fast_q12.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/get_hanning_window.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/get_scaling_square.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/ilbc_specific_functions.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/levinson_durbin.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/lpc_to_refl_coef.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/min_max_operations.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/randomization_functions.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/real_fft.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/refl_coef_to_lpc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_48khz.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_by_2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_by_2_internal.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_fractional.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/spl_init.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/spl_inl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/spl_sqrt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/splitting_filter1.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/sqrt_of_one_minus_x_squared.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/vector_scaling_operations.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/third_party/fft4g/$(DEPDIR)/fft4g.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_core.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_filterbank.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_gmm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_sp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/common_audio/vad/$(DEPDIR)/webrtc_vad.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/arith_routines.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/arith_routines_hist.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/arith_routines_logist.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/bandwidth_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/crc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/decode.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/decode_bwe.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/encode.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/encode_lpc_swb.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/entropy_coding.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/filter_functions.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/filterbanks.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/intialize.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/isac.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/isac_vad.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lattice.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_analysis.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_gain_swb_tables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_shape_swb12_tables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_shape_swb16_tables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_tables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_filter.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_gain_tables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_lag_tables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/spectrum_ar_model_tables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/transform.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/audio_buffer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/audio_processing_impl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/echo_cancellation_impl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/echo_control_mobile_impl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/gain_control_for_experimental_agc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/gain_control_impl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/gain_controller2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/level_estimator_impl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/low_cut_filter.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/noise_suppression_impl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/residual_echo_detector.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/rms_level.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/splitting_filter.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/three_band_filter_bank.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/typing_detection.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/$(DEPDIR)/voice_detection_impl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_core.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_resampler.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/echo_cancellation.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/adaptive_fir_filter.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/aec3_common.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/aec3_fft.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/aec_state.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_delay_buffer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_framer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_processor.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_processor2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_processor_metrics.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/cascaded_biquad_filter.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/comfort_noise_generator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/decimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/downsampled_render_buffer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_audibility.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_canceller3.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_path_delay_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_path_variability.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_remover.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_remover_metrics.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/erl_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/erle_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/fft_buffer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/filter_analyzer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/frame_blocker.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/fullband_erle_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/main_filter_update_gain.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/matched_filter.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/matched_filter_lag_aggregator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/matrix_buffer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/moving_average.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_buffer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_buffer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_buffer2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_controller.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_controller2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_controller_metrics.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_reverb_model.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_signal_analyzer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/residual_echo_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_decay_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_frequency_response.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_model.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_model_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_model_fallback.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/shadow_filter_update_gain.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/skew_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/stationarity_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subband_erle_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subtractor.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subtractor_output.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subtractor_output_analyzer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/suppression_filter.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/suppression_gain.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/suppression_gain_limiter.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/vector_buffer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/aecm_core.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/echo_control_mobile.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/agc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/agc_manager_direct.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/loudness_histogram.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/utility.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc/legacy/$(DEPDIR)/analog_agc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc/legacy/$(DEPDIR)/digital_agc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_agc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_digital_gain_applier.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_mode_level_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_mode_level_estimator_agc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/agc2_common.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/agc2_testing_common.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/biquad_filter.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/compute_interpolated_gain_curve.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/down_sampler.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/fixed_digital_level_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/fixed_gain_controller.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/gain_applier.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/interpolated_gain_curve.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/limiter.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/limiter_db_gain_curve.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/noise_level_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/noise_spectrum_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/saturation_protector.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/signal_classifier.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/vad_with_level.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/vector_float_frame.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/features_extraction.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/fft_util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/lp_residual.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/pitch_search.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/pitch_search_internal.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/rnn.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/spectral_features.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/spectral_features_internal.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/audio_generator/$(DEPDIR)/file_audio_generator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/circular_buffer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/mean_variance_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/moving_max.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/normalized_covariance_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/aec_dump.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/audio_generator_factory.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/audio_processing.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/audio_processing_statistics.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/config.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/logging/$(DEPDIR)/apm_data_dumper.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/noise_suppression.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/noise_suppression_x.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/ns_core.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/nsx_core.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/nsx_core_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/moving_moments.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/transient_detector.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/transient_suppressor.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/wpd_node.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/wpd_tree.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/block_mean_calculator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/delay_estimator.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/delay_estimator_wrapper.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/ooura_fft.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/gmm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/pitch_based_vad.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/pitch_internal.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/pole_zero_filter.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/standalone_vad.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/vad_audio_proc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/vad_circular_buffer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/voice_activity_detector.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/modules/third_party/fft/$(DEPDIR)/fft.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/$(DEPDIR)/checks.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/$(DEPDIR)/criticalsection.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/$(DEPDIR)/event.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/$(DEPDIR)/event_tracer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/$(DEPDIR)/logging_webrtc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/$(DEPDIR)/platform_file.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/$(DEPDIR)/platform_thread.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/$(DEPDIR)/platform_thread_types.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/$(DEPDIR)/race_checker.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/$(DEPDIR)/string_to_number.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/$(DEPDIR)/stringencode.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/$(DEPDIR)/stringutils.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/$(DEPDIR)/thread_checker_impl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/$(DEPDIR)/timeutils.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/memory/$(DEPDIR)/aligned_malloc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/rtc_base/strings/$(DEPDIR)/string_builder.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/system_wrappers/source/$(DEPDIR)/cpu_features.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/system_wrappers/source/$(DEPDIR)/field_trial.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/system_wrappers/source/$(DEPDIR)/metrics.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/third_party/rnnoise/src/$(DEPDIR)/kiss_fft.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./webrtc_dsp/third_party/rnnoise/src/$(DEPDIR)/rnn_vad_weights.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@audio/$(DEPDIR)/AudioIO.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@audio/$(DEPDIR)/AudioIOCallback.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@audio/$(DEPDIR)/AudioInput.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@audio/$(DEPDIR)/AudioOutput.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@audio/$(DEPDIR)/Resampler.Plo@am__quote@ # am--include-marker @@ -1429,81 +3881,22 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@os/linux/$(DEPDIR)/AudioOutputPulse.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@os/linux/$(DEPDIR)/AudioPulse.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@os/posix/$(DEPDIR)/NetworkSocketPosix.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/base/$(DEPDIR)/checks.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/base/$(DEPDIR)/stringutils.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/$(DEPDIR)/audio_util.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/$(DEPDIR)/channel_buffer.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/$(DEPDIR)/fft4g.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/$(DEPDIR)/ring_buffer.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/$(DEPDIR)/sparse_fir_filter.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/$(DEPDIR)/wav_file.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/$(DEPDIR)/wav_header.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/auto_corr_to_refl_coef.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/auto_correlation.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse_arm.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/complex_fft.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/copy_set_operations.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/cross_correlation.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/cross_correlation_neon.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/division_operations.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/dot_product_with_scale.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/downsample_fast.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/downsample_fast_neon.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/energy.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/filter_ar.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/filter_ar_fast_q12.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/filter_ma_fast_q12.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/get_hanning_window.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/get_scaling_square.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/ilbc_specific_functions.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/levinson_durbin.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/lpc_to_refl_coef.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/min_max_operations.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/min_max_operations_neon.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/randomization_functions.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/real_fft.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/refl_coef_to_lpc.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_48khz.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_by_2.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_by_2_internal.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_fractional.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_init.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_inl.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_sqrt.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_sqrt_floor.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_sqrt_floor_arm.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/splitting_filter_impl.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/sqrt_of_one_minus_x_squared.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/vector_scaling_operations.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/$(DEPDIR)/splitting_filter.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/$(DEPDIR)/three_band_filter_bank.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_core.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_core_neon.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_core_sse2.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_resampler.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/echo_cancellation.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/aecm_core.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_c.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_neon.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/echo_control_mobile.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(DEPDIR)/analog_agc.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(DEPDIR)/digital_agc.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/logging/$(DEPDIR)/apm_data_dumper.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/noise_suppression.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/noise_suppression_x.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/ns_core.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/nsx_core.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/nsx_core_c.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/nsx_core_neon.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/block_mean_calculator.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/delay_estimator.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/delay_estimator_wrapper.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/ooura_fft.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_neon.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_sse2.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/webrtc/system_wrappers/source/$(DEPDIR)/cpu_features.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@video/$(DEPDIR)/VideoRenderer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@video/$(DEPDIR)/VideoSource.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse_arm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/cross_correlation_neon.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/downsample_fast_neon.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/min_max_operations_neon.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(DEPDIR)/spl_sqrt_floor.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(DEPDIR)/spl_sqrt_floor_arm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_core_neon.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_core_sse2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_neon.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/nsx_core_neon.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_neon.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_sse2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@webrtc_dsp/rtc_base/$(DEPDIR)/logging_mac.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @@ -1636,21 +4029,51 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs + -rm -rf ./webrtc_dsp/absl/base/internal/.libs ./webrtc_dsp/absl/base/internal/_libs + -rm -rf ./webrtc_dsp/absl/strings/.libs ./webrtc_dsp/absl/strings/_libs + -rm -rf ./webrtc_dsp/absl/strings/internal/.libs ./webrtc_dsp/absl/strings/internal/_libs + -rm -rf ./webrtc_dsp/absl/types/.libs ./webrtc_dsp/absl/types/_libs + -rm -rf ./webrtc_dsp/api/audio/.libs ./webrtc_dsp/api/audio/_libs + -rm -rf ./webrtc_dsp/common_audio/.libs ./webrtc_dsp/common_audio/_libs + -rm -rf ./webrtc_dsp/common_audio/resampler/.libs ./webrtc_dsp/common_audio/resampler/_libs + -rm -rf ./webrtc_dsp/common_audio/signal_processing/.libs ./webrtc_dsp/common_audio/signal_processing/_libs + -rm -rf ./webrtc_dsp/common_audio/third_party/fft4g/.libs ./webrtc_dsp/common_audio/third_party/fft4g/_libs + -rm -rf ./webrtc_dsp/common_audio/vad/.libs ./webrtc_dsp/common_audio/vad/_libs + -rm -rf ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/.libs ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/.libs ./webrtc_dsp/modules/audio_processing/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/aec/.libs ./webrtc_dsp/modules/audio_processing/aec/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/aec3/.libs ./webrtc_dsp/modules/audio_processing/aec3/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/aecm/.libs ./webrtc_dsp/modules/audio_processing/aecm/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/agc/.libs ./webrtc_dsp/modules/audio_processing/agc/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/agc/legacy/.libs ./webrtc_dsp/modules/audio_processing/agc/legacy/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/agc2/.libs ./webrtc_dsp/modules/audio_processing/agc2/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/.libs ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/audio_generator/.libs ./webrtc_dsp/modules/audio_processing/audio_generator/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/echo_detector/.libs ./webrtc_dsp/modules/audio_processing/echo_detector/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/include/.libs ./webrtc_dsp/modules/audio_processing/include/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/logging/.libs ./webrtc_dsp/modules/audio_processing/logging/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/ns/.libs ./webrtc_dsp/modules/audio_processing/ns/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/transient/.libs ./webrtc_dsp/modules/audio_processing/transient/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/utility/.libs ./webrtc_dsp/modules/audio_processing/utility/_libs + -rm -rf ./webrtc_dsp/modules/audio_processing/vad/.libs ./webrtc_dsp/modules/audio_processing/vad/_libs + -rm -rf ./webrtc_dsp/modules/third_party/fft/.libs ./webrtc_dsp/modules/third_party/fft/_libs + -rm -rf ./webrtc_dsp/rtc_base/.libs ./webrtc_dsp/rtc_base/_libs + -rm -rf ./webrtc_dsp/rtc_base/memory/.libs ./webrtc_dsp/rtc_base/memory/_libs + -rm -rf ./webrtc_dsp/rtc_base/strings/.libs ./webrtc_dsp/rtc_base/strings/_libs + -rm -rf ./webrtc_dsp/system_wrappers/source/.libs ./webrtc_dsp/system_wrappers/source/_libs + -rm -rf ./webrtc_dsp/third_party/rnnoise/src/.libs ./webrtc_dsp/third_party/rnnoise/src/_libs -rm -rf audio/.libs audio/_libs -rm -rf os/darwin/.libs os/darwin/_libs -rm -rf os/linux/.libs os/linux/_libs -rm -rf os/posix/.libs os/posix/_libs - -rm -rf webrtc_dsp/webrtc/base/.libs webrtc_dsp/webrtc/base/_libs - -rm -rf webrtc_dsp/webrtc/common_audio/.libs webrtc_dsp/webrtc/common_audio/_libs - -rm -rf webrtc_dsp/webrtc/common_audio/signal_processing/.libs webrtc_dsp/webrtc/common_audio/signal_processing/_libs - -rm -rf webrtc_dsp/webrtc/modules/audio_processing/.libs webrtc_dsp/webrtc/modules/audio_processing/_libs - -rm -rf webrtc_dsp/webrtc/modules/audio_processing/aec/.libs webrtc_dsp/webrtc/modules/audio_processing/aec/_libs - -rm -rf webrtc_dsp/webrtc/modules/audio_processing/aecm/.libs webrtc_dsp/webrtc/modules/audio_processing/aecm/_libs - -rm -rf webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/.libs webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/_libs - -rm -rf webrtc_dsp/webrtc/modules/audio_processing/logging/.libs webrtc_dsp/webrtc/modules/audio_processing/logging/_libs - -rm -rf webrtc_dsp/webrtc/modules/audio_processing/ns/.libs webrtc_dsp/webrtc/modules/audio_processing/ns/_libs - -rm -rf webrtc_dsp/webrtc/modules/audio_processing/utility/.libs webrtc_dsp/webrtc/modules/audio_processing/utility/_libs - -rm -rf webrtc_dsp/webrtc/system_wrappers/source/.libs webrtc_dsp/webrtc/system_wrappers/source/_libs + -rm -rf video/.libs video/_libs + -rm -rf webrtc_dsp/common_audio/signal_processing/.libs webrtc_dsp/common_audio/signal_processing/_libs + -rm -rf webrtc_dsp/common_audio/third_party/spl_sqrt_floor/.libs webrtc_dsp/common_audio/third_party/spl_sqrt_floor/_libs + -rm -rf webrtc_dsp/modules/audio_processing/aec/.libs webrtc_dsp/modules/audio_processing/aec/_libs + -rm -rf webrtc_dsp/modules/audio_processing/aecm/.libs webrtc_dsp/modules/audio_processing/aecm/_libs + -rm -rf webrtc_dsp/modules/audio_processing/ns/.libs webrtc_dsp/modules/audio_processing/ns/_libs + -rm -rf webrtc_dsp/modules/audio_processing/utility/.libs webrtc_dsp/modules/audio_processing/utility/_libs + -rm -rf webrtc_dsp/rtc_base/.libs webrtc_dsp/rtc_base/_libs distclean-libtool: -rm -f libtool config.lt @@ -1945,28 +4368,76 @@ distclean-generic: -rm -f os/linux/$(am__dirstamp) -rm -f os/posix/$(DEPDIR)/$(am__dirstamp) -rm -f os/posix/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/base/$(DEPDIR)/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/base/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/common_audio/$(DEPDIR)/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/common_audio/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aec/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aecm/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(DEPDIR)/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/logging/$(DEPDIR)/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/logging/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/system_wrappers/source/$(DEPDIR)/$(am__dirstamp) - -rm -f webrtc_dsp/webrtc/system_wrappers/source/$(am__dirstamp) + -rm -f video/$(DEPDIR)/$(am__dirstamp) + -rm -f video/$(am__dirstamp) + -rm -f webrtc_dsp/absl/base/internal/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/absl/base/internal/$(am__dirstamp) + -rm -f webrtc_dsp/absl/strings/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/absl/strings/$(am__dirstamp) + -rm -f webrtc_dsp/absl/strings/internal/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/absl/strings/internal/$(am__dirstamp) + -rm -f webrtc_dsp/absl/types/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/absl/types/$(am__dirstamp) + -rm -f webrtc_dsp/api/audio/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/api/audio/$(am__dirstamp) + -rm -f webrtc_dsp/common_audio/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/common_audio/$(am__dirstamp) + -rm -f webrtc_dsp/common_audio/resampler/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/common_audio/resampler/$(am__dirstamp) + -rm -f webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/common_audio/signal_processing/$(am__dirstamp) + -rm -f webrtc_dsp/common_audio/third_party/fft4g/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/common_audio/third_party/fft4g/$(am__dirstamp) + -rm -f webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(am__dirstamp) + -rm -f webrtc_dsp/common_audio/vad/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/common_audio/vad/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/aec/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/aec3/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/aecm/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/agc/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/agc/legacy/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/agc/legacy/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/agc2/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/audio_generator/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/audio_generator/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/echo_detector/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/include/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/logging/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/logging/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/ns/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/transient/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/utility/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/audio_processing/vad/$(am__dirstamp) + -rm -f webrtc_dsp/modules/third_party/fft/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/modules/third_party/fft/$(am__dirstamp) + -rm -f webrtc_dsp/rtc_base/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/rtc_base/$(am__dirstamp) + -rm -f webrtc_dsp/rtc_base/memory/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/rtc_base/memory/$(am__dirstamp) + -rm -f webrtc_dsp/rtc_base/strings/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/rtc_base/strings/$(am__dirstamp) + -rm -f webrtc_dsp/system_wrappers/source/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/system_wrappers/source/$(am__dirstamp) + -rm -f webrtc_dsp/third_party/rnnoise/src/$(DEPDIR)/$(am__dirstamp) + -rm -f webrtc_dsp/third_party/rnnoise/src/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -1991,8 +4462,273 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/VoIPController.Plo -rm -f ./$(DEPDIR)/VoIPGroupController.Plo -rm -f ./$(DEPDIR)/VoIPServerConfig.Plo + -rm -f ./$(DEPDIR)/json11.Plo -rm -f ./$(DEPDIR)/logging.Plo + -rm -f ./webrtc_dsp/absl/base/internal/$(DEPDIR)/raw_logging.Plo + -rm -f ./webrtc_dsp/absl/base/internal/$(DEPDIR)/throw_delegate.Plo + -rm -f ./webrtc_dsp/absl/strings/$(DEPDIR)/ascii.Plo + -rm -f ./webrtc_dsp/absl/strings/$(DEPDIR)/string_view.Plo + -rm -f ./webrtc_dsp/absl/strings/internal/$(DEPDIR)/memutil.Plo + -rm -f ./webrtc_dsp/absl/types/$(DEPDIR)/bad_optional_access.Plo + -rm -f ./webrtc_dsp/absl/types/$(DEPDIR)/optional.Plo + -rm -f ./webrtc_dsp/api/audio/$(DEPDIR)/audio_frame.Plo + -rm -f ./webrtc_dsp/api/audio/$(DEPDIR)/echo_canceller3_config.Plo + -rm -f ./webrtc_dsp/api/audio/$(DEPDIR)/echo_canceller3_factory.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/audio_converter.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/audio_util.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/channel_buffer.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/fir_filter_c.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/fir_filter_factory.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/fir_filter_sse.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/real_fourier.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/real_fourier_ooura.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/ring_buffer.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/smoothing_filter.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/sparse_fir_filter.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/wav_file.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/wav_header.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/window_generator.Plo + -rm -f ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/push_resampler.Plo + -rm -f ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/push_sinc_resampler.Plo + -rm -f ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/resampler.Plo + -rm -f ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/sinc_resampler.Plo + -rm -f ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/sinc_resampler_sse.Plo + -rm -f ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/sinusoidal_linear_chirp_source.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/auto_corr_to_refl_coef.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/auto_correlation.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/complex_fft.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/copy_set_operations.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/cross_correlation.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/division_operations.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/dot_product_with_scale.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/downsample_fast.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/energy.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/filter_ar.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/filter_ar_fast_q12.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/filter_ma_fast_q12.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/get_hanning_window.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/get_scaling_square.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/ilbc_specific_functions.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/levinson_durbin.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/lpc_to_refl_coef.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/min_max_operations.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/randomization_functions.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/real_fft.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/refl_coef_to_lpc.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_48khz.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_by_2.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_by_2_internal.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_fractional.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/spl_init.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/spl_inl.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/spl_sqrt.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/splitting_filter1.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/sqrt_of_one_minus_x_squared.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/vector_scaling_operations.Plo + -rm -f ./webrtc_dsp/common_audio/third_party/fft4g/$(DEPDIR)/fft4g.Plo + -rm -f ./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad.Plo + -rm -f ./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_core.Plo + -rm -f ./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_filterbank.Plo + -rm -f ./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_gmm.Plo + -rm -f ./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_sp.Plo + -rm -f ./webrtc_dsp/common_audio/vad/$(DEPDIR)/webrtc_vad.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/arith_routines.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/arith_routines_hist.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/arith_routines_logist.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/bandwidth_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/crc.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/decode.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/decode_bwe.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/encode.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/encode_lpc_swb.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/entropy_coding.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/filter_functions.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/filterbanks.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/intialize.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/isac.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/isac_vad.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lattice.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_analysis.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_gain_swb_tables.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_shape_swb12_tables.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_shape_swb16_tables.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_tables.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_gain_tables.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_lag_tables.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/spectrum_ar_model_tables.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/transform.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/audio_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/audio_processing_impl.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/echo_cancellation_impl.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/echo_control_mobile_impl.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/gain_control_for_experimental_agc.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/gain_control_impl.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/gain_controller2.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/level_estimator_impl.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/low_cut_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/noise_suppression_impl.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/residual_echo_detector.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/rms_level.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/splitting_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/three_band_filter_bank.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/typing_detection.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/voice_detection_impl.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_core.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_resampler.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/echo_cancellation.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/adaptive_fir_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/aec3_common.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/aec3_fft.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/aec_state.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_delay_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_framer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_processor.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_processor2.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_processor_metrics.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/cascaded_biquad_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/comfort_noise_generator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/decimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/downsampled_render_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_audibility.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_canceller3.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_path_delay_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_path_variability.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_remover.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_remover_metrics.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/erl_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/erle_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/fft_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/filter_analyzer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/frame_blocker.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/fullband_erle_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/main_filter_update_gain.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/matched_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/matched_filter_lag_aggregator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/matrix_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/moving_average.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_buffer2.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_controller.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_controller2.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_controller_metrics.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_reverb_model.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_signal_analyzer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/residual_echo_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_decay_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_frequency_response.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_model.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_model_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_model_fallback.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/shadow_filter_update_gain.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/skew_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/stationarity_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subband_erle_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subtractor.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subtractor_output.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subtractor_output_analyzer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/suppression_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/suppression_gain.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/suppression_gain_limiter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/vector_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/aecm_core.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_c.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/echo_control_mobile.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/agc.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/agc_manager_direct.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/loudness_histogram.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/utility.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc/legacy/$(DEPDIR)/analog_agc.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc/legacy/$(DEPDIR)/digital_agc.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_agc.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_digital_gain_applier.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_mode_level_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_mode_level_estimator_agc.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/agc2_common.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/agc2_testing_common.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/biquad_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/compute_interpolated_gain_curve.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/down_sampler.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/fixed_digital_level_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/fixed_gain_controller.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/gain_applier.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/interpolated_gain_curve.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/limiter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/limiter_db_gain_curve.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/noise_level_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/noise_spectrum_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/saturation_protector.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/signal_classifier.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/vad_with_level.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/vector_float_frame.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/features_extraction.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/fft_util.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/lp_residual.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/pitch_search.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/pitch_search_internal.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/rnn.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/spectral_features.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/spectral_features_internal.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/audio_generator/$(DEPDIR)/file_audio_generator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/circular_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/mean_variance_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/moving_max.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/normalized_covariance_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/aec_dump.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/audio_generator_factory.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/audio_processing.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/audio_processing_statistics.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/config.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/logging/$(DEPDIR)/apm_data_dumper.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/noise_suppression.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/noise_suppression_x.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/ns_core.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/nsx_core.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/nsx_core_c.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/moving_moments.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/transient_detector.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/transient_suppressor.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/wpd_node.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/wpd_tree.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/block_mean_calculator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/delay_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/delay_estimator_wrapper.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/ooura_fft.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/gmm.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/pitch_based_vad.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/pitch_internal.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/pole_zero_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/standalone_vad.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/vad_audio_proc.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/vad_circular_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/voice_activity_detector.Plo + -rm -f ./webrtc_dsp/modules/third_party/fft/$(DEPDIR)/fft.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/checks.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/criticalsection.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/event.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/event_tracer.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/logging_webrtc.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/platform_file.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/platform_thread.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/platform_thread_types.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/race_checker.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/string_to_number.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/stringencode.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/stringutils.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/thread_checker_impl.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/timeutils.Plo + -rm -f ./webrtc_dsp/rtc_base/memory/$(DEPDIR)/aligned_malloc.Plo + -rm -f ./webrtc_dsp/rtc_base/strings/$(DEPDIR)/string_builder.Plo + -rm -f ./webrtc_dsp/system_wrappers/source/$(DEPDIR)/cpu_features.Plo + -rm -f ./webrtc_dsp/system_wrappers/source/$(DEPDIR)/field_trial.Plo + -rm -f ./webrtc_dsp/system_wrappers/source/$(DEPDIR)/metrics.Plo + -rm -f ./webrtc_dsp/third_party/rnnoise/src/$(DEPDIR)/kiss_fft.Plo + -rm -f ./webrtc_dsp/third_party/rnnoise/src/$(DEPDIR)/rnn_vad_weights.Plo -rm -f audio/$(DEPDIR)/AudioIO.Plo + -rm -f audio/$(DEPDIR)/AudioIOCallback.Plo -rm -f audio/$(DEPDIR)/AudioInput.Plo -rm -f audio/$(DEPDIR)/AudioOutput.Plo -rm -f audio/$(DEPDIR)/Resampler.Plo @@ -2008,81 +4744,22 @@ distclean: distclean-am -rm -f os/linux/$(DEPDIR)/AudioOutputPulse.Plo -rm -f os/linux/$(DEPDIR)/AudioPulse.Plo -rm -f os/posix/$(DEPDIR)/NetworkSocketPosix.Plo - -rm -f webrtc_dsp/webrtc/base/$(DEPDIR)/checks.Plo - -rm -f webrtc_dsp/webrtc/base/$(DEPDIR)/stringutils.Plo - -rm -f webrtc_dsp/webrtc/common_audio/$(DEPDIR)/audio_util.Plo - -rm -f webrtc_dsp/webrtc/common_audio/$(DEPDIR)/channel_buffer.Plo - -rm -f webrtc_dsp/webrtc/common_audio/$(DEPDIR)/fft4g.Plo - -rm -f webrtc_dsp/webrtc/common_audio/$(DEPDIR)/ring_buffer.Plo - -rm -f webrtc_dsp/webrtc/common_audio/$(DEPDIR)/sparse_fir_filter.Plo - -rm -f webrtc_dsp/webrtc/common_audio/$(DEPDIR)/wav_file.Plo - -rm -f webrtc_dsp/webrtc/common_audio/$(DEPDIR)/wav_header.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/auto_corr_to_refl_coef.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/auto_correlation.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse_arm.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/complex_fft.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/copy_set_operations.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/cross_correlation.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/cross_correlation_neon.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/division_operations.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/dot_product_with_scale.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/downsample_fast.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/downsample_fast_neon.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/energy.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/filter_ar.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/filter_ar_fast_q12.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/filter_ma_fast_q12.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/get_hanning_window.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/get_scaling_square.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/ilbc_specific_functions.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/levinson_durbin.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/lpc_to_refl_coef.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/min_max_operations.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/min_max_operations_neon.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/randomization_functions.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/real_fft.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/refl_coef_to_lpc.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_48khz.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_by_2.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_by_2_internal.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_fractional.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_init.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_inl.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_sqrt.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_sqrt_floor.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_sqrt_floor_arm.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/splitting_filter_impl.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/sqrt_of_one_minus_x_squared.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/vector_scaling_operations.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/$(DEPDIR)/splitting_filter.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/$(DEPDIR)/three_band_filter_bank.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_core.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_core_neon.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_core_sse2.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_resampler.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/echo_cancellation.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/aecm_core.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_c.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_neon.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/echo_control_mobile.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(DEPDIR)/analog_agc.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(DEPDIR)/digital_agc.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/logging/$(DEPDIR)/apm_data_dumper.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/noise_suppression.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/noise_suppression_x.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/ns_core.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/nsx_core.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/nsx_core_c.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/nsx_core_neon.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/block_mean_calculator.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/delay_estimator.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/delay_estimator_wrapper.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/ooura_fft.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_neon.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_sse2.Plo - -rm -f webrtc_dsp/webrtc/system_wrappers/source/$(DEPDIR)/cpu_features.Plo + -rm -f video/$(DEPDIR)/VideoRenderer.Plo + -rm -f video/$(DEPDIR)/VideoSource.Plo + -rm -f webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse.Plo + -rm -f webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse_arm.Plo + -rm -f webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/cross_correlation_neon.Plo + -rm -f webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/downsample_fast_neon.Plo + -rm -f webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/min_max_operations_neon.Plo + -rm -f webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(DEPDIR)/spl_sqrt_floor.Plo + -rm -f webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(DEPDIR)/spl_sqrt_floor_arm.Plo + -rm -f webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_core_neon.Plo + -rm -f webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_core_sse2.Plo + -rm -f webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_neon.Plo + -rm -f webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/nsx_core_neon.Plo + -rm -f webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_neon.Plo + -rm -f webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_sse2.Plo + -rm -f webrtc_dsp/rtc_base/$(DEPDIR)/logging_mac.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags @@ -2143,8 +4820,273 @@ maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/VoIPController.Plo -rm -f ./$(DEPDIR)/VoIPGroupController.Plo -rm -f ./$(DEPDIR)/VoIPServerConfig.Plo + -rm -f ./$(DEPDIR)/json11.Plo -rm -f ./$(DEPDIR)/logging.Plo + -rm -f ./webrtc_dsp/absl/base/internal/$(DEPDIR)/raw_logging.Plo + -rm -f ./webrtc_dsp/absl/base/internal/$(DEPDIR)/throw_delegate.Plo + -rm -f ./webrtc_dsp/absl/strings/$(DEPDIR)/ascii.Plo + -rm -f ./webrtc_dsp/absl/strings/$(DEPDIR)/string_view.Plo + -rm -f ./webrtc_dsp/absl/strings/internal/$(DEPDIR)/memutil.Plo + -rm -f ./webrtc_dsp/absl/types/$(DEPDIR)/bad_optional_access.Plo + -rm -f ./webrtc_dsp/absl/types/$(DEPDIR)/optional.Plo + -rm -f ./webrtc_dsp/api/audio/$(DEPDIR)/audio_frame.Plo + -rm -f ./webrtc_dsp/api/audio/$(DEPDIR)/echo_canceller3_config.Plo + -rm -f ./webrtc_dsp/api/audio/$(DEPDIR)/echo_canceller3_factory.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/audio_converter.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/audio_util.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/channel_buffer.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/fir_filter_c.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/fir_filter_factory.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/fir_filter_sse.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/real_fourier.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/real_fourier_ooura.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/ring_buffer.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/smoothing_filter.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/sparse_fir_filter.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/wav_file.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/wav_header.Plo + -rm -f ./webrtc_dsp/common_audio/$(DEPDIR)/window_generator.Plo + -rm -f ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/push_resampler.Plo + -rm -f ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/push_sinc_resampler.Plo + -rm -f ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/resampler.Plo + -rm -f ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/sinc_resampler.Plo + -rm -f ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/sinc_resampler_sse.Plo + -rm -f ./webrtc_dsp/common_audio/resampler/$(DEPDIR)/sinusoidal_linear_chirp_source.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/auto_corr_to_refl_coef.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/auto_correlation.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/complex_fft.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/copy_set_operations.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/cross_correlation.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/division_operations.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/dot_product_with_scale.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/downsample_fast.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/energy.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/filter_ar.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/filter_ar_fast_q12.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/filter_ma_fast_q12.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/get_hanning_window.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/get_scaling_square.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/ilbc_specific_functions.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/levinson_durbin.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/lpc_to_refl_coef.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/min_max_operations.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/randomization_functions.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/real_fft.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/refl_coef_to_lpc.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_48khz.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_by_2.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_by_2_internal.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/resample_fractional.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/spl_init.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/spl_inl.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/spl_sqrt.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/splitting_filter1.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/sqrt_of_one_minus_x_squared.Plo + -rm -f ./webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/vector_scaling_operations.Plo + -rm -f ./webrtc_dsp/common_audio/third_party/fft4g/$(DEPDIR)/fft4g.Plo + -rm -f ./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad.Plo + -rm -f ./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_core.Plo + -rm -f ./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_filterbank.Plo + -rm -f ./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_gmm.Plo + -rm -f ./webrtc_dsp/common_audio/vad/$(DEPDIR)/vad_sp.Plo + -rm -f ./webrtc_dsp/common_audio/vad/$(DEPDIR)/webrtc_vad.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/arith_routines.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/arith_routines_hist.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/arith_routines_logist.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/bandwidth_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/crc.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/decode.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/decode_bwe.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/encode.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/encode_lpc_swb.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/entropy_coding.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/filter_functions.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/filterbanks.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/intialize.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/isac.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/isac_vad.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lattice.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_analysis.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_gain_swb_tables.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_shape_swb12_tables.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_shape_swb16_tables.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/lpc_tables.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_gain_tables.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/pitch_lag_tables.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/spectrum_ar_model_tables.Plo + -rm -f ./webrtc_dsp/modules/audio_coding/codecs/isac/main/source/$(DEPDIR)/transform.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/audio_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/audio_processing_impl.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/echo_cancellation_impl.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/echo_control_mobile_impl.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/gain_control_for_experimental_agc.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/gain_control_impl.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/gain_controller2.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/level_estimator_impl.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/low_cut_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/noise_suppression_impl.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/residual_echo_detector.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/rms_level.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/splitting_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/three_band_filter_bank.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/typing_detection.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/$(DEPDIR)/voice_detection_impl.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_core.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_resampler.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/echo_cancellation.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/adaptive_fir_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/aec3_common.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/aec3_fft.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/aec_state.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_delay_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_framer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_processor.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_processor2.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/block_processor_metrics.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/cascaded_biquad_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/comfort_noise_generator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/decimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/downsampled_render_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_audibility.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_canceller3.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_path_delay_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_path_variability.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_remover.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/echo_remover_metrics.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/erl_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/erle_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/fft_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/filter_analyzer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/frame_blocker.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/fullband_erle_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/main_filter_update_gain.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/matched_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/matched_filter_lag_aggregator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/matrix_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/moving_average.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_buffer2.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_controller.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_controller2.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_delay_controller_metrics.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_reverb_model.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/render_signal_analyzer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/residual_echo_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_decay_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_frequency_response.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_model.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_model_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/reverb_model_fallback.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/shadow_filter_update_gain.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/skew_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/stationarity_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subband_erle_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subtractor.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subtractor_output.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/subtractor_output_analyzer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/suppression_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/suppression_gain.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/suppression_gain_limiter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aec3/$(DEPDIR)/vector_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/aecm_core.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_c.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/echo_control_mobile.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/agc.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/agc_manager_direct.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/loudness_histogram.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc/$(DEPDIR)/utility.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc/legacy/$(DEPDIR)/analog_agc.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc/legacy/$(DEPDIR)/digital_agc.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_agc.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_digital_gain_applier.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_mode_level_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/adaptive_mode_level_estimator_agc.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/agc2_common.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/agc2_testing_common.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/biquad_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/compute_interpolated_gain_curve.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/down_sampler.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/fixed_digital_level_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/fixed_gain_controller.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/gain_applier.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/interpolated_gain_curve.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/limiter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/limiter_db_gain_curve.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/noise_level_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/noise_spectrum_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/saturation_protector.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/signal_classifier.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/vad_with_level.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/$(DEPDIR)/vector_float_frame.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/features_extraction.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/fft_util.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/lp_residual.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/pitch_search.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/pitch_search_internal.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/rnn.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/spectral_features.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/agc2/rnn_vad/$(DEPDIR)/spectral_features_internal.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/audio_generator/$(DEPDIR)/file_audio_generator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/circular_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/mean_variance_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/moving_max.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/echo_detector/$(DEPDIR)/normalized_covariance_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/aec_dump.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/audio_generator_factory.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/audio_processing.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/audio_processing_statistics.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/include/$(DEPDIR)/config.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/logging/$(DEPDIR)/apm_data_dumper.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/noise_suppression.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/noise_suppression_x.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/ns_core.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/nsx_core.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/nsx_core_c.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/moving_moments.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/transient_detector.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/transient_suppressor.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/wpd_node.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/transient/$(DEPDIR)/wpd_tree.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/block_mean_calculator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/delay_estimator.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/delay_estimator_wrapper.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/ooura_fft.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/gmm.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/pitch_based_vad.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/pitch_internal.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/pole_zero_filter.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/standalone_vad.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/vad_audio_proc.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/vad_circular_buffer.Plo + -rm -f ./webrtc_dsp/modules/audio_processing/vad/$(DEPDIR)/voice_activity_detector.Plo + -rm -f ./webrtc_dsp/modules/third_party/fft/$(DEPDIR)/fft.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/checks.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/criticalsection.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/event.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/event_tracer.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/logging_webrtc.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/platform_file.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/platform_thread.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/platform_thread_types.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/race_checker.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/string_to_number.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/stringencode.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/stringutils.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/thread_checker_impl.Plo + -rm -f ./webrtc_dsp/rtc_base/$(DEPDIR)/timeutils.Plo + -rm -f ./webrtc_dsp/rtc_base/memory/$(DEPDIR)/aligned_malloc.Plo + -rm -f ./webrtc_dsp/rtc_base/strings/$(DEPDIR)/string_builder.Plo + -rm -f ./webrtc_dsp/system_wrappers/source/$(DEPDIR)/cpu_features.Plo + -rm -f ./webrtc_dsp/system_wrappers/source/$(DEPDIR)/field_trial.Plo + -rm -f ./webrtc_dsp/system_wrappers/source/$(DEPDIR)/metrics.Plo + -rm -f ./webrtc_dsp/third_party/rnnoise/src/$(DEPDIR)/kiss_fft.Plo + -rm -f ./webrtc_dsp/third_party/rnnoise/src/$(DEPDIR)/rnn_vad_weights.Plo -rm -f audio/$(DEPDIR)/AudioIO.Plo + -rm -f audio/$(DEPDIR)/AudioIOCallback.Plo -rm -f audio/$(DEPDIR)/AudioInput.Plo -rm -f audio/$(DEPDIR)/AudioOutput.Plo -rm -f audio/$(DEPDIR)/Resampler.Plo @@ -2160,81 +5102,22 @@ maintainer-clean: maintainer-clean-am -rm -f os/linux/$(DEPDIR)/AudioOutputPulse.Plo -rm -f os/linux/$(DEPDIR)/AudioPulse.Plo -rm -f os/posix/$(DEPDIR)/NetworkSocketPosix.Plo - -rm -f webrtc_dsp/webrtc/base/$(DEPDIR)/checks.Plo - -rm -f webrtc_dsp/webrtc/base/$(DEPDIR)/stringutils.Plo - -rm -f webrtc_dsp/webrtc/common_audio/$(DEPDIR)/audio_util.Plo - -rm -f webrtc_dsp/webrtc/common_audio/$(DEPDIR)/channel_buffer.Plo - -rm -f webrtc_dsp/webrtc/common_audio/$(DEPDIR)/fft4g.Plo - -rm -f webrtc_dsp/webrtc/common_audio/$(DEPDIR)/ring_buffer.Plo - -rm -f webrtc_dsp/webrtc/common_audio/$(DEPDIR)/sparse_fir_filter.Plo - -rm -f webrtc_dsp/webrtc/common_audio/$(DEPDIR)/wav_file.Plo - -rm -f webrtc_dsp/webrtc/common_audio/$(DEPDIR)/wav_header.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/auto_corr_to_refl_coef.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/auto_correlation.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse_arm.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/complex_fft.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/copy_set_operations.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/cross_correlation.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/cross_correlation_neon.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/division_operations.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/dot_product_with_scale.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/downsample_fast.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/downsample_fast_neon.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/energy.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/filter_ar.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/filter_ar_fast_q12.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/filter_ma_fast_q12.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/get_hanning_window.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/get_scaling_square.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/ilbc_specific_functions.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/levinson_durbin.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/lpc_to_refl_coef.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/min_max_operations.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/min_max_operations_neon.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/randomization_functions.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/real_fft.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/refl_coef_to_lpc.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_48khz.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_by_2.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_by_2_internal.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/resample_fractional.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_init.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_inl.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_sqrt.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_sqrt_floor.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/spl_sqrt_floor_arm.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/splitting_filter_impl.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/sqrt_of_one_minus_x_squared.Plo - -rm -f webrtc_dsp/webrtc/common_audio/signal_processing/$(DEPDIR)/vector_scaling_operations.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/$(DEPDIR)/splitting_filter.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/$(DEPDIR)/three_band_filter_bank.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_core.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_core_neon.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_core_sse2.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/aec_resampler.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aec/$(DEPDIR)/echo_cancellation.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/aecm_core.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_c.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_neon.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/aecm/$(DEPDIR)/echo_control_mobile.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(DEPDIR)/analog_agc.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/$(DEPDIR)/digital_agc.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/logging/$(DEPDIR)/apm_data_dumper.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/noise_suppression.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/noise_suppression_x.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/ns_core.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/nsx_core.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/nsx_core_c.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/ns/$(DEPDIR)/nsx_core_neon.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/block_mean_calculator.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/delay_estimator.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/delay_estimator_wrapper.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/ooura_fft.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_neon.Plo - -rm -f webrtc_dsp/webrtc/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_sse2.Plo - -rm -f webrtc_dsp/webrtc/system_wrappers/source/$(DEPDIR)/cpu_features.Plo + -rm -f video/$(DEPDIR)/VideoRenderer.Plo + -rm -f video/$(DEPDIR)/VideoSource.Plo + -rm -f webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse.Plo + -rm -f webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/complex_bit_reverse_arm.Plo + -rm -f webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/cross_correlation_neon.Plo + -rm -f webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/downsample_fast_neon.Plo + -rm -f webrtc_dsp/common_audio/signal_processing/$(DEPDIR)/min_max_operations_neon.Plo + -rm -f webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(DEPDIR)/spl_sqrt_floor.Plo + -rm -f webrtc_dsp/common_audio/third_party/spl_sqrt_floor/$(DEPDIR)/spl_sqrt_floor_arm.Plo + -rm -f webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_core_neon.Plo + -rm -f webrtc_dsp/modules/audio_processing/aec/$(DEPDIR)/aec_core_sse2.Plo + -rm -f webrtc_dsp/modules/audio_processing/aecm/$(DEPDIR)/aecm_core_neon.Plo + -rm -f webrtc_dsp/modules/audio_processing/ns/$(DEPDIR)/nsx_core_neon.Plo + -rm -f webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_neon.Plo + -rm -f webrtc_dsp/modules/audio_processing/utility/$(DEPDIR)/ooura_fft_sse2.Plo + -rm -f webrtc_dsp/rtc_base/$(DEPDIR)/logging_mac.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic diff --git a/libtgvoip/MediaStreamItf.cpp b/libtgvoip/MediaStreamItf.cpp index 889dabc..554ed0d 100644 --- a/libtgvoip/MediaStreamItf.cpp +++ b/libtgvoip/MediaStreamItf.cpp @@ -22,7 +22,7 @@ void MediaStreamItf::SetCallback(size_t (*f)(unsigned char *, size_t, void*), vo size_t MediaStreamItf::InvokeCallback(unsigned char *data, size_t length){ if(callback) return (*callback)(data, length, callbackParam); - return NULL; + return 0; } AudioMixer::AudioMixer() : bufferPool(960*2, 16), processedQueue(16), semaphore(16, 0){ @@ -39,9 +39,9 @@ void AudioMixer::SetOutput(MediaStreamItf* output){ void AudioMixer::Start(){ assert(!running); running=true; - thread=new Thread(new MethodPointer(&AudioMixer::RunThread, this), NULL); - thread->Start(); + thread=new Thread(std::bind(&AudioMixer::RunThread, this)); thread->SetName("AudioMixer"); + thread->Start(); } void AudioMixer::Stop(){ @@ -104,7 +104,7 @@ void AudioMixer::SetInputVolume(std::shared_ptr input, float vol } } -void AudioMixer::RunThread(void* arg){ +void AudioMixer::RunThread(){ LOGV("AudioMixer thread started"); while(running){ semaphore.Acquire(); diff --git a/libtgvoip/MediaStreamItf.h b/libtgvoip/MediaStreamItf.h index 0c8c805..c8b5acd 100644 --- a/libtgvoip/MediaStreamItf.h +++ b/libtgvoip/MediaStreamItf.h @@ -29,7 +29,7 @@ class MediaStreamItf{ size_t InvokeCallback(unsigned char* data, size_t length); private: - size_t (*callback)(unsigned char*, size_t, void*); + size_t (*callback)(unsigned char*, size_t, void*)=NULL; void* callbackParam; }; @@ -45,7 +45,7 @@ class MediaStreamItf{ void SetInputVolume(std::shared_ptr input, float volumeDB); void SetEchoCanceller(EchoCanceller* aec); private: - void RunThread(void* arg); + void RunThread(); struct MixerInput{ std::shared_ptr source; float multiplier; diff --git a/libtgvoip/MessageThread.cpp b/libtgvoip/MessageThread.cpp index 6cda461..9af1441 100755 --- a/libtgvoip/MessageThread.cpp +++ b/libtgvoip/MessageThread.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #ifndef _WIN32 #include @@ -17,12 +18,16 @@ using namespace tgvoip; -MessageThread::MessageThread() : Thread(new MethodPointer(&MessageThread::Run, this), NULL){ +MessageThread::MessageThread() : Thread(std::bind(&MessageThread::Run, this)){ SetName("MessageThread"); #ifdef _WIN32 +#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY!=WINAPI_FAMILY_PHONE_APP event=CreateEvent(NULL, false, false, NULL); +#else + event=CreateEventEx(NULL, NULL, 0, EVENT_ALL_ACCESS); +#endif #else pthread_cond_init(&cond, NULL); #endif @@ -49,7 +54,7 @@ void MessageThread::Stop(){ } } -void MessageThread::Run(void* arg){ +void MessageThread::Run(){ queueMutex.Lock(); while(running){ double currentTime=VoIPController::GetCurrentTime(); @@ -59,7 +64,11 @@ void MessageThread::Run(void* arg){ #ifdef _WIN32 queueMutex.Unlock(); DWORD actualWaitTimeout=waitTimeout==DBL_MAX ? INFINITE : ((DWORD)round(waitTimeout*1000.0)); +#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY!=WINAPI_FAMILY_PHONE_APP WaitForSingleObject(event, actualWaitTimeout); +#else + WaitForSingleObjectEx(event, actualWaitTimeout, false); +#endif // we don't really care if a context switch happens here and anything gets added to the queue by another thread // since any new no-delay messages will get delivered on this iteration anyway queueMutex.Lock(); @@ -78,6 +87,10 @@ void MessageThread::Run(void* arg){ } #endif } + if(!running){ + queueMutex.Unlock(); + return; + } currentTime=VoIPController::GetCurrentTime(); std::vector msgsToDeliverNow; for(std::vector::iterator m=queue.begin();m!=queue.end();){ diff --git a/libtgvoip/MessageThread.h b/libtgvoip/MessageThread.h index a0cd3e0..8feb916 100755 --- a/libtgvoip/MessageThread.h +++ b/libtgvoip/MessageThread.h @@ -6,12 +6,14 @@ #define LIBTGVOIP_MESSAGETHREAD_H #include "threading.h" +#include "utils.h" #include #include namespace tgvoip{ class MessageThread : public Thread{ public: + TGVOIP_DISALLOW_COPY_AND_ASSIGN(MessageThread); MessageThread(); virtual ~MessageThread(); uint32_t Post(std::function func, double delay=0, double interval=0); @@ -30,7 +32,7 @@ namespace tgvoip{ std::function func; }; - void Run(void* arg); + void Run(); void InsertMessageInternal(Message& m); bool running=true; diff --git a/libtgvoip/NetworkSocket.cpp b/libtgvoip/NetworkSocket.cpp index c32bd8f..4ee314e 100644 --- a/libtgvoip/NetworkSocket.cpp +++ b/libtgvoip/NetworkSocket.cpp @@ -26,11 +26,6 @@ using namespace tgvoip; NetworkSocket::NetworkSocket(NetworkProtocol protocol) : protocol(protocol){ ipv6Timeout=ServerConfig::GetSharedInstance()->GetDouble("nat64_fallback_timeout", 3); failed=false; - - proxyAddress=NULL; - proxyPort=0; - proxyUsername=NULL; - proxyPassword=NULL; } NetworkSocket::~NetworkSocket(){ @@ -43,7 +38,9 @@ std::string NetworkSocket::GetLocalInterfaceInfo(IPv4Address *inet4addr, IPv6Add } uint16_t NetworkSocket::GenerateLocalPort(){ - return (uint16_t) ((rand()%(MAX_UDP_PORT-MIN_UDP_PORT))+MIN_UDP_PORT); + uint16_t rnd; + VoIPController::crypto.rand_bytes(reinterpret_cast(&rnd), 2); + return (uint16_t) ((rnd%(MAX_UDP_PORT-MIN_UDP_PORT))+MIN_UDP_PORT); } void NetworkSocket::SetMaxPriority(){ @@ -69,13 +66,6 @@ IPv4Address *NetworkSocket::ResolveDomainName(std::string name){ #endif } -void NetworkSocket::SetSocksProxy(IPv4Address *addr, uint16_t port, char *username, char *password){ - proxyAddress=addr; - proxyPort=port; - proxyUsername=username; - proxyPassword=password; -} - void NetworkSocket::GenerateTCPO2States(unsigned char* buffer, TCPO2State* recvState, TCPO2State* sendState){ memset(recvState, 0, sizeof(TCPO2State)); memset(sendState, 0, sizeof(TCPO2State)); @@ -125,21 +115,21 @@ size_t NetworkSocket::Send(unsigned char *buffer, size_t len){ return pkt.length; } -bool NetworkAddress::operator==(const NetworkAddress &other){ - IPv4Address* self4=dynamic_cast(this); - IPv4Address* other4=dynamic_cast((NetworkAddress*)&other); +bool NetworkAddress::operator==(const NetworkAddress &other) const{ + const IPv4Address* self4=dynamic_cast(this); + const IPv4Address* other4=dynamic_cast((NetworkAddress*)&other); if(self4 && other4){ return self4->GetAddress()==other4->GetAddress(); } - IPv6Address* self6=dynamic_cast(this); - IPv6Address* other6=dynamic_cast((NetworkAddress*)&other); + const IPv6Address* self6=dynamic_cast(this); + const IPv6Address* other6=dynamic_cast((NetworkAddress*)&other); if(self6 && other6){ return memcmp(self6->GetAddress(), other6->GetAddress(), 16)==0; } return false; } -bool NetworkAddress::operator!=(const NetworkAddress &other){ +bool NetworkAddress::operator!=(const NetworkAddress &other) const{ return !(*this == other); } @@ -160,7 +150,7 @@ IPv4Address::IPv4Address(){ } -std::string IPv4Address::ToString(){ +std::string IPv4Address::ToString() const{ #ifndef _WIN32 return NetworkSocketPosix::V4AddressToString(address); #else @@ -168,6 +158,15 @@ std::string IPv4Address::ToString(){ #endif } +bool IPv4Address::PrefixMatches(const unsigned int prefix, const NetworkAddress &other) const{ + const IPv4Address* v4=dynamic_cast(&other); + if(v4){ + uint32_t mask=0xFFFFFFFF << (32-prefix); + return (address & mask) == (v4->address & mask); + } + return false; +} + /*sockaddr &IPv4Address::ToSockAddr(uint16_t port){ sockaddr_in sa; sa.sin_family=AF_INET; @@ -176,11 +175,11 @@ std::string IPv4Address::ToString(){ return *((sockaddr *) &sa); }*/ -uint32_t IPv4Address::GetAddress(){ +uint32_t IPv4Address::GetAddress() const{ return address; } -bool IPv4Address::IsEmpty(){ +bool IPv4Address::IsEmpty() const{ return address==0; } @@ -200,7 +199,7 @@ IPv6Address::IPv6Address(){ memset(address, 0, 16); } -std::string IPv6Address::ToString(){ +std::string IPv6Address::ToString() const{ #ifndef _WIN32 return NetworkSocketPosix::V6AddressToString(address); #else @@ -208,8 +207,12 @@ std::string IPv6Address::ToString(){ #endif } -bool IPv6Address::IsEmpty(){ - uint64_t* a=reinterpret_cast(address); +bool IPv6Address::PrefixMatches(const unsigned int prefix, const NetworkAddress &other) const{ + return false; +} + +bool IPv6Address::IsEmpty() const{ + const uint64_t* a=reinterpret_cast(address); return a[0]==0LL && a[1]==0LL; } @@ -221,15 +224,15 @@ bool IPv6Address::IsEmpty(){ return *((sockaddr *) &sa); }*/ -const uint8_t *IPv6Address::GetAddress(){ +const uint8_t *IPv6Address::GetAddress() const{ return address; } -bool NetworkSocket::Select(std::vector &readFds, std::vector &errorFds, SocketSelectCanceller *canceller){ +bool NetworkSocket::Select(std::vector &readFds, std::vector &writeFds, std::vector &errorFds, SocketSelectCanceller *canceller){ #ifndef _WIN32 - return NetworkSocketPosix::Select(readFds, errorFds, canceller); + return NetworkSocketPosix::Select(readFds, writeFds, errorFds, canceller); #else - return NetworkSocketWinsock::Select(readFds, errorFds, canceller); + return NetworkSocketWinsock::Select(readFds, writeFds, errorFds, canceller); #endif } @@ -283,6 +286,17 @@ void NetworkSocketTCPObfuscated::Send(NetworkPacket *packet){ //LOGD("Sent %u bytes", os.GetLength()); } +bool NetworkSocketTCPObfuscated::OnReadyToSend(){ + if(!initialized){ + //LOGV("Initializing TCPO2 connection"); + initialized=true; + InitConnection(); + readyToSend=true; + return false; + } + return wrapped->OnReadyToSend(); +} + void NetworkSocketTCPObfuscated::Receive(NetworkPacket *packet){ unsigned char len1; size_t packetLen=0; @@ -339,8 +353,8 @@ void NetworkSocketTCPObfuscated::Close(){ wrapped->Close(); } -void NetworkSocketTCPObfuscated::Connect(NetworkAddress *address, uint16_t port){ - +void NetworkSocketTCPObfuscated::Connect(const NetworkAddress *address, uint16_t port){ + wrapped->Connect(address, port); } bool NetworkSocketTCPObfuscated::IsFailed(){ @@ -369,8 +383,8 @@ void NetworkSocketSOCKS5Proxy::Send(NetworkPacket *packet){ BufferOutputStream out(buf, sizeof(buf)); out.WriteInt16(0); // RSV out.WriteByte(0); // FRAG - IPv4Address* v4=dynamic_cast(packet->address); - IPv6Address* v6=dynamic_cast(packet->address); + const IPv4Address* v4=dynamic_cast(packet->address); + const IPv6Address* v6=dynamic_cast(packet->address); if(v4){ out.WriteByte(1); // ATYP (IPv4) out.WriteInt32(v4->GetAddress()); @@ -393,6 +407,8 @@ void NetworkSocketSOCKS5Proxy::Send(NetworkPacket *packet){ void NetworkSocketSOCKS5Proxy::Receive(NetworkPacket *packet){ if(protocol==PROTO_TCP){ tcp->Receive(packet); + packet->address=connectedAddress; + packet->port=connectedPort; }else if(protocol==PROTO_UDP){ unsigned char buf[1500]; NetworkPacket p={0}; @@ -426,203 +442,241 @@ void NetworkSocketSOCKS5Proxy::Receive(NetworkPacket *packet){ } void NetworkSocketSOCKS5Proxy::Open(){ - if(protocol==PROTO_UDP){ - unsigned char buf[1024]; - BufferOutputStream out(buf, sizeof(buf)); - out.WriteByte(5); // VER - out.WriteByte(3); // CMD (UDP ASSOCIATE) - out.WriteByte(0); // RSV - out.WriteByte(1); // ATYP (IPv4) - out.WriteInt32(0); // DST.ADDR - out.WriteInt16(0); // DST.PORT - tcp->Send(buf, out.GetLength()); - size_t l=tcp->Receive(buf, sizeof(buf)); - if(l<2 || tcp->IsFailed()){ - LOGW("socks5: udp associate failed"); - failed=true; - return; - } - try{ - BufferInputStream in(buf, l); - unsigned char ver=in.ReadByte(); - unsigned char rep=in.ReadByte(); - if(ver!=5){ - LOGW("socks5: udp associate: wrong ver in response"); - failed=true; - return; - } - if(rep!=0){ - LOGW("socks5: udp associate failed with error %02X", rep); - failed=true; - return; - } - in.ReadByte(); // RSV - unsigned char atyp=in.ReadByte(); - if(atyp==1){ - uint32_t addr=(uint32_t) in.ReadInt32(); - connectedAddress=new IPv4Address(addr); - }else if(atyp==3){ - unsigned char len=in.ReadByte(); - char domain[256]; - memset(domain, 0, sizeof(domain)); - in.ReadBytes((unsigned char*)domain, len); - LOGD("address type is domain, address=%s", domain); - connectedAddress=ResolveDomainName(std::string(domain)); - if(!connectedAddress){ - LOGW("socks5: failed to resolve domain name '%s'", domain); - failed=true; - return; - } - }else if(atyp==4){ - unsigned char addr[16]; - in.ReadBytes(addr, 16); - connectedAddress=new IPv6Address(addr); - }else{ - LOGW("socks5: unknown address type %d", atyp); - failed=true; - return; - } - connectedPort=(uint16_t)ntohs(in.ReadInt16()); - tcp->SetTimeouts(0, 0); - LOGV("socks5: udp associate successful, given endpoint %s:%d", connectedAddress->ToString().c_str(), connectedPort); - }catch(std::out_of_range& x){ - LOGW("socks5: udp associate response parse failed"); - failed=true; - } - } + } void NetworkSocketSOCKS5Proxy::Close(){ tcp->Close(); } -void NetworkSocketSOCKS5Proxy::Connect(NetworkAddress *address, uint16_t port){ - if(!failed){ - tcp->SetTimeouts(1, 2); - unsigned char buf[1024]; - BufferOutputStream out(buf, sizeof(buf)); - out.WriteByte(5); // VER - out.WriteByte(1); // CMD (CONNECT) - out.WriteByte(0); // RSV - IPv4Address* v4=dynamic_cast(address); - IPv6Address* v6=dynamic_cast(address); - if(v4){ - out.WriteByte(1); // ATYP (IPv4) - out.WriteInt32(v4->GetAddress()); - }else if(v6){ - out.WriteByte(4); // ATYP (IPv6) - out.WriteBytes((unsigned char*)v6->GetAddress(), 16); +void NetworkSocketSOCKS5Proxy::Connect(const NetworkAddress *address, uint16_t port){ + const IPv4Address* v4=dynamic_cast(address); + const IPv6Address* v6=dynamic_cast(address); + connectedAddress=v4 ? (NetworkAddress*)new IPv4Address(*v4) : (NetworkAddress*)new IPv6Address(*v6); + connectedPort=port; +} + +NetworkSocket *NetworkSocketSOCKS5Proxy::GetWrapped(){ + return protocol==PROTO_TCP ? tcp : udp; +} + +void NetworkSocketSOCKS5Proxy::InitConnection(){ +} + +bool NetworkSocketSOCKS5Proxy::IsFailed(){ + return NetworkSocket::IsFailed() || tcp->IsFailed(); +} + +NetworkAddress *NetworkSocketSOCKS5Proxy::GetConnectedAddress(){ + return connectedAddress; +} + +uint16_t NetworkSocketSOCKS5Proxy::GetConnectedPort(){ + return connectedPort; +} + +bool NetworkSocketSOCKS5Proxy::OnReadyToSend(){ + //LOGV("on ready to send, state=%d", state); + unsigned char buf[1024]; + if(state==ConnectionState::Initial){ + BufferOutputStream p(buf, sizeof(buf)); + p.WriteByte(5); // VER + if(!username.empty()){ + p.WriteByte(2); // NMETHODS + p.WriteByte(0); // no auth + p.WriteByte(2); // user/pass }else{ - LOGW("socks5: unknown address type"); - failed=true; - return; + p.WriteByte(1); // NMETHODS + p.WriteByte(0); // no auth } - out.WriteInt16(htons(port)); // DST.PORT - tcp->Send(buf, out.GetLength()); + tcp->Send(buf, p.GetLength()); + state=ConnectionState::WaitingForAuthMethod; + return false; + } + return udp ? udp->OnReadyToSend() : tcp->OnReadyToSend(); +} + +bool NetworkSocketSOCKS5Proxy::OnReadyToReceive(){ + //LOGV("on ready to receive state=%d", state); + unsigned char buf[1024]; + if(state==ConnectionState::WaitingForAuthMethod){ size_t l=tcp->Receive(buf, sizeof(buf)); if(l<2 || tcp->IsFailed()){ - LOGW("socks5: connect failed") failed=true; - return; + return false; } BufferInputStream in(buf, l); unsigned char ver=in.ReadByte(); + unsigned char chosenMethod=in.ReadByte(); + LOGV("socks5: VER=%02X, METHOD=%02X", ver, chosenMethod); if(ver!=5){ - LOGW("socks5: connect: wrong ver in response"); + LOGW("socks5: incorrect VER in response"); failed=true; - return; + return false; } - unsigned char rep=in.ReadByte(); - if(rep!=0){ - LOGW("socks5: connect: failed with error %02X", rep); + if(chosenMethod==0){ + // connected, no further auth needed + SendConnectionCommand(); + }else if(chosenMethod==2 && !username.empty()){ + BufferOutputStream p(buf, sizeof(buf)); + p.WriteByte(1); // VER + p.WriteByte((unsigned char)(username.length()>255 ? 255 : username.length())); // ULEN + p.WriteBytes((unsigned char*)username.c_str(), username.length()>255 ? 255 : username.length()); // UNAME + p.WriteByte((unsigned char)(password.length()>255 ? 255 : password.length())); // PLEN + p.WriteBytes((unsigned char*)password.c_str(), password.length()>255 ? 255 : password.length()); // PASSWD + tcp->Send(buf, p.GetLength()); + state=ConnectionState::WaitingForAuthResult; + }else{ + LOGW("socks5: unsupported auth method"); failed=true; - return; + return false; } - connectedAddress=v4 ? (NetworkAddress*)new IPv4Address(*v4) : (NetworkAddress*)new IPv6Address(*v6); - connectedPort=port; - LOGV("socks5: connect succeeded"); - tcp->SetTimeouts(5, 60); - } -} - -NetworkSocket *NetworkSocketSOCKS5Proxy::GetWrapped(){ - return protocol==PROTO_TCP ? tcp : udp; -} - -void NetworkSocketSOCKS5Proxy::InitConnection(){ - unsigned char buf[1024]; - tcp->SetTimeouts(1, 2); - BufferOutputStream p(buf, sizeof(buf)); - p.WriteByte(5); // VER - if(!username.empty()){ - p.WriteByte(2); // NMETHODS - p.WriteByte(0); // no auth - p.WriteByte(2); // user/pass - }else{ - p.WriteByte(1); // NMETHODS - p.WriteByte(0); // no auth - } - tcp->Send(buf, p.GetLength()); - size_t l=tcp->Receive(buf, sizeof(buf)); - if(l<2 || tcp->IsFailed()){ - failed=true; - return; - } - BufferInputStream in(buf, l); - unsigned char ver=in.ReadByte(); - unsigned char chosenMethod=in.ReadByte(); - LOGV("socks5: VER=%02X, METHOD=%02X", ver, chosenMethod); - if(ver!=5){ - LOGW("socks5: incorrect VER in response"); - failed=true; - return; - } - if(chosenMethod==0){ - // connected, no further auth needed - }else if(chosenMethod==2 && !username.empty()){ - p.Reset(); - p.WriteByte(1); // VER - p.WriteByte((unsigned char)(username.length()>255 ? 255 : username.length())); // ULEN - p.WriteBytes((unsigned char*)username.c_str(), username.length()>255 ? 255 : username.length()); // UNAME - p.WriteByte((unsigned char)(password.length()>255 ? 255 : password.length())); // PLEN - p.WriteBytes((unsigned char*)password.c_str(), password.length()>255 ? 255 : password.length()); // PASSWD - tcp->Send(buf, p.GetLength()); - l=tcp->Receive(buf, sizeof(buf)); + return false; + }else if(state==ConnectionState::WaitingForAuthResult){ + size_t l=tcp->Receive(buf, sizeof(buf)); if(l<2 || tcp->IsFailed()){ failed=true; - return; + return false; } - in=BufferInputStream(buf, l); - ver=in.ReadByte(); + BufferInputStream in(buf, l); + uint8_t ver=in.ReadByte(); unsigned char status=in.ReadByte(); LOGV("socks5: auth response VER=%02X, STATUS=%02X", ver, status); if(ver!=1){ LOGW("socks5: auth response VER is incorrect"); failed=true; - return; + return false; } if(status!=0){ LOGW("socks5: username/password auth failed"); failed=true; - return; + return false; } LOGV("socks5: authentication succeeded"); - }else{ - LOGW("socks5: unsupported auth method"); - failed=true; - return; + SendConnectionCommand(); + return false; + }else if(state==ConnectionState::WaitingForCommandResult){ + size_t l=tcp->Receive(buf, sizeof(buf)); + if(protocol==PROTO_TCP){ + if(l<2 || tcp->IsFailed()){ + LOGW("socks5: connect failed") + failed=true; + return false; + } + BufferInputStream in(buf, l); + unsigned char ver=in.ReadByte(); + if(ver!=5){ + LOGW("socks5: connect: wrong ver in response"); + failed=true; + return false; + } + unsigned char rep=in.ReadByte(); + if(rep!=0){ + LOGW("socks5: connect: failed with error %02X", rep); + failed=true; + return false; + } + LOGV("socks5: connect succeeded"); + state=ConnectionState::Connected; + tcp=new NetworkSocketTCPObfuscated(tcp); + readyToSend=true; + return tcp->OnReadyToSend(); + }else if(protocol==PROTO_UDP){ + if(l<2 || tcp->IsFailed()){ + LOGW("socks5: udp associate failed"); + failed=true; + return false; + } + try{ + BufferInputStream in(buf, l); + unsigned char ver=in.ReadByte(); + unsigned char rep=in.ReadByte(); + if(ver!=5){ + LOGW("socks5: udp associate: wrong ver in response"); + failed=true; + return false; + } + if(rep!=0){ + LOGW("socks5: udp associate failed with error %02X", rep); + failed=true; + return false; + } + in.ReadByte(); // RSV + unsigned char atyp=in.ReadByte(); + if(atyp==1){ + uint32_t addr=(uint32_t) in.ReadInt32(); + connectedAddress=new IPv4Address(addr); + }else if(atyp==3){ + unsigned char len=in.ReadByte(); + char domain[256]; + memset(domain, 0, sizeof(domain)); + in.ReadBytes((unsigned char*)domain, len); + LOGD("address type is domain, address=%s", domain); + connectedAddress=ResolveDomainName(std::string(domain)); + if(!connectedAddress){ + LOGW("socks5: failed to resolve domain name '%s'", domain); + failed=true; + return false; + } + }else if(atyp==4){ + unsigned char addr[16]; + in.ReadBytes(addr, 16); + connectedAddress=new IPv6Address(addr); + }else{ + LOGW("socks5: unknown address type %d", atyp); + failed=true; + return false; + } + connectedPort=(uint16_t)ntohs(in.ReadInt16()); + state=ConnectionState::Connected; + readyToSend=true; + LOGV("socks5: udp associate successful, given endpoint %s:%d", connectedAddress->ToString().c_str(), connectedPort); + }catch(std::out_of_range& x){ + LOGW("socks5: udp associate response parse failed"); + failed=true; + } + } } - tcp->SetTimeouts(5, 60); -} - -bool NetworkSocketSOCKS5Proxy::IsFailed(){ - return NetworkSocket::IsFailed() || tcp->IsFailed(); + return udp ? udp->OnReadyToReceive() : tcp->OnReadyToReceive(); } -NetworkAddress *NetworkSocketSOCKS5Proxy::GetConnectedAddress(){ - return connectedAddress; +void NetworkSocketSOCKS5Proxy::SendConnectionCommand(){ + unsigned char buf[1024]; + if(protocol==PROTO_TCP){ + BufferOutputStream out(buf, sizeof(buf)); + out.WriteByte(5); // VER + out.WriteByte(1); // CMD (CONNECT) + out.WriteByte(0); // RSV + const IPv4Address* v4=dynamic_cast(connectedAddress); + const IPv6Address* v6=dynamic_cast(connectedAddress); + if(v4){ + out.WriteByte(1); // ATYP (IPv4) + out.WriteInt32(v4->GetAddress()); + }else if(v6){ + out.WriteByte(4); // ATYP (IPv6) + out.WriteBytes((unsigned char*)v6->GetAddress(), 16); + }else{ + LOGW("socks5: unknown address type"); + failed=true; + return; + } + out.WriteInt16(htons(connectedPort)); // DST.PORT + tcp->Send(buf, out.GetLength()); + state=ConnectionState::WaitingForCommandResult; + }else if(protocol==PROTO_UDP){ + LOGV("Sending udp associate"); + BufferOutputStream out(buf, sizeof(buf)); + out.WriteByte(5); // VER + out.WriteByte(3); // CMD (UDP ASSOCIATE) + out.WriteByte(0); // RSV + out.WriteByte(1); // ATYP (IPv4) + out.WriteInt32(0); // DST.ADDR + out.WriteInt16(0); // DST.PORT + tcp->Send(buf, out.GetLength()); + state=ConnectionState::WaitingForCommandResult; + } } -uint16_t NetworkSocketSOCKS5Proxy::GetConnectedPort(){ - return connectedPort; +bool NetworkSocketSOCKS5Proxy::NeedSelectForSending(){ + return state==ConnectionState::Initial || state==ConnectionState::Connected; } diff --git a/libtgvoip/NetworkSocket.h b/libtgvoip/NetworkSocket.h index e539b97..67b1342 100644 --- a/libtgvoip/NetworkSocket.h +++ b/libtgvoip/NetworkSocket.h @@ -8,6 +8,7 @@ #include #include #include +#include "utils.h" namespace tgvoip { @@ -25,11 +26,12 @@ namespace tgvoip { class NetworkAddress{ public: - virtual std::string ToString()=0; - bool operator==(const NetworkAddress& other); - bool operator!=(const NetworkAddress& other); + virtual std::string ToString() const =0; + bool operator==(const NetworkAddress& other) const; + bool operator!=(const NetworkAddress& other) const; virtual ~NetworkAddress()=default; - virtual bool IsEmpty()=0; + virtual bool IsEmpty() const =0; + virtual bool PrefixMatches(const unsigned int prefix, const NetworkAddress& other) const =0; }; class IPv4Address : public NetworkAddress{ @@ -37,10 +39,14 @@ namespace tgvoip { IPv4Address(std::string addr); IPv4Address(uint32_t addr); IPv4Address(); - virtual std::string ToString(); - //virtual sockaddr& ToSockAddr(uint16_t port); - uint32_t GetAddress(); - virtual bool IsEmpty(); + virtual std::string ToString() const override; + uint32_t GetAddress() const; + virtual bool IsEmpty() const override; + virtual bool PrefixMatches(const unsigned int prefix, const NetworkAddress& other) const override; + + static const IPv4Address Broadcast(){ + return IPv4Address(0xFFFFFFFF); + } private: uint32_t address; }; @@ -50,10 +56,10 @@ namespace tgvoip { IPv6Address(std::string addr); IPv6Address(const uint8_t* addr); IPv6Address(); - virtual std::string ToString(); - //virtual sockaddr& ToSockAddr(uint16_t port); - const uint8_t* GetAddress(); - virtual bool IsEmpty(); + virtual std::string ToString() const override; + const uint8_t* GetAddress() const; + virtual bool IsEmpty() const override; + virtual bool PrefixMatches(const unsigned int prefix, const NetworkAddress& other) const override; private: uint8_t address[16]; }; @@ -76,6 +82,10 @@ namespace tgvoip { class NetworkSocket{ public: + friend class NetworkSocketPosix; + friend class NetworkSocketWinsock; + + TGVOIP_DISALLOW_COPY_AND_ASSIGN(NetworkSocket); NetworkSocket(NetworkProtocol protocol); virtual ~NetworkSocket(); virtual void Send(NetworkPacket* packet)=0; @@ -85,7 +95,7 @@ namespace tgvoip { virtual void Open()=0; virtual void Close()=0; virtual uint16_t GetLocalPort(){ return 0; }; - virtual void Connect(NetworkAddress* address, uint16_t port)=0; + virtual void Connect(const NetworkAddress* address, uint16_t port)=0; virtual std::string GetLocalInterfaceInfo(IPv4Address* inet4addr, IPv6Address* inet6addr); virtual void OnActiveInterfaceChanged(){}; virtual NetworkAddress* GetConnectedAddress(){ return NULL; }; @@ -93,26 +103,32 @@ namespace tgvoip { virtual void SetTimeouts(int sendTimeout, int recvTimeout){}; virtual bool IsFailed(); - void SetSocksProxy(IPv4Address* addr, uint16_t port, char* username, char* password); + virtual bool IsReadyToSend(){ + return readyToSend; + } + virtual bool OnReadyToSend(){ readyToSend=true; return true; }; + virtual bool OnReadyToReceive(){ return true; }; + void SetTimeout(double timeout){ + this->timeout=timeout; + }; static NetworkSocket* Create(NetworkProtocol protocol); static IPv4Address* ResolveDomainName(std::string name); - static bool Select(std::vector& readFds, std::vector& errorFds, SocketSelectCanceller* canceller); + static bool Select(std::vector& readFds, std::vector& writeFds, std::vector& errorFds, SocketSelectCanceller* canceller); protected: virtual uint16_t GenerateLocalPort(); virtual void SetMaxPriority(); + static void GenerateTCPO2States(unsigned char* buffer, TCPO2State* recvState, TCPO2State* sendState); static void EncryptForTCPO2(unsigned char* buffer, size_t len, TCPO2State* state); double ipv6Timeout; unsigned char nat64Prefix[12]; bool failed; + bool readyToSend=false; + double lastSuccessfulOperationTime=0.0; + double timeout=0.0; NetworkProtocol protocol; - - IPv4Address* proxyAddress; - uint16_t proxyPort; - char* proxyUsername; - char* proxyPassword; }; class NetworkSocketWrapper : public NetworkSocket{ @@ -121,6 +137,7 @@ namespace tgvoip { virtual ~NetworkSocketWrapper(){}; virtual NetworkSocket* GetWrapped()=0; virtual void InitConnection()=0; + virtual void SetNonBlocking(bool){}; }; class NetworkSocketTCPObfuscated : public NetworkSocketWrapper{ @@ -133,14 +150,19 @@ namespace tgvoip { virtual void Receive(NetworkPacket *packet); virtual void Open(); virtual void Close(); - virtual void Connect(NetworkAddress *address, uint16_t port); + virtual void Connect(const NetworkAddress *address, uint16_t port); + virtual bool OnReadyToSend(); virtual bool IsFailed(); + virtual bool IsReadyToSend(){ + return readyToSend && wrapped->IsReadyToSend(); + }; private: NetworkSocket* wrapped; TCPO2State recvState; TCPO2State sendState; + bool initialized=false; }; class NetworkSocketSOCKS5Proxy : public NetworkSocketWrapper{ @@ -151,20 +173,33 @@ namespace tgvoip { virtual void Receive(NetworkPacket *packet); virtual void Open(); virtual void Close(); - virtual void Connect(NetworkAddress *address, uint16_t port); + virtual void Connect(const NetworkAddress *address, uint16_t port); virtual NetworkSocket *GetWrapped(); virtual void InitConnection(); virtual bool IsFailed(); virtual NetworkAddress *GetConnectedAddress(); virtual uint16_t GetConnectedPort(); + virtual bool OnReadyToSend(); + virtual bool OnReadyToReceive(); + + bool NeedSelectForSending(); private: + void SendConnectionCommand(); + enum ConnectionState{ + Initial, + WaitingForAuthMethod, + WaitingForAuthResult, + WaitingForCommandResult, + Connected + }; NetworkSocket* tcp; NetworkSocket* udp; std::string username; std::string password; NetworkAddress* connectedAddress; uint16_t connectedPort; + ConnectionState state=ConnectionState::Initial; IPv4Address lastRecvdV4; IPv6Address lastRecvdV6; diff --git a/libtgvoip/OpusDecoder.cpp b/libtgvoip/OpusDecoder.cpp old mode 100644 new mode 100755 index 87a48eb..0ecd63e --- a/libtgvoip/OpusDecoder.cpp +++ b/libtgvoip/OpusDecoder.cpp @@ -158,7 +158,7 @@ void tgvoip::OpusDecoder::Start(){ if(!async) return; running=true; - thread=new Thread(new MethodPointer(&tgvoip::OpusDecoder::RunThread, this), NULL); + thread=new Thread(std::bind(&tgvoip::OpusDecoder::RunThread, this)); thread->SetName("opus_decoder"); thread->SetMaxPriority(); thread->Start(); @@ -173,7 +173,7 @@ void tgvoip::OpusDecoder::Stop(){ delete thread; } -void tgvoip::OpusDecoder::RunThread(void* param){ +void tgvoip::OpusDecoder::RunThread(){ int i; LOGI("decoder: packets per frame %d", packetsPerFrame); while(running){ @@ -187,8 +187,8 @@ void tgvoip::OpusDecoder::RunThread(void* param){ unsigned char *buf=bufferPool->Get(); if(buf){ if(remainingDataLen>0){ - for(std::vector::iterator effect=postProcEffects.begin();effect!=postProcEffects.end();++effect){ - (*effect)->Process(reinterpret_cast(processedBuffer+(PACKET_SIZE*i)), 960); + for(effects::AudioEffect*& effect:postProcEffects){ + effect->Process(reinterpret_cast(processedBuffer+(PACKET_SIZE*i)), 960); } memcpy(buf, processedBuffer+(PACKET_SIZE*i), PACKET_SIZE); }else{ @@ -279,12 +279,12 @@ void tgvoip::OpusDecoder::SetLevelMeter(AudioLevelMeter *levelMeter){ this->levelMeter=levelMeter; } -void tgvoip::OpusDecoder::AddAudioEffect(AudioEffect *effect){ +void tgvoip::OpusDecoder::AddAudioEffect(effects::AudioEffect *effect){ postProcEffects.push_back(effect); } -void tgvoip::OpusDecoder::RemoveAudioEffect(AudioEffect *effect){ - std::vector::iterator i=std::find(postProcEffects.begin(), postProcEffects.end(), effect); +void tgvoip::OpusDecoder::RemoveAudioEffect(effects::AudioEffect *effect){ + std::vector::iterator i=std::find(postProcEffects.begin(), postProcEffects.end(), effect); if(i!=postProcEffects.end()) postProcEffects.erase(i); } diff --git a/libtgvoip/OpusDecoder.h b/libtgvoip/OpusDecoder.h old mode 100644 new mode 100755 index 5f080bd..5726491 --- a/libtgvoip/OpusDecoder.h +++ b/libtgvoip/OpusDecoder.h @@ -14,6 +14,7 @@ #include "Buffers.h" #include "EchoCanceller.h" #include "JitterBuffer.h" +#include "utils.h" #include #include #include @@ -23,6 +24,7 @@ struct OpusDecoder; namespace tgvoip{ class OpusDecoder { public: + TGVOIP_DISALLOW_COPY_AND_ASSIGN(OpusDecoder); virtual void Start(); virtual void Stop(); @@ -37,13 +39,13 @@ class OpusDecoder { void SetJitterBuffer(std::shared_ptr jitterBuffer); void SetDTX(bool enable); void SetLevelMeter(AudioLevelMeter* levelMeter); - void AddAudioEffect(AudioEffect* effect); - void RemoveAudioEffect(AudioEffect* effect); + void AddAudioEffect(effects::AudioEffect* effect); + void RemoveAudioEffect(effects::AudioEffect* effect); private: void Initialize(bool isAsync, bool needEC); static size_t Callback(unsigned char* data, size_t len, void* param); - void RunThread(void* param); + void RunThread(); int DecodeNextFrame(); ::OpusDecoder* dec; ::OpusDecoder* ecDec; @@ -63,7 +65,7 @@ class OpusDecoder { int consecutiveLostPackets; bool enableDTX; size_t silentPacketCount; - std::vector postProcEffects; + std::vector postProcEffects; bool async; unsigned char nextBuffer[8192]; unsigned char decodeBuffer[8192]; diff --git a/libtgvoip/OpusEncoder.cpp b/libtgvoip/OpusEncoder.cpp old mode 100644 new mode 100755 index e30f814..cf66590 --- a/libtgvoip/OpusEncoder.cpp +++ b/libtgvoip/OpusEncoder.cpp @@ -6,6 +6,7 @@ #include "OpusEncoder.h" #include +#include #include "logging.h" #include "VoIPServerConfig.h" #ifdef HAVE_CONFIG_H @@ -23,32 +24,29 @@ tgvoip::OpusEncoder::OpusEncoder(MediaStreamItf *source, bool needSecondary):que opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); opus_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); - requestedBitrate=32000; + requestedBitrate=20000; currentBitrate=0; running=false; echoCanceller=NULL; complexity=10; frameDuration=20; levelMeter=NULL; - mediumCorrectionBitrate=ServerConfig::GetSharedInstance()->GetInt("audio_medium_fec_bitrate", 10000); - strongCorrectionBitrate=ServerConfig::GetSharedInstance()->GetInt("audio_strong_fec_bitrate", 8000); - mediumCorrectionMultiplier=ServerConfig::GetSharedInstance()->GetDouble("audio_medium_fec_multiplier", 1.5); - strongCorrectionMultiplier=ServerConfig::GetSharedInstance()->GetDouble("audio_strong_fec_multiplier", 2.0); + mediumCorrectionBitrate=static_cast(ServerConfig::GetSharedInstance()->GetInt("audio_medium_fec_bitrate", 10000)); + strongCorrectionBitrate=static_cast(ServerConfig::GetSharedInstance()->GetInt("audio_strong_fec_bitrate", 8000)); + mediumCorrectionMultiplier=ServerConfig::GetSharedInstance()->GetDouble("audio_medium_fec_multiplier", 0.8); + strongCorrectionMultiplier=ServerConfig::GetSharedInstance()->GetDouble("audio_strong_fec_multiplier", 0.5); + vadNoVoiceBitrate=static_cast(ServerConfig::GetSharedInstance()->GetInt("audio_vad_no_voice_bitrate", 6000)); secondaryEncoderEnabled=false; if(needSecondary){ secondaryEncoder=opus_encoder_create(48000, 1, OPUS_APPLICATION_VOIP, NULL); opus_encoder_ctl(secondaryEncoder, OPUS_SET_COMPLEXITY(10)); opus_encoder_ctl(secondaryEncoder, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); - opus_encoder_ctl(secondaryEncoder, OPUS_SET_VBR(0)); - opus_encoder_ctl(secondaryEncoder, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); + //opus_encoder_ctl(secondaryEncoder, OPUS_SET_VBR(0)); opus_encoder_ctl(secondaryEncoder, OPUS_SET_BITRATE(8000)); opus_encoder_ctl(secondaryEncoder, OPUS_SET_INBAND_FEC(1)); opus_encoder_ctl(secondaryEncoder, OPUS_SET_PACKET_LOSS_PERC(15)); - - opus_int32 delay, ecDelay; - opus_encoder_ctl(secondaryEncoder, OPUS_GET_LOOKAHEAD(&ecDelay)); - opus_encoder_ctl(enc, OPUS_GET_LOOKAHEAD(&delay)); + opus_encoder_ctl(secondaryEncoder, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_SUPERWIDEBAND)); }else{ secondaryEncoder=NULL; } @@ -64,7 +62,7 @@ void tgvoip::OpusEncoder::Start(){ if(running) return; running=true; - thread=new Thread(new MethodPointer(&tgvoip::OpusEncoder::RunThread, this), NULL); + thread=new Thread(std::bind(&tgvoip::OpusEncoder::RunThread, this)); thread->SetName("OpusEncoder"); thread->Start(); thread->SetMaxPriority(); @@ -84,15 +82,15 @@ void tgvoip::OpusEncoder::SetBitrate(uint32_t bitrate){ requestedBitrate=bitrate; } -void tgvoip::OpusEncoder::Encode(unsigned char *data, size_t len){ +void tgvoip::OpusEncoder::Encode(int16_t* data, size_t len){ if(requestedBitrate!=currentBitrate){ opus_encoder_ctl(enc, OPUS_SET_BITRATE(requestedBitrate)); currentBitrate=requestedBitrate; LOGV("opus_encoder: setting bitrate to %u", currentBitrate); } if(levelMeter) - levelMeter->Update(reinterpret_cast(data), len/2); - int32_t r=opus_encode(enc, (int16_t*)data, len/2, buffer, 4096); + levelMeter->Update(data, len); + int32_t r=opus_encode(enc, data, static_cast(len), buffer, 4096); if(r<=0){ LOGE("Error encoding: %d", r); }else if(r==1){ @@ -102,7 +100,7 @@ void tgvoip::OpusEncoder::Encode(unsigned char *data, size_t len){ int32_t secondaryLen=0; unsigned char secondaryBuffer[128]; if(secondaryEncoderEnabled && secondaryEncoder){ - secondaryLen=opus_encode(secondaryEncoder, (int16_t*)data, len/2, secondaryBuffer, sizeof(secondaryBuffer)); + secondaryLen=opus_encode(secondaryEncoder, data, static_cast(len), secondaryBuffer, sizeof(secondaryBuffer)); //LOGV("secondaryLen %d", secondaryLen); } InvokeCallback(buffer, (size_t)r, secondaryBuffer, (size_t)secondaryLen); @@ -135,34 +133,67 @@ void tgvoip::OpusEncoder::SetEchoCanceller(EchoCanceller* aec){ echoCanceller=aec; } -void tgvoip::OpusEncoder::RunThread(void* arg){ - unsigned char buf[960*2]; +void tgvoip::OpusEncoder::RunThread(){ uint32_t bufferedCount=0; uint32_t packetsPerFrame=frameDuration/20; LOGV("starting encoder, packets per frame=%d", packetsPerFrame); - unsigned char* frame; + int16_t* frame; if(packetsPerFrame>1) - frame=(unsigned char *) malloc(960*2*packetsPerFrame); + frame=(int16_t*) malloc(960*2*packetsPerFrame); else frame=NULL; + bool frameHasVoice=false; + bool wasVadMode=false; while(running){ - unsigned char* packet=(unsigned char*)queue.GetBlocking(); + int16_t* packet=(int16_t*)queue.GetBlocking(); if(packet){ + bool hasVoice=true; if(echoCanceller) - echoCanceller->ProcessInput(packet, buf, 960*2); - else - memcpy(buf, packet, 960*2); + echoCanceller->ProcessInput(packet, 960, hasVoice); + if(!postProcEffects.empty()){ + for(effects::AudioEffect* effect:postProcEffects){ + effect->Process(packet, 960); + } + } if(packetsPerFrame==1){ - Encode(buf, 960*2); + Encode(packet, 960); }else{ - memcpy(frame+(960*2*bufferedCount), buf, 960*2); + memcpy(frame+(960*bufferedCount), packet, 960*2); + frameHasVoice=frameHasVoice || hasVoice; bufferedCount++; if(bufferedCount==packetsPerFrame){ - Encode(frame, 960*2*packetsPerFrame); + if(vadMode){ + if(frameHasVoice){ + opus_encoder_ctl(enc, OPUS_SET_BITRATE(currentBitrate)); + opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_SUPERWIDEBAND)); + if(secondaryEncoder){ + opus_encoder_ctl(secondaryEncoder, OPUS_SET_BITRATE(currentBitrate)); + opus_encoder_ctl(secondaryEncoder, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_SUPERWIDEBAND)); + } + }else{ + opus_encoder_ctl(enc, OPUS_SET_BITRATE(vadNoVoiceBitrate)); + opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); + if(secondaryEncoder){ + opus_encoder_ctl(secondaryEncoder, OPUS_SET_BITRATE(vadNoVoiceBitrate)); + opus_encoder_ctl(secondaryEncoder, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); + } + } + wasVadMode=true; + }else if(wasVadMode){ + wasVadMode=false; + opus_encoder_ctl(enc, OPUS_SET_BITRATE(currentBitrate)); + opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); + if(secondaryEncoder){ + opus_encoder_ctl(secondaryEncoder, OPUS_SET_BITRATE(currentBitrate)); + opus_encoder_ctl(secondaryEncoder, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_SUPERWIDEBAND)); + } + } + Encode(frame, 960*packetsPerFrame); bufferedCount=0; + frameHasVoice=false; } } - bufferPool.Reuse(packet); + bufferPool.Reuse(reinterpret_cast(packet)); } } if(frame) @@ -176,14 +207,13 @@ void tgvoip::OpusEncoder::SetOutputFrameDuration(uint32_t duration){ void tgvoip::OpusEncoder::SetPacketLoss(int percent){ - packetLossPercent=percent; + packetLossPercent=std::min(20, percent); double multiplier=1; if(currentBitrate<=strongCorrectionBitrate) multiplier=strongCorrectionMultiplier; else if(currentBitrate<=mediumCorrectionBitrate) multiplier=mediumCorrectionMultiplier; opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC((int)(percent*multiplier))); - opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(percent>17 ? OPUS_AUTO : OPUS_BANDWIDTH_FULLBAND)); } int tgvoip::OpusEncoder::GetPacketLoss(){ @@ -210,3 +240,16 @@ void tgvoip::OpusEncoder::InvokeCallback(unsigned char *data, size_t length, uns void tgvoip::OpusEncoder::SetSecondaryEncoderEnabled(bool enabled){ secondaryEncoderEnabled=enabled; } + +void tgvoip::OpusEncoder::SetVadMode(bool vad){ + vadMode=vad; +} +void tgvoip::OpusEncoder::AddAudioEffect(effects::AudioEffect *effect){ + postProcEffects.push_back(effect); +} + +void tgvoip::OpusEncoder::RemoveAudioEffect(effects::AudioEffect *effect){ + std::vector::iterator i=std::find(postProcEffects.begin(), postProcEffects.end(), effect); + if(i!=postProcEffects.end()) + postProcEffects.erase(i); +} diff --git a/libtgvoip/OpusEncoder.h b/libtgvoip/OpusEncoder.h old mode 100644 new mode 100755 index 19cefd8..10313e7 --- a/libtgvoip/OpusEncoder.h +++ b/libtgvoip/OpusEncoder.h @@ -13,6 +13,7 @@ #include "BlockingQueue.h" #include "Buffers.h" #include "EchoCanceller.h" +#include "utils.h" #include @@ -21,6 +22,7 @@ struct OpusEncoder; namespace tgvoip{ class OpusEncoder{ public: + TGVOIP_DISALLOW_COPY_AND_ASSIGN(OpusEncoder); OpusEncoder(MediaStreamItf* source, bool needSecondary); virtual ~OpusEncoder(); virtual void Start(); @@ -35,11 +37,17 @@ class OpusEncoder{ void SetLevelMeter(AudioLevelMeter* levelMeter); void SetCallback(void (*f)(unsigned char*, size_t, unsigned char*, size_t, void*), void* param); void SetSecondaryEncoderEnabled(bool enabled); + void SetVadMode(bool vad); + void AddAudioEffect(effects::AudioEffect* effect); + void RemoveAudioEffect(effects::AudioEffect* effect); + int GetComplexity(){ + return complexity; + } private: static size_t Callback(unsigned char* data, size_t len, void* param); - void RunThread(void* arg); - void Encode(unsigned char* data, size_t len); + void RunThread(); + void Encode(int16_t* data, size_t len); void InvokeCallback(unsigned char* data, size_t length, unsigned char* secondaryData, size_t secondaryLength); MediaStreamItf* source; ::OpusEncoder* enc; @@ -61,6 +69,9 @@ class OpusEncoder{ double strongCorrectionMultiplier; AudioLevelMeter* levelMeter; bool secondaryEncoderEnabled; + bool vadMode=false; + uint32_t vadNoVoiceBitrate; + std::vector postProcEffects; void (*callback)(unsigned char*, size_t, unsigned char*, size_t, void*); void* callbackParam; diff --git a/libtgvoip/PacketReassembler.cpp b/libtgvoip/PacketReassembler.cpp index 8ef2cea..ea05b91 100644 --- a/libtgvoip/PacketReassembler.cpp +++ b/libtgvoip/PacketReassembler.cpp @@ -3,6 +3,9 @@ // #include "PacketReassembler.h" +#include "logging.h" + +#include using namespace tgvoip; @@ -18,6 +21,54 @@ void PacketReassembler::Reset(){ } -void PacketReassembler::AddPacket(unsigned char *data, size_t offset, size_t len, uint32_t pts){ +void PacketReassembler::AddFragment(Buffer pkt, unsigned int fragmentIndex, unsigned int fragmentCount, uint32_t pts, bool keyframe){ + //LOGD("add fragment: ts=%u, index=%u of %u", pts, fragmentIndex, fragmentCount); + if(pts!=currentTimestamp){ + assert(fragmentCount<=255); + currentTimestamp=pts; + /*for(Buffer& b:parts){ + if(!b.IsEmpty()) + b=Buffer(); + }*/ + currentPacketPartCount=fragmentCount; + currentIsKeyframe=keyframe; + receivedPartCount=0; + } + if(fragmentCount==0 || fragmentCount==1){ + callback(std::move(pkt), pts, keyframe); + return; + } + + if(fragmentIndex callback){ + this->callback=callback; } diff --git a/libtgvoip/PacketReassembler.h b/libtgvoip/PacketReassembler.h index 44e027f..9701614 100644 --- a/libtgvoip/PacketReassembler.h +++ b/libtgvoip/PacketReassembler.h @@ -5,24 +5,29 @@ #ifndef TGVOIP_PACKETREASSEMBLER_H #define TGVOIP_PACKETREASSEMBLER_H -#include "MediaStreamItf.h" +#include +#include +#include + +#include "Buffers.h" namespace tgvoip { - class PacketReassembler : public MediaStreamItf{ + class PacketReassembler{ public: PacketReassembler(); virtual ~PacketReassembler(); - void Start(){}; - void Stop(){}; - void Reset(); - void AddPacket(unsigned char* data, size_t offset, size_t len, uint32_t pts); + void AddFragment(Buffer pkt, unsigned int fragmentIndex, unsigned int fragmentCount, uint32_t pts, bool keyframe); + void SetCallback(std::function callback); private: - unsigned char* buffer; - size_t currentSize; - size_t finalSize; + uint32_t currentTimestamp; + unsigned int currentPacketPartCount=0; + std::array parts; + std::function callback; + bool currentIsKeyframe; + unsigned int receivedPartCount=0; }; } diff --git a/libtgvoip/PrivateDefines.h b/libtgvoip/PrivateDefines.h index 49990eb..e6668be 100644 --- a/libtgvoip/PrivateDefines.h +++ b/libtgvoip/PrivateDefines.h @@ -26,13 +26,16 @@ #define IS_MOBILE_NETWORK(x) (x==NET_TYPE_GPRS || x==NET_TYPE_EDGE || x==NET_TYPE_3G || x==NET_TYPE_HSPA || x==NET_TYPE_LTE || x==NET_TYPE_OTHER_MOBILE) #define PROTOCOL_NAME 0x50567247 // "GrVP" in little endian (reversed here) -#define PROTOCOL_VERSION 6 +#define PROTOCOL_VERSION 9 #define MIN_PROTOCOL_VERSION 3 #define STREAM_DATA_FLAG_LEN16 0x40 #define STREAM_DATA_FLAG_HAS_MORE_FLAGS 0x80 -#define STREAM_DATA_XFLAG_KEYFRAME 0x01 -#define STREAM_DATA_XFLAG_FRAGMENTED 0x02 +// Since the data can't be larger than the MTU anyway, +// 5 top bits of data length are allocated for these flags +#define STREAM_DATA_XFLAG_KEYFRAME (1 << 15) +#define STREAM_DATA_XFLAG_FRAGMENTED (1 << 14) +#define STREAM_DATA_XFLAG_EXTRA_FEC (1 << 13) #define STREAM_TYPE_AUDIO 1 #define STREAM_TYPE_VIDEO 2 @@ -41,9 +44,12 @@ #define CODEC_OPUS_OLD 1 #define CODEC_OPUS FOURCC('O','P','U','S') + #define CODEC_AVC FOURCC('A','V','C',' ') #define CODEC_HEVC FOURCC('H','E','V','C') #define CODEC_VP8 FOURCC('V','P','8','0') +#define CODEC_VP9 FOURCC('V','P','9','0') +#define CODEC_AV1 FOURCC('A','V','0','1') #define DEFAULT_MTU 1100 @@ -75,6 +81,17 @@ #define INIT_FLAG_DATA_SAVING_ENABLED 1 #define INIT_FLAG_GROUP_CALLS_SUPPORTED 2 +#define INIT_FLAG_VIDEO_SEND_SUPPORTED 4 +#define INIT_FLAG_VIDEO_RECV_SUPPORTED 8 + +#define INIT_VIDEO_RES_NONE 0 +#define INIT_VIDEO_RES_240 1 +#define INIT_VIDEO_RES_360 2 +#define INIT_VIDEO_RES_480 3 +#define INIT_VIDEO_RES_720 4 +#define INIT_VIDEO_RES_1080 5 +#define INIT_VIDEO_RES_1440 6 +#define INIT_VIDEO_RES_4K 7 #define TLID_DECRYPTED_AUDIO_BLOCK 0xDBF948C1 #define TLID_SIMPLE_AUDIO_BLOCK 0xCC0D0E76 @@ -86,7 +103,7 @@ #define TLID_VECTOR 0x1cb5c415 #define PAD4(x) (4-(x+(x<=253 ? 1 : 0))%4) -#define MAX_RECENT_PACKETS 64 +#define MAX_RECENT_PACKETS 128 #define MAX(a,b) (a>b ? a : b) #define MIN(a,b) (as2) && (s1-s2<=SEQ_MAX/2)) || ((s1SEQ_MAX/2)); } +#define NEED_RATE_FLAG_SHITTY_INTERNET_MODE 1 +#define NEED_RATE_FLAG_UDP_NA 2 +#define NEED_RATE_FLAG_UDP_BAD 4 +#define NEED_RATE_FLAG_RECONNECTING 8 + +#define VIDEO_FRAME_FLAG_KEYFRAME 1 #endif //TGVOIP_PRIVATEDEFINES_H diff --git a/libtgvoip/VoIPController.cpp b/libtgvoip/VoIPController.cpp index 61b7fbf..b134f56 100755 --- a/libtgvoip/VoIPController.cpp +++ b/libtgvoip/VoIPController.cpp @@ -19,12 +19,14 @@ #include "OpusDecoder.h" #include "VoIPServerConfig.h" #include "PrivateDefines.h" +#include "json11.hpp" #include #include #include #include #include #include +#include #include #include @@ -52,10 +54,18 @@ int64_t VoIPController::win32TimeScale = 0; bool VoIPController::didInitWin32TimeScale = false; #endif +#ifdef __ANDROID__ +#include "os/android/JNIUtilities.h" +#include "os/android/AudioInputAndroid.h" +extern jclass jniUtilitiesClass; +#endif + #if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) #include "audio/AudioIOCallback.h" #endif +#pragma mark - OpenSSL wrappers + #ifndef TGVOIP_USE_CUSTOM_CRYPTO extern "C" { #include @@ -127,6 +137,8 @@ extern FILE* tgvoipLogFile; extern std::shared_ptr _voip_logger; #endif +#pragma mark - Public API + VoIPController::VoIPController() : activeNetItfName(""), currentAudioInput("default"), currentAudioOutput("default"), @@ -146,7 +158,6 @@ VoIPController::VoIPController() : activeNetItfName(""), audioTimestampIn=0; audioTimestampOut=0; stopping=false; - sendQueue=new BlockingQueue(21); memset(recvPacketTimes, 0, sizeof(double)*32); memset(&stats, 0, sizeof(TrafficStats)); lastRemoteAckSeq=0; @@ -158,7 +169,6 @@ VoIPController::VoIPController() : activeNetItfName(""), echoCanceller=NULL; dontSendPackets=0; micMuted=false; - currentEndpoint=NULL; waitingForRelayPeerInfo=false; allowP2p=true; dataSavingMode=false; @@ -171,14 +181,12 @@ VoIPController::VoIPController() : activeNetItfName(""), prevSendLossCount=0; receivedInit=false; receivedInitAck=false; - peerPreferredRelay=NULL; statsDump=NULL; useTCP=false; useUDP=true; didAddTcpRelays=false; udpPingCount=0; lastUdpPingTime=0; - openingTcpSocket=NULL; proxyProtocol=PROXY_NONE; proxyPort=0; @@ -190,8 +198,6 @@ VoIPController::VoIPController() : activeNetItfName(""), udpConnectivityState=UDP_UNKNOWN; echoCancellationStrength=1; - outputAGC=NULL; - outputAGCEnabled=false; peerCapabilities=0; callbacks={0}; didReceiveGroupCallKey=false; @@ -228,15 +234,16 @@ VoIPController::VoIPController() : activeNetItfName(""), p2pToRelaySwitchThreshold=ServerConfig::GetSharedInstance()->GetDouble("p2p_to_relay_switch_threshold", 0.6); relayToP2pSwitchThreshold=ServerConfig::GetSharedInstance()->GetDouble("relay_to_p2p_switch_threshold", 0.8); reconnectingTimeout=ServerConfig::GetSharedInstance()->GetDouble("reconnecting_state_timeout", 2.0); + needRateFlags=static_cast(ServerConfig::GetSharedInstance()->GetInt("rate_flags", 0xFFFFFFFF)); + rateMaxAcceptableRTT=ServerConfig::GetSharedInstance()->GetDouble("rate_min_rtt", 0.6); + rateMaxAcceptableSendLoss=ServerConfig::GetSharedInstance()->GetDouble("rate_min_send_loss", 0.2); + packetLossToEnableExtraEC=ServerConfig::GetSharedInstance()->GetDouble("packet_loss_for_extra_ec", 0.02); + maxUnsentStreamPackets=static_cast(ServerConfig::GetSharedInstance()->GetInt("max_unsent_stream_packets", 2)); #ifdef __APPLE__ machTimestart=0; #endif - sendQueue->SetOverflowCallback([](PendingOutgoingPacket p){ - LOGW("Dropping outgoing packet (type %d seq %d) from queue", p.type, p.seq); - }); - shared_ptr stm=make_shared(); stm->id=1; stm->type=STREAM_TYPE_AUDIO; @@ -245,24 +252,17 @@ VoIPController::VoIPController() : activeNetItfName(""), stm->frameDuration=60; outgoingStreams.push_back(stm); - /*Stream vstm={0}; - vstm.id=2; - vstm.type=STREAM_TYPE_VIDEO; - vstm.codec=CODEC_AVC; - vstm.enabled=1; - outgoingStreams.push_back(vstm);*/ - -#if defined(TGVOIP_USE_SOFTWARE_AUDIO) - pj_thread_t *tmp_thread = nullptr; - pj_thread_desc tmp_thread_desc; - if (!pj_thread_is_registered()) { - pj_bzero(&tmp_thread_desc, sizeof(tmp_thread_desc)); - pj_status_t status; - status = pj_thread_register("tmp", tmp_thread_desc, &tmp_thread); - if (status != PJ_SUCCESS) { - LOGE("Temp constructor thread PJ register failed"); - } - } + #if defined(TGVOIP_USE_SOFTWARE_AUDIO) + pj_thread_t *tmp_thread = nullptr; + pj_thread_desc tmp_thread_desc; + if (!pj_thread_is_registered()) { + pj_bzero(&tmp_thread_desc, sizeof(tmp_thread_desc)); + pj_status_t status; + status = pj_thread_register("tmp", tmp_thread_desc, &tmp_thread); + if (status != PJ_SUCCESS) { + LOGE("Temp constructor thread PJ register failed"); + } + } softwareMediaInput = new tgvoip::audio::SoftwareAudioInput(); softwareMediaOutput = new tgvoip::audio::SoftwareAudioOutput(); @@ -296,37 +296,24 @@ VoIPController::~VoIPController(){ delete udpSocket; if(udpSocket!=realUdpSocket) delete realUdpSocket; + LOGD("before delete audioIO"); + if(audioIO){ + delete audioIO; + audioInput=NULL; + audioOutput=NULL; + } for(vector>::iterator _stm=incomingStreams.begin();_stm!=incomingStreams.end();++_stm){ - //LOGD("before delete jitter buffer"); shared_ptr stm=*_stm; - /*if(stm->jitterBuffer){ - delete stm->jitterBuffer; - }*/ LOGD("before stop decoder"); if(stm->decoder){ stm->decoder->Stop(); } } - //LOGD("before delete audio input"); - //if(audioInput){ - // delete audioInput; - //} LOGD("before delete encoder"); if(encoder){ encoder->Stop(); delete encoder; } - //LOGD("before delete audio output"); - //if(audioOutput){ - //delete audioOutput; - //audioOutput.reset(); - //} - /*for(vector>::iterator stm=incomingStreams.begin();stm!=incomingStreams.end();++stm){ - LOGD("before delete decoder"); - if((*stm)->decoder){ - delete (*stm)->decoder; - } - }*/ #if defined(TGVOIP_USE_SOFTWARE_AUDIO) delete softwareMediaInput; delete softwareMediaOutput; @@ -340,33 +327,18 @@ VoIPController::~VoIPController(){ echoCanceller->Stop(); delete echoCanceller; } - delete sendQueue; - /*for(i=0;idata) - free(queuedPackets[i]->data); - free(queuedPackets[i]); - }*/ delete conctl; - /*for(vector::iterator itr=endpoints.begin();itr!=endpoints.end();++itr){ - if((*itr)->socket){ - (*itr)->socket->Close(); - delete (*itr)->socket; - } - delete *itr; - }*/ - if(tgvoipLogFile){ - FILE* log=tgvoipLogFile; - tgvoipLogFile=NULL; - fclose(log); - } if(statsDump) fclose(statsDump); if(resolvedProxyAddress) delete resolvedProxyAddress; delete selectCanceller; - if(outputAGC) - delete outputAGC; LOGD("Left VoIPController::~VoIPController"); + if(tgvoipLogFile){ + FILE* log=tgvoipLogFile; + tgvoipLogFile=NULL; + fclose(log); + } } void VoIPController::Stop(){ @@ -379,9 +351,9 @@ void VoIPController::Stop(){ if(realUdpSocket!=udpSocket) realUdpSocket->Close(); selectCanceller->CancelSelect(); - sendQueue->Put(PendingOutgoingPacket{0}); - if(openingTcpSocket) - openingTcpSocket->Close(); + Buffer emptyBuf(0); + //PendingOutgoingPacket emptyPacket{0, 0, 0, move(emptyBuf), 0}; + //sendQueue->Put(move(emptyPacket)); LOGD("before join sendThread"); if(sendThread){ sendThread->Join(); @@ -406,27 +378,34 @@ void VoIPController::Stop(){ audioOutput->SetCallback(NULL, NULL); } } - LOGD("Left VoIPController::Stop"); + LOGD("Left VoIPController::Stop [need rate = %d]", (int)needRate); +} + +bool VoIPController::NeedRate(){ + return needRate && ServerConfig::GetSharedInstance()->GetBoolean("bad_call_rating", false); } void VoIPController::SetRemoteEndpoints(vector endpoints, bool allowP2p, int32_t connectionMaxLayer){ LOGW("Set remote endpoints, allowP2P=%d, connectionMaxLayer=%u", allowP2p ? 1 : 0, connectionMaxLayer); - preferredRelay=NULL; + preferredRelay=0; { MutexGuard m(endpointsMutex); this->endpoints.clear(); didAddTcpRelays=false; useTCP=true; for(vector::iterator itrtr=endpoints.begin();itrtr!=endpoints.end();++itrtr){ - this->endpoints.push_back(make_shared(*itrtr)); - if(itrtr->type==Endpoint::TYPE_TCP_RELAY) + if(this->endpoints.find(itrtr->id)!=this->endpoints.end()) + LOGE("Endpoint IDs are not unique!"); + this->endpoints[itrtr->id]=*itrtr; + if(currentEndpoint==0) + currentEndpoint=itrtr->id; + if(itrtr->type==Endpoint::Type::TCP_RELAY) didAddTcpRelays=true; - if(itrtr->type==Endpoint::TYPE_UDP_RELAY) + if(itrtr->type==Endpoint::Type::UDP_RELAY) useTCP=false; - LOGV("Adding endpoint: %s:%d, %s", itrtr->address.ToString().c_str(), itrtr->port, itrtr->type==Endpoint::TYPE_UDP_RELAY ? "UDP" : "TCP"); + LOGV("Adding endpoint: %s:%d, %s", itrtr->address.ToString().c_str(), itrtr->port, itrtr->type==Endpoint::Type::UDP_RELAY ? "UDP" : "TCP"); } } - currentEndpoint=this->endpoints[0]; preferredRelay=currentEndpoint; this->allowP2p=allowP2p; this->connectionMaxLayer=connectionMaxLayer; @@ -447,145 +426,29 @@ void VoIPController::Start(){ //SendPacket(NULL, 0, currentEndpoint); runReceiver=true; - recvThread=new Thread(new MethodPointer(&VoIPController::RunRecvThread, this), NULL); + recvThread=new Thread(bind(&VoIPController::RunRecvThread, this)); recvThread->SetName("VoipRecv"); recvThread->Start(); - sendThread=new Thread(new MethodPointer(&VoIPController::RunSendThread, this), NULL); - sendThread->SetName("VoipSend"); - sendThread->Start(); messageThread.Start(); } -void VoIPController::AudioInputCallback(unsigned char* data, size_t length, unsigned char* secondaryData, size_t secondaryLength, void* param){ - ((VoIPController*)param)->HandleAudioInput(data, length, secondaryData, secondaryLength); -} - -void VoIPController::HandleAudioInput(unsigned char *data, size_t len, unsigned char* secondaryData, size_t secondaryLen){ - if(stopping) - return; - if(waitingForAcks || dontSendPackets>0 || (unsigned int)unsentStreamPackets>=2){ - LOGV("waiting for queue, dropping outgoing audio packet"); - return; - } - //LOGV("Audio packet size %u", (unsigned int)len); - - BufferOutputStream pkt(1500); - - unsigned char flags=(unsigned char) (len>255 ? STREAM_DATA_FLAG_LEN16 : 0); - pkt.WriteByte((unsigned char) (1 | flags)); // streamID + flags - if(len>255) - pkt.WriteInt16((int16_t) len); - else - pkt.WriteByte((unsigned char) len); - pkt.WriteInt32(audioTimestampOut); - pkt.WriteBytes(data, len); - - unsentStreamPackets++; - PendingOutgoingPacket p{ - /*.seq=*/GenerateOutSeq(), - /*.type=*/PKT_STREAM_DATA, - /*.len=*/pkt.GetLength(), - /*.data=*/Buffer(move(pkt)), - /*.endpoint=*/0, - }; - sendQueue->Put(move(p)); - if(secondaryData && secondaryLen && shittyInternetMode){ - Buffer ecBuf(secondaryLen); - ecBuf.CopyFrom(secondaryData, 0, secondaryLen); - ecAudioPackets.push_back(move(ecBuf)); - while(ecAudioPackets.size()>4) - ecAudioPackets.erase(ecAudioPackets.begin()); - pkt=BufferOutputStream(1500); - pkt.WriteByte(outgoingStreams[0]->id); - pkt.WriteInt32(audioTimestampOut); - pkt.WriteByte((unsigned char)ecAudioPackets.size()); - for(Buffer& ecData:ecAudioPackets){ - pkt.WriteByte((unsigned char)ecData.Length()); - pkt.WriteBytes(ecData); - } - - PendingOutgoingPacket p{ - GenerateOutSeq(), - PKT_STREAM_EC, - pkt.GetLength(), - Buffer(move(pkt)), - 0 - }; - sendQueue->Put(move(p)); - } - - audioTimestampOut+=outgoingStreams[0]->frameDuration; -} - -void VoIPController::HandleVideoInput(EncodedVideoFrame& frame){ - if(stopping) - return; - if(waitingForAcks || dontSendPackets>0 || networkType==NET_TYPE_EDGE || networkType==NET_TYPE_GPRS){ - LOGV("dropping outgoing video packet"); - return; - } - - -} void VoIPController::Connect(){ assert(state!=STATE_WAIT_INIT_ACK); - if(proxyProtocol==PROXY_SOCKS5){ - resolvedProxyAddress=NetworkSocket::ResolveDomainName(proxyAddress); - if(!resolvedProxyAddress){ - LOGW("Error resolving proxy address %s", proxyAddress.c_str()); - SetState(STATE_FAILED); - return; - } - InitUDPProxy(); - } connectionInitTime=GetCurrentTime(); if(config.initTimeout==0.0){ LOGE("Init timeout is 0 -- did you forget to set config?"); config.initTimeout=30.0; } - InitializeTimers(); - SendInit(); -} - -void VoIPController::InitializeTimers(){ - initTimeoutID=messageThread.Post([this]{ - LOGW("Init timeout, disconnecting"); - lastError=ERROR_TIMEOUT; - SetState(STATE_FAILED); - }, config.initTimeout); - - if(!config.statsDumpFilePath.empty()){ - messageThread.Post([this]{ - if(statsDump && incomingStreams.size()==1){ - shared_ptr& jitterBuffer=incomingStreams[0]->jitterBuffer; - //fprintf(statsDump, "Time\tRTT\tLISeq\tLASeq\tCWnd\tBitrate\tJitter\tJDelay\tAJDelay\n"); - fprintf(statsDump, "%.3f\t%.3f\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%.3f\t%.3f\t%.3f\n", - GetCurrentTime()-connectionInitTime, - currentEndpoint->rtts[0], - lastRemoteSeq, - seq, - lastRemoteAckSeq, - recvLossCount, - conctl ? conctl->GetSendLossCount() : 0, - conctl ? (int)conctl->GetInflightDataSize() : 0, - encoder ? encoder->GetBitrate() : 0, - encoder ? encoder->GetPacketLoss() : 0, - jitterBuffer ? jitterBuffer->GetLastMeasuredJitter() : 0, - jitterBuffer ? jitterBuffer->GetLastMeasuredDelay()*0.06 : 0, - jitterBuffer ? jitterBuffer->GetAverageDelay()*0.06 : 0); - } - }, 0.1, 0.1); - } - - udpConnectivityState=UDP_PING_PENDING; - udpPingTimeoutID=messageThread.Post(std::bind(&VoIPController::SendUdpPings, this), 0.0, 0.5); - messageThread.Post(std::bind(&VoIPController::SendRelayPings, this), 0.0, 2.0); + //InitializeTimers(); + //SendInit(); + sendThread=new Thread(bind(&VoIPController::RunSendThread, this)); + sendThread->SetName("VoipSend"); + sendThread->Start(); } - void VoIPController::SetEncryptionKey(char *key, bool isOutgoing){ memcpy(encryptionKey, key, 256); uint8_t sha1[SHA1_LENGTH]; @@ -597,143 +460,1025 @@ void VoIPController::SetEncryptionKey(char *key, bool isOutgoing){ this->isOutgoing=isOutgoing; } -uint32_t VoIPController::GenerateOutSeq(){ - return seq++; -} - -void VoIPController::WritePacketHeader(uint32_t pseq, BufferOutputStream *s, unsigned char type, uint32_t length){ - uint32_t acks=0; - int i; - for(i=0;i<32;i++){ - if(recvPacketTimes[i]>0) - acks|=1; - if(i<31) - acks<<=1; - } - - if(state==STATE_WAIT_INIT || state==STATE_WAIT_INIT_ACK){ - s->WriteInt32(TLID_DECRYPTED_AUDIO_BLOCK); - int64_t randomID; - crypto.rand_bytes((uint8_t *) &randomID, 8); - s->WriteInt64(randomID); - unsigned char randBytes[7]; - crypto.rand_bytes(randBytes, 7); - s->WriteByte(7); - s->WriteBytes(randBytes, 7); - uint32_t pflags=PFLAG_HAS_RECENT_RECV | PFLAG_HAS_SEQ; - if(length>0) - pflags|=PFLAG_HAS_DATA; - if(state==STATE_WAIT_INIT || state==STATE_WAIT_INIT_ACK){ - pflags|=PFLAG_HAS_CALL_ID | PFLAG_HAS_PROTO; - } - pflags|=((uint32_t) type) << 24; - s->WriteInt32(pflags); - - if(pflags & PFLAG_HAS_CALL_ID){ - s->WriteBytes(callID, 16); - } - s->WriteInt32(lastRemoteSeq); - s->WriteInt32(pseq); - s->WriteInt32(acks); - if(pflags & PFLAG_HAS_PROTO){ - s->WriteInt32(PROTOCOL_NAME); +void VoIPController::SetNetworkType(int type){ + networkType=type; + UpdateDataSavingState(); + UpdateAudioBitrateLimit(); + myIPv6=IPv6Address(); + string itfName=udpSocket->GetLocalInterfaceInfo(NULL, &myIPv6); + LOGI("set network type: %s, active interface %s", NetworkTypeToString(type).c_str(), itfName.c_str()); + LOGI("Local IPv6 address: %s", myIPv6.ToString().c_str()); + if(IS_MOBILE_NETWORK(networkType)){ + CellularCarrierInfo carrier=GetCarrierInfo(); + if(!carrier.name.empty()){ + LOGI("Carrier: %s [%s; mcc=%s, mnc=%s]", carrier.name.c_str(), carrier.countryCode.c_str(), carrier.mcc.c_str(), carrier.mnc.c_str()); } - if(length>0){ - if(length<=253){ - s->WriteByte((unsigned char) length); - }else{ - s->WriteByte(254); - s->WriteByte((unsigned char) (length & 0xFF)); - s->WriteByte((unsigned char) ((length >> 8) & 0xFF)); - s->WriteByte((unsigned char) ((length >> 16) & 0xFF)); + } + if(itfName!=activeNetItfName){ + udpSocket->OnActiveInterfaceChanged(); + LOGI("Active network interface changed: %s -> %s", activeNetItfName.c_str(), itfName.c_str()); + bool isFirstChange=activeNetItfName.length()==0 && state!=STATE_ESTABLISHED && state!=STATE_RECONNECTING; + activeNetItfName=itfName; + if(isFirstChange) + return; + wasNetworkHandover=true; + if(currentEndpoint){ + const Endpoint& _currentEndpoint=endpoints.at(currentEndpoint); + const Endpoint& _preferredRelay=endpoints.at(preferredRelay); + if(_currentEndpoint.type!=Endpoint::Type::UDP_RELAY){ + if(_preferredRelay.type==Endpoint::Type::UDP_RELAY) + currentEndpoint=preferredRelay; + MutexGuard m(endpointsMutex); + constexpr int64_t lanID=(int64_t)(FOURCC('L','A','N','4')) << 32; + endpoints.erase(lanID); + for(pair& e:endpoints){ + Endpoint& endpoint=e.second; + if(endpoint.type==Endpoint::Type::UDP_RELAY && useTCP){ + useTCP=false; + if(_preferredRelay.type==Endpoint::Type::TCP_RELAY){ + preferredRelay=currentEndpoint=endpoint.id; + } + }else if(endpoint.type==Endpoint::Type::TCP_RELAY && endpoint.socket){ + endpoint.socket->Close(); + //delete endpoint.socket; + //endpoint.socket=NULL; + } + //if(endpoint->type==Endpoint::Type::UDP_P2P_INET){ + endpoint.averageRTT=0; + endpoint.rtts.Reset(); + //} + } } } - }else{ - s->WriteInt32(TLID_SIMPLE_AUDIO_BLOCK); - int64_t randomID; - crypto.rand_bytes((uint8_t *) &randomID, 8); - s->WriteInt64(randomID); - unsigned char randBytes[7]; - crypto.rand_bytes(randBytes, 7); - s->WriteByte(7); - s->WriteBytes(randBytes, 7); - uint32_t lenWithHeader=length+13; - if(lenWithHeader>0){ - if(lenWithHeader<=253){ - s->WriteByte((unsigned char) lenWithHeader); - }else{ - s->WriteByte(254); - s->WriteByte((unsigned char) (lenWithHeader & 0xFF)); - s->WriteByte((unsigned char) ((lenWithHeader >> 8) & 0xFF)); - s->WriteByte((unsigned char) ((lenWithHeader >> 16) & 0xFF)); - } + lastUdpPingTime=0; + if(proxyProtocol==PROXY_SOCKS5) + InitUDPProxy(); + if(allowP2p && currentEndpoint){ + SendPublicEndpointsRequest(); } - s->WriteByte(type); - s->WriteInt32(lastRemoteSeq); - s->WriteInt32(pseq); - s->WriteInt32(acks); - if(peerVersion>=6){ + BufferOutputStream s(4); + s.WriteInt32(dataSavingMode ? INIT_FLAG_DATA_SAVING_ENABLED : 0); + if(peerVersion<6){ + SendPacketReliably(PKT_NETWORK_CHANGED, s.GetBuffer(), s.GetLength(), 1, 20); + }else{ + Buffer buf(move(s)); + SendExtra(buf, EXTRA_TYPE_NETWORK_CHANGED); + } + needReInitUdpProxy=true; + selectCanceller->CancelSelect(); + didSendIPv6Endpoint=false; + + AddIPv6Relays(); + ResetUdpAvailability(); + ResetEndpointPingStats(); + + } +} + +double VoIPController::GetAverageRTT(){ + if(lastSentSeq>=lastRemoteAckSeq){ + uint32_t diff=lastSentSeq-lastRemoteAckSeq; + //LOGV("rtt diff=%u", diff); + if(diff<32){ + double res=0; + int count=0; + /*for(i=diff;i<32;i++){ + if(remoteAcks[i-diff]>0){ + res+=(remoteAcks[i-diff]-sentPacketTimes[i]); + count++; + } + }*/ MutexGuard m(queuedPacketsMutex); - if(currentExtras.empty()){ - s->WriteByte(0); - }else{ - s->WriteByte(XPFLAG_HAS_EXTRA); - s->WriteByte(static_cast(currentExtras.size())); - for(vector::iterator x=currentExtras.begin();x!=currentExtras.end();++x){ - LOGV("Writing extra into header: type %u, length %lu", x->type, x->data.Length()); - assert(x->data.Length()<=254); - s->WriteByte(static_cast(x->data.Length()+1)); - s->WriteByte(x->type); - s->WriteBytes(*x->data, x->data.Length()); - if(x->firstContainingSeq==0) - x->firstContainingSeq=pseq; + for(std::vector::iterator itr=recentOutgoingPackets.begin();itr!=recentOutgoingPackets.end();++itr){ + if(itr->ackTime>0){ + res+=(itr->ackTime-itr->sendTime); + count++; } } + if(count>0) + res/=count; + return res; } } - - if(type==PKT_STREAM_DATA || type==PKT_STREAM_DATA_X2 || type==PKT_STREAM_DATA_X3) - conctl->PacketSent(pseq, length); - - MutexGuard m(queuedPacketsMutex); - recentOutgoingPackets.push_back(RecentOutgoingPacket{ - pseq, - 0, - GetCurrentTime(), - 0 - }); - while(recentOutgoingPackets.size()>MAX_RECENT_PACKETS) - recentOutgoingPackets.erase(recentOutgoingPackets.begin()); - lastSentSeq=pseq; - //LOGI("packet header size %d", s->GetLength()); + return 999; } - -void VoIPController::UpdateAudioBitrateLimit(){ - if(encoder){ - if(dataSavingMode || dataSavingRequestedByPeer){ - maxBitrate=maxAudioBitrateSaving; - encoder->SetBitrate(initAudioBitrateSaving); - }else if(networkType==NET_TYPE_GPRS){ - maxBitrate=maxAudioBitrateGPRS; - encoder->SetBitrate(initAudioBitrateGPRS); - }else if(networkType==NET_TYPE_EDGE){ - maxBitrate=maxAudioBitrateEDGE; +void VoIPController::SetMicMute(bool mute){ + if(micMuted==mute) + return; + micMuted=mute; + if(audioInput){ + if(mute) + audioInput->Stop(); + else + audioInput->Start(); + if(!audioInput->IsInitialized()){ + lastError=ERROR_AUDIO_IO; + SetState(STATE_FAILED); + return; + } + } + if(echoCanceller) + echoCanceller->Enable(!mute); + if(state==STATE_ESTABLISHED){ + for(shared_ptr& s:outgoingStreams){ + if(s->type==STREAM_TYPE_AUDIO){ + s->enabled=!mute; + if(peerVersion<6){ + unsigned char buf[2]; + buf[0]=s->id; + buf[1]=(char) (mute ? 0 : 1); + SendPacketReliably(PKT_STREAM_STATE, buf, 2, .5f, 20); + }else{ + SendStreamFlags(*s); + } + } + } + } + if(mute){ + if(noStreamsNopID==MessageThread::INVALID_ID) + noStreamsNopID=messageThread.Post(std::bind(&VoIPController::SendNopPacket, this), 0.2, 0.2); + }else{ + if(noStreamsNopID!=MessageThread::INVALID_ID){ + messageThread.Cancel(noStreamsNopID); + noStreamsNopID=MessageThread::INVALID_ID; + } + } +} + +string VoIPController::GetDebugString(){ + string r="Remote endpoints: \n"; + char buffer[2048]; + MutexGuard m(endpointsMutex); + for(pair& _e:endpoints){ + Endpoint& endpoint=_e.second; + const char* type; + switch(endpoint.type){ + case Endpoint::Type::UDP_P2P_INET: + type="UDP_P2P_INET"; + break; + case Endpoint::Type::UDP_P2P_LAN: + type="UDP_P2P_LAN"; + break; + case Endpoint::Type::UDP_RELAY: + type="UDP_RELAY"; + break; + case Endpoint::Type::TCP_RELAY: + type="TCP_RELAY"; + break; + default: + type="UNKNOWN"; + break; + } + snprintf(buffer, sizeof(buffer), "%s:%u %dms %d 0x%" PRIx64 " [%s%s]\n", endpoint.address.IsEmpty() ? ("["+endpoint.v6address.ToString()+"]").c_str() : endpoint.address.ToString().c_str(), endpoint.port, (int)(endpoint.averageRTT*1000), endpoint.udpPongCount, (uint64_t)endpoint.id, type, currentEndpoint==endpoint.id ? ", IN_USE" : ""); + r+=buffer; + } + if(shittyInternetMode){ + snprintf(buffer, sizeof(buffer), "ShittyInternetMode: level %d\n", extraEcLevel); + r+=buffer; + } + double avgLate[3]; + shared_ptr stm=GetStreamByType(STREAM_TYPE_AUDIO, false); + shared_ptr jitterBuffer; + if(stm) + jitterBuffer=stm->jitterBuffer; + if(jitterBuffer) + jitterBuffer->GetAverageLateCount(avgLate); + else + memset(avgLate, 0, 3*sizeof(double)); + snprintf(buffer, sizeof(buffer), + "Jitter buffer: %d/%.2f | %.1f, %.1f, %.1f\n" + "RTT avg/min: %d/%d\n" + "Congestion window: %d/%d bytes\n" + "Key fingerprint: %02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%s\n" + "Last sent/ack'd seq: %u/%u\n" + "Last recvd seq: %u\n" + "Send/recv losses: %u/%u (%d%%)\n" + "Audio bitrate: %d kbit\n" + "Outgoing queue: %u\n" + // "Packet grouping: %d\n" + "Frame size out/in: %d/%d\n" + "Bytes sent/recvd: %llu/%llu", + jitterBuffer ? jitterBuffer->GetMinPacketCount() : 0, jitterBuffer ? jitterBuffer->GetAverageDelay() : 0, avgLate[0], avgLate[1], avgLate[2], + // (int)(GetAverageRTT()*1000), 0, + (int)(conctl->GetAverageRTT()*1000), (int)(conctl->GetMinimumRTT()*1000), + int(conctl->GetInflightDataSize()), int(conctl->GetCongestionWindow()), + keyFingerprint[0],keyFingerprint[1],keyFingerprint[2],keyFingerprint[3],keyFingerprint[4],keyFingerprint[5],keyFingerprint[6],keyFingerprint[7], + useMTProto2 ? " (MTProto2.0)" : "", + lastSentSeq, lastRemoteAckSeq, lastRemoteSeq, + conctl->GetSendLossCount(), recvLossCount, encoder ? encoder->GetPacketLoss() : 0, + encoder ? (encoder->GetBitrate()/1000) : 0, + static_cast(unsentStreamPackets), +// audioPacketGrouping, + outgoingStreams[0]->frameDuration, incomingStreams.size()>0 ? incomingStreams[0]->frameDuration : 0, + (long long unsigned int)(stats.bytesSentMobile+stats.bytesSentWifi), + (long long unsigned int)(stats.bytesRecvdMobile+stats.bytesRecvdWifi)); + r+=buffer; + return r; +} + +const char* VoIPController::GetVersion(){ + return LIBTGVOIP_VERSION; +} + + +int64_t VoIPController::GetPreferredRelayID(){ + return preferredRelay; +} + + +int VoIPController::GetLastError(){ + return lastError; +} + + +void VoIPController::GetStats(TrafficStats *stats){ + memcpy(stats, &this->stats, sizeof(TrafficStats)); +} + +string VoIPController::GetDebugLog(){ + map network{ + {"type", NetworkTypeToString(networkType)} + }; + if(IS_MOBILE_NETWORK(networkType)){ + CellularCarrierInfo carrier=GetCarrierInfo(); + if(!carrier.name.empty()){ + network["carrier"]=carrier.name; + network["country"]=carrier.countryCode; + network["mcc"]=carrier.mcc; + network["mnc"]=carrier.mnc; + } + }else if(networkType==NET_TYPE_WIFI){ +#ifdef __ANDROID__ + jni::DoWithJNI([&](JNIEnv* env){ + jmethodID getWifiInfoMethod=env->GetStaticMethodID(jniUtilitiesClass, "getWifiInfo", "()[I"); + jintArray res=static_cast(env->CallStaticObjectMethod(jniUtilitiesClass, getWifiInfoMethod)); + if(res){ + jint* wifiInfo=env->GetIntArrayElements(res, NULL); + network["rssi"]=wifiInfo[0]; + network["link_speed"]=wifiInfo[1]; + env->ReleaseIntArrayElements(res, wifiInfo, JNI_ABORT); + } + }); +#endif + } + /*vector lpkts; + for(DebugLoggedPacket& lpkt:debugLoggedPackets){ + lpkts.push_back(json11::Json::array{lpkt.timestamp, lpkt.seq, lpkt.length}); + } + return json11::Json(json11::Json::object{ + {"log_type", "out_packet_stats"}, + {"libtgvoip_version", LIBTGVOIP_VERSION}, + {"network", network}, + {"protocol_version", std::min(peerVersion, PROTOCOL_VERSION)}, + {"total_losses", json11::Json::object{ + {"s", (int32_t)conctl->GetSendLossCount()}, + {"r", (int32_t)recvLossCount} + }}, + {"call_duration", GetCurrentTime()-connectionInitTime}, + {"out_packet_stats", lpkts} + }).dump();*/ + + string p2pType="none"; + Endpoint& cur=endpoints[currentEndpoint]; + if(cur.type==Endpoint::Type::UDP_P2P_INET) + p2pType=cur.IsIPv6Only() ? "inet6" : "inet"; + else if(cur.type==Endpoint::Type::UDP_P2P_LAN) + p2pType="lan"; + + vector problems; + if(lastError==ERROR_TIMEOUT) + problems.push_back("timeout"); + if(wasReconnecting) + problems.push_back("reconnecting"); + if(wasExtraEC) + problems.push_back("extra_ec"); + if(wasEncoderLaggy) + problems.push_back("encoder_lag"); + if(!wasEstablished) + problems.push_back("not_inited"); + if(wasNetworkHandover) + problems.push_back("network_handover"); + + ostringstream prefRelay; + prefRelay << preferredRelay; + + return json11::Json(json11::Json::object{ + {"log_type", "call_stats"}, + {"libtgvoip_version", LIBTGVOIP_VERSION}, + {"network", network}, + {"protocol_version", std::min(peerVersion, PROTOCOL_VERSION)}, + {"udp_avail", udpConnectivityState==UDP_AVAILABLE}, + {"tcp_used", useTCP}, + {"relay_rtt", (int)(endpoints[preferredRelay].averageRTT*1000.0)}, + {"p2p_type", p2pType}, + {"rtt", (int)(endpoints[currentEndpoint].averageRTT*1000.0)}, + {"packet_stats", json11::Json::object{ + {"out", (int)seq}, + {"in", (int)packetsReceived}, + {"lost_out", (int)conctl->GetSendLossCount()}, + {"lost_in", (int)recvLossCount} + }}, + {"problems", problems}, + {"pref_relay", prefRelay.str()} + }).dump(); +} + +vector VoIPController::EnumerateAudioInputs(){ + vector devs; + audio::AudioInput::EnumerateDevices(devs); + return devs; +} + +vector VoIPController::EnumerateAudioOutputs(){ + vector devs; + audio::AudioOutput::EnumerateDevices(devs); + return devs; +} + +void VoIPController::SetCurrentAudioInput(string id){ + currentAudioInput=id; + if(audioInput) + audioInput->SetCurrentDevice(id); +} + +void VoIPController::SetCurrentAudioOutput(string id){ + currentAudioOutput=id; + if(audioOutput) + audioOutput->SetCurrentDevice(id); +} + +string VoIPController::GetCurrentAudioInputID(){ + return currentAudioInput; +} + +string VoIPController::GetCurrentAudioOutputID(){ + return currentAudioOutput; +} + +void VoIPController::SetProxy(int protocol, string address, uint16_t port, string username, string password){ + proxyProtocol=protocol; + proxyAddress=address; + proxyPort=port; + proxyUsername=username; + proxyPassword=password; +} + +int VoIPController::GetSignalBarsCount(){ + return signalBarsHistory.NonZeroAverage(); +} + +void VoIPController::SetCallbacks(VoIPController::Callbacks callbacks){ + this->callbacks=callbacks; + if(callbacks.connectionStateChanged) + callbacks.connectionStateChanged(this, state); +} + +void VoIPController::SetAudioOutputGainControlEnabled(bool enabled){ + LOGD("New output AGC state: %d", enabled); +} + +uint32_t VoIPController::GetPeerCapabilities(){ + return peerCapabilities; +} + +void VoIPController::SendGroupCallKey(unsigned char *key){ + if(!(peerCapabilities & TGVOIP_PEER_CAP_GROUP_CALLS)){ + LOGE("Tried to send group call key but peer isn't capable of them"); + return; + } + if(didSendGroupCallKey){ + LOGE("Tried to send a group call key repeatedly"); + return; + } + if(!isOutgoing){ + LOGE("You aren't supposed to send group call key in an incoming call, use VoIPController::RequestCallUpgrade() instead"); + return; + } + didSendGroupCallKey=true; + Buffer buf(256); + buf.CopyFrom(key, 0, 256); + SendExtra(buf, EXTRA_TYPE_GROUP_CALL_KEY); +} + +void VoIPController::RequestCallUpgrade(){ + if(!(peerCapabilities & TGVOIP_PEER_CAP_GROUP_CALLS)){ + LOGE("Tried to send group call key but peer isn't capable of them"); + return; + } + if(didSendUpgradeRequest){ + LOGE("Tried to send upgrade request repeatedly"); + return; + } + if(isOutgoing){ + LOGE("You aren't supposed to send an upgrade request in an outgoing call, generate an encryption key and use VoIPController::SendGroupCallKey instead"); + return; + } + didSendUpgradeRequest=true; + Buffer empty(0); + SendExtra(empty, EXTRA_TYPE_REQUEST_GROUP); +} + +void VoIPController::SetEchoCancellationStrength(int strength){ + echoCancellationStrength=strength; + if(echoCanceller) + echoCanceller->SetAECStrength(strength); +} + +#if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) +void VoIPController::SetAudioDataCallbacks(std::function input, std::function output){ + audioInputDataCallback=input; + audioOutputDataCallback=output; +} +#endif + +int VoIPController::GetConnectionState(){ + return state; +} + +void VoIPController::SetConfig(const Config& cfg){ + config=cfg; + if(tgvoipLogFile){ + fclose(tgvoipLogFile); + tgvoipLogFile=NULL; + } + if(!config.logFilePath.empty()){ +#ifndef _WIN32 + tgvoipLogFile=fopen(config.logFilePath.c_str(), "a"); +#else + if(_wfopen_s(&tgvoipLogFile, config.logFilePath.c_str(), L"a")!=0){ + tgvoipLogFile=NULL; + } +#endif + tgvoip_log_file_write_header(tgvoipLogFile); + }else{ + tgvoipLogFile=NULL; + } + if(statsDump){ + fclose(statsDump); + statsDump=NULL; + } + if(!config.statsDumpFilePath.empty()){ +#ifndef _WIN32 + statsDump=fopen(config.statsDumpFilePath.c_str(), "w"); +#else + if(_wfopen_s(&statsDump, config.statsDumpFilePath.c_str(), L"w")!=0){ + statsDump=NULL; + } +#endif + if(statsDump) + fprintf(statsDump, "Time\tRTT\tLRSeq\tLSSeq\tLASeq\tLostR\tLostS\tCWnd\tBitrate\tLoss%%\tJitter\tJDelay\tAJDelay\n"); + //else + // LOGW("Failed to open stats dump file %s for writing", config.statsDumpFilePath.c_str()); + }else{ + statsDump=NULL; + } + UpdateDataSavingState(); + UpdateAudioBitrateLimit(); +} + +void VoIPController::SetPersistentState(vector state){ + using namespace json11; + + if(state.empty()) + return; + string jsonErr; + string json=string(state.begin(), state.end()); + Json _obj=Json::parse(json, jsonErr); + if(!jsonErr.empty()){ + LOGE("Error parsing persistable state: %s", jsonErr.c_str()); + return; + } + Json::object obj=_obj.object_items(); + if(obj.find("proxy")!=obj.end()){ + Json::object proxy=obj["proxy"].object_items(); + lastTestedProxyServer=proxy["server"].string_value(); + proxySupportsUDP=proxy["udp"].bool_value(); + proxySupportsTCP=proxy["tcp"].bool_value(); + } +} + +vector VoIPController::GetPersistentState(){ + using namespace json11; + + Json::object obj=Json::object{ + {"ver", 1}, + }; + if(proxyProtocol==PROXY_SOCKS5){ + char pbuf[128]; + snprintf(pbuf, sizeof(pbuf), "%s:%u", proxyAddress.c_str(), proxyPort); + obj.insert({"proxy", Json::object{ + {"server", string(pbuf)}, + {"udp", proxySupportsUDP}, + {"tcp", proxySupportsTCP} + }}); + } + string _jstr=Json(obj).dump(); + const char* jstr=_jstr.c_str(); + return vector(jstr, jstr+strlen(jstr)); +} + +void VoIPController::SetOutputVolume(float level){ + outputVolume.SetLevel(level); +} + +void VoIPController::SetInputVolume(float level){ + inputVolume.SetLevel(level); +} + +#if defined(__APPLE__) && TARGET_OS_OSX +void VoIPController::SetAudioOutputDuckingEnabled(bool enabled){ + macAudioDuckingEnabled=enabled; + audio::AudioUnitIO* osxAudio=dynamic_cast(audioIO); + if(osxAudio){ + osxAudio->SetDuckingEnabled(enabled); + } +} +#endif + +#pragma mark - Internal intialization + +void VoIPController::InitializeTimers(){ + initTimeoutID=messageThread.Post([this]{ + LOGW("Init timeout, disconnecting"); + lastError=ERROR_TIMEOUT; + SetState(STATE_FAILED); + }, config.initTimeout); + + if(!config.statsDumpFilePath.empty()){ + messageThread.Post([this]{ + if(statsDump && incomingStreams.size()==1){ + shared_ptr& jitterBuffer=incomingStreams[0]->jitterBuffer; + //fprintf(statsDump, "Time\tRTT\tLISeq\tLASeq\tCWnd\tBitrate\tJitter\tJDelay\tAJDelay\n"); + fprintf(statsDump, "%.3f\t%.3f\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%.3f\t%.3f\t%.3f\n", + GetCurrentTime()-connectionInitTime, + endpoints.at(currentEndpoint).rtts[0], + lastRemoteSeq, + (uint32_t)seq, + lastRemoteAckSeq, + recvLossCount, + conctl ? conctl->GetSendLossCount() : 0, + conctl ? (int)conctl->GetInflightDataSize() : 0, + encoder ? encoder->GetBitrate() : 0, + encoder ? encoder->GetPacketLoss() : 0, + jitterBuffer ? jitterBuffer->GetLastMeasuredJitter() : 0, + jitterBuffer ? jitterBuffer->GetLastMeasuredDelay()*0.06 : 0, + jitterBuffer ? jitterBuffer->GetAverageDelay()*0.06 : 0); + } + }, 0.1, 0.1); + } + + messageThread.Post(std::bind(&VoIPController::SendRelayPings, this), 0.0, 2.0); +} + +void VoIPController::RunSendThread(){ + InitializeAudio(); + InitializeTimers(); + SendInit(); + LOGI("=== send thread exiting ==="); +} + +#pragma mark - Miscellaneous + +void VoIPController::SetState(int state){ + this->state=state; + LOGV("Call state changed to %d", state); + stateChangeTime=GetCurrentTime(); + messageThread.Post([this, state]{ + if(callbacks.connectionStateChanged) + callbacks.connectionStateChanged(this, state); + }); + if(state==STATE_ESTABLISHED){ + SetMicMute(micMuted); + if(!wasEstablished){ + wasEstablished=true; + messageThread.Post(std::bind(&VoIPController::UpdateRTT, this), 0.1, 0.5); + messageThread.Post(std::bind(&VoIPController::UpdateAudioBitrate, this), 0.0, 0.3); + messageThread.Post(std::bind(&VoIPController::UpdateCongestion, this), 0.0, 1.0); + messageThread.Post(std::bind(&VoIPController::UpdateSignalBars, this), 1.0, 1.0); + messageThread.Post(std::bind(&VoIPController::TickJitterBufferAngCongestionControl, this), 0.0, 0.1); + } + } +} + +void VoIPController::SendStreamFlags(Stream& stream){ + BufferOutputStream s(5); + s.WriteByte(stream.id); + uint32_t flags=0; + if(stream.enabled) + flags|=STREAM_FLAG_ENABLED; + if(stream.extraECEnabled) + flags|=STREAM_FLAG_EXTRA_EC; + s.WriteInt32(flags); + LOGV("My stream state: id %u flags %u", (unsigned int)stream.id, (unsigned int)flags); + Buffer buf(move(s)); + SendExtra(buf, EXTRA_TYPE_STREAM_FLAGS); +} + +shared_ptr VoIPController::GetStreamByType(int type, bool outgoing){ + shared_ptr s; + for(shared_ptr& ss:(outgoing ? outgoingStreams : incomingStreams)){ + if(ss->type==type) + return ss; + } + return s; +} + +CellularCarrierInfo VoIPController::GetCarrierInfo(){ +#if defined(__APPLE__) && TARGET_OS_IOS + return DarwinSpecific::GetCarrierInfo(); +#elif defined(__ANDROID__) + CellularCarrierInfo carrier; + jni::DoWithJNI([&carrier](JNIEnv* env){ + jmethodID getCarrierInfoMethod=env->GetStaticMethodID(jniUtilitiesClass, "getCarrierInfo", "()[Ljava/lang/String;"); + jobjectArray jinfo=(jobjectArray) env->CallStaticObjectMethod(jniUtilitiesClass, getCarrierInfoMethod); + if(jinfo && env->GetArrayLength(jinfo)==4){ + carrier.name=jni::JavaStringToStdString(env, (jstring)env->GetObjectArrayElement(jinfo, 0)); + carrier.countryCode=jni::JavaStringToStdString(env, (jstring)env->GetObjectArrayElement(jinfo, 1)); + carrier.mcc=jni::JavaStringToStdString(env, (jstring)env->GetObjectArrayElement(jinfo, 2)); + carrier.mnc=jni::JavaStringToStdString(env, (jstring)env->GetObjectArrayElement(jinfo, 3)); + }else{ + LOGW("Failed to get carrier info"); + } + }); + return carrier; +#else + return CellularCarrierInfo(); +#endif +} + +#pragma mark - Audio I/O + +void VoIPController::AudioInputCallback(unsigned char* data, size_t length, unsigned char* secondaryData, size_t secondaryLength, void* param){ + ((VoIPController*)param)->HandleAudioInput(data, length, secondaryData, secondaryLength); +} + +void VoIPController::HandleAudioInput(unsigned char *data, size_t len, unsigned char* secondaryData, size_t secondaryLen){ + if(stopping) + return; + unsentStreamPacketsHistory.Add(static_cast(unsentStreamPackets)); + if(unsentStreamPacketsHistory.Average()>=maxUnsentStreamPackets && !videoSource){ + LOGW("Resetting stalled send queue"); + sendQueue.clear(); + unsentStreamPacketsHistory.Reset(); + unsentStreamPackets=0; + } + if(waitingForAcks || dontSendPackets>0 || ((unsigned int)unsentStreamPackets>=maxUnsentStreamPackets /*&& endpoints[currentEndpoint].type==Endpoint::Type::TCP_RELAY*/)){ + LOGV("waiting for queue, dropping outgoing audio packet, %d %d %d [%d]", (unsigned int)unsentStreamPackets, waitingForAcks, dontSendPackets, maxUnsentStreamPackets); + return; + } + //LOGV("Audio packet size %u", (unsigned int)len); + if(!receivedInitAck) + return; + + BufferOutputStream pkt(1500); + + bool hasExtraFEC=peerVersion>=7 && secondaryData && secondaryLen && shittyInternetMode; + unsigned char flags=(unsigned char) (len>255 || hasExtraFEC ? STREAM_DATA_FLAG_LEN16 : 0); + pkt.WriteByte((unsigned char) (1 | flags)); // streamID + flags + if(len>255 || hasExtraFEC){ + int16_t lenAndFlags=static_cast(len); + if(hasExtraFEC) + lenAndFlags|=STREAM_DATA_XFLAG_EXTRA_FEC; + pkt.WriteInt16(lenAndFlags); + }else{ + pkt.WriteByte((unsigned char) len); + } + pkt.WriteInt32(audioTimestampOut); + pkt.WriteBytes(data, len); + + if(hasExtraFEC){ + Buffer ecBuf(secondaryLen); + ecBuf.CopyFrom(secondaryData, 0, secondaryLen); + ecAudioPackets.push_back(move(ecBuf)); + while(ecAudioPackets.size()>4) + ecAudioPackets.erase(ecAudioPackets.begin()); + pkt.WriteByte((unsigned char)MIN(ecAudioPackets.size(), extraEcLevel)); + for(vector::iterator ecData=ecAudioPackets.begin()+MAX(0, (int)ecAudioPackets.size()-extraEcLevel);ecData!=ecAudioPackets.end();++ecData){ + pkt.WriteByte((unsigned char)ecData->Length()); + pkt.WriteBytes(*ecData); + } + } + + unsentStreamPackets++; + PendingOutgoingPacket p{ + /*.seq=*/GenerateOutSeq(), + /*.type=*/PKT_STREAM_DATA, + /*.len=*/pkt.GetLength(), + /*.data=*/Buffer(move(pkt)), + /*.endpoint=*/0, + }; + + conctl->PacketSent(p.seq, p.len); + + SendOrEnqueuePacket(move(p)); + if(peerVersion<7 && secondaryData && secondaryLen && shittyInternetMode){ + Buffer ecBuf(secondaryLen); + ecBuf.CopyFrom(secondaryData, 0, secondaryLen); + ecAudioPackets.push_back(move(ecBuf)); + while(ecAudioPackets.size()>4) + ecAudioPackets.erase(ecAudioPackets.begin()); + pkt=BufferOutputStream(1500); + pkt.WriteByte(outgoingStreams[0]->id); + pkt.WriteInt32(audioTimestampOut); + pkt.WriteByte((unsigned char)MIN(ecAudioPackets.size(), extraEcLevel)); + for(vector::iterator ecData=ecAudioPackets.begin()+MAX(0, (int)ecAudioPackets.size()-extraEcLevel);ecData!=ecAudioPackets.end();++ecData){ + pkt.WriteByte((unsigned char)ecData->Length()); + pkt.WriteBytes(*ecData); + } + + PendingOutgoingPacket p{ + GenerateOutSeq(), + PKT_STREAM_EC, + pkt.GetLength(), + Buffer(move(pkt)), + 0 + }; + SendOrEnqueuePacket(move(p)); + } + + audioTimestampOut+=outgoingStreams[0]->frameDuration; +} + +void VoIPController::InitializeAudio(){ + double t=GetCurrentTime(); + shared_ptr outgoingAudioStream=GetStreamByType(STREAM_TYPE_AUDIO, true); + LOGI("before create audio io"); +#if defined(TGVOIP_USE_SOFTWARE_AUDIO) + audioInput = softwareMediaInput; + audioOutput = softwareMediaOutput; +#else + audioIO=audio::AudioIO::Create(currentAudioInput, currentAudioOutput); + audioInput=audioIO->GetInput(); + audioOutput=audioIO->GetOutput(); +#endif +#ifdef __ANDROID__ + audio::AudioInputAndroid* androidInput=dynamic_cast(audioInput); + if(androidInput){ + unsigned int effects=androidInput->GetEnabledEffects(); + if(!(effects & audio::AudioInputAndroid::EFFECT_AEC)){ + config.enableAEC=true; + LOGI("Forcing software AEC because built-in is not good"); + } + if(!(effects & audio::AudioInputAndroid::EFFECT_NS)){ + config.enableNS=true; + LOGI("Forcing software NS because built-in is not good"); + } + } +#elif defined(__APPLE__) && TARGET_OS_OSX + SetAudioOutputDuckingEnabled(macAudioDuckingEnabled); +#endif + LOGI("AEC: %d NS: %d AGC: %d", config.enableAEC, config.enableNS, config.enableAGC); + echoCanceller=new EchoCanceller(config.enableAEC, config.enableNS, config.enableAGC); + encoder=new OpusEncoder(audioInput, true); + encoder->SetCallback(AudioInputCallback, this); + encoder->SetOutputFrameDuration(outgoingAudioStream->frameDuration); + encoder->SetEchoCanceller(echoCanceller); + encoder->SetSecondaryEncoderEnabled(false); + if(config.enableVolumeControl){ + encoder->AddAudioEffect(&inputVolume); + } + +#if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) + dynamic_cast(audioInput)->SetDataCallback(audioInputDataCallback); + dynamic_cast(audioOutput)->SetDataCallback(audioOutputDataCallback); +#endif + + if(!audioOutput->IsInitialized()){ + LOGE("Error initializing audio playback"); + lastError=ERROR_AUDIO_IO; + + SetState(STATE_FAILED); + return; + } + UpdateAudioBitrateLimit(); + LOGI("Audio initialization took %f seconds", GetCurrentTime()-t); +} + +void VoIPController::StartAudio(){ + OnAudioOutputReady(); + + encoder->Start(); + if(!micMuted){ + audioInput->Start(); + if(!audioInput->IsInitialized()){ + LOGE("Erorr initializing audio capture"); + lastError=ERROR_AUDIO_IO; + + SetState(STATE_FAILED); + return; + } + } +} + +void VoIPController::OnAudioOutputReady(){ + LOGI("Audio I/O ready"); + shared_ptr& stm=incomingStreams[0]; + stm->decoder=make_shared(audioOutput, true, peerVersion>=6); + stm->decoder->SetEchoCanceller(echoCanceller); + if(config.enableVolumeControl){ + stm->decoder->AddAudioEffect(&outputVolume); + } + stm->decoder->SetJitterBuffer(stm->jitterBuffer); + stm->decoder->SetFrameDuration(stm->frameDuration); + stm->decoder->Start(); +} + +void VoIPController::UpdateAudioOutputState(){ + bool areAnyAudioStreamsEnabled=false; + for(vector>::iterator s=incomingStreams.begin();s!=incomingStreams.end();++s){ + if((*s)->type==STREAM_TYPE_AUDIO && (*s)->enabled) + areAnyAudioStreamsEnabled=true; + } + if(audioOutput){ + LOGV("New audio output state: %d", areAnyAudioStreamsEnabled); + if(audioOutput->IsPlaying()!=areAnyAudioStreamsEnabled){ + if(areAnyAudioStreamsEnabled) + audioOutput->Start(); + else + audioOutput->Stop(); + } + } +} + +#pragma mark - Bandwidth management + +void VoIPController::UpdateAudioBitrateLimit(){ + if(encoder){ + if(dataSavingMode || dataSavingRequestedByPeer){ + maxBitrate=maxAudioBitrateSaving; + encoder->SetBitrate(initAudioBitrateSaving); + }else if(networkType==NET_TYPE_GPRS){ + maxBitrate=maxAudioBitrateGPRS; + encoder->SetBitrate(initAudioBitrateGPRS); + }else if(networkType==NET_TYPE_EDGE){ + maxBitrate=maxAudioBitrateEDGE; encoder->SetBitrate(initAudioBitrateEDGE); }else{ - maxBitrate=maxAudioBitrate; - encoder->SetBitrate(initAudioBitrate); + maxBitrate=maxAudioBitrate; + encoder->SetBitrate(initAudioBitrate); + } + encoder->SetVadMode(dataSavingMode || dataSavingRequestedByPeer); + if(echoCanceller) + echoCanceller->SetVoiceDetectionEnabled(dataSavingMode || dataSavingRequestedByPeer); + } +} + +void VoIPController::UpdateDataSavingState(){ + if(config.dataSaving==DATA_SAVING_ALWAYS){ + dataSavingMode=true; + }else if(config.dataSaving==DATA_SAVING_MOBILE){ + dataSavingMode=networkType==NET_TYPE_GPRS || networkType==NET_TYPE_EDGE || + networkType==NET_TYPE_3G || networkType==NET_TYPE_HSPA || networkType==NET_TYPE_LTE || networkType==NET_TYPE_OTHER_MOBILE; + }else{ + dataSavingMode=false; + } + LOGI("update data saving mode, config %d, enabled %d, reqd by peer %d", config.dataSaving, dataSavingMode, dataSavingRequestedByPeer); +} + +#pragma mark - Networking & crypto + +uint32_t VoIPController::GenerateOutSeq(){ + return seq++; +} + +void VoIPController::WritePacketHeader(uint32_t pseq, BufferOutputStream *s, unsigned char type, uint32_t length){ + uint32_t acks=0; + int i; + for(i=0;i<32;i++){ + if(recvPacketTimes[i]>0) + acks|=1; + if(i<31) + acks<<=1; + } + + if(peerVersion>=8 || (!peerVersion && connectionMaxLayer>=92)){ + s->WriteByte(type); + s->WriteInt32(lastRemoteSeq); + s->WriteInt32(pseq); + s->WriteInt32(acks); + MutexGuard m(queuedPacketsMutex); + if(currentExtras.empty()){ + s->WriteByte(0); + }else{ + s->WriteByte(XPFLAG_HAS_EXTRA); + s->WriteByte(static_cast(currentExtras.size())); + for(vector::iterator x=currentExtras.begin(); x!=currentExtras.end(); ++x){ + LOGV("Writing extra into header: type %u, length %lu", x->type, x->data.Length()); + assert(x->data.Length()<=254); + s->WriteByte(static_cast(x->data.Length()+1)); + s->WriteByte(x->type); + s->WriteBytes(*x->data, x->data.Length()); + if(x->firstContainingSeq==0) + x->firstContainingSeq=pseq; + } + } + }else{ + if(state==STATE_WAIT_INIT || state==STATE_WAIT_INIT_ACK){ + s->WriteInt32(TLID_DECRYPTED_AUDIO_BLOCK); + int64_t randomID; + crypto.rand_bytes((uint8_t *) &randomID, 8); + s->WriteInt64(randomID); + unsigned char randBytes[7]; + crypto.rand_bytes(randBytes, 7); + s->WriteByte(7); + s->WriteBytes(randBytes, 7); + uint32_t pflags=PFLAG_HAS_RECENT_RECV | PFLAG_HAS_SEQ; + if(length>0) + pflags|=PFLAG_HAS_DATA; + if(state==STATE_WAIT_INIT || state==STATE_WAIT_INIT_ACK){ + pflags|=PFLAG_HAS_CALL_ID | PFLAG_HAS_PROTO; + } + pflags|=((uint32_t) type) << 24; + s->WriteInt32(pflags); + + if(pflags & PFLAG_HAS_CALL_ID){ + s->WriteBytes(callID, 16); + } + s->WriteInt32(lastRemoteSeq); + s->WriteInt32(pseq); + s->WriteInt32(acks); + if(pflags & PFLAG_HAS_PROTO){ + s->WriteInt32(PROTOCOL_NAME); + } + if(length>0){ + if(length<=253){ + s->WriteByte((unsigned char) length); + }else{ + s->WriteByte(254); + s->WriteByte((unsigned char) (length & 0xFF)); + s->WriteByte((unsigned char) ((length >> 8) & 0xFF)); + s->WriteByte((unsigned char) ((length >> 16) & 0xFF)); + } + } + }else{ + s->WriteInt32(TLID_SIMPLE_AUDIO_BLOCK); + int64_t randomID; + crypto.rand_bytes((uint8_t *) &randomID, 8); + s->WriteInt64(randomID); + unsigned char randBytes[7]; + crypto.rand_bytes(randBytes, 7); + s->WriteByte(7); + s->WriteBytes(randBytes, 7); + uint32_t lenWithHeader=length+13; + if(lenWithHeader>0){ + if(lenWithHeader<=253){ + s->WriteByte((unsigned char) lenWithHeader); + }else{ + s->WriteByte(254); + s->WriteByte((unsigned char) (lenWithHeader & 0xFF)); + s->WriteByte((unsigned char) ((lenWithHeader >> 8) & 0xFF)); + s->WriteByte((unsigned char) ((lenWithHeader >> 16) & 0xFF)); + } + } + s->WriteByte(type); + s->WriteInt32(lastRemoteSeq); + s->WriteInt32(pseq); + s->WriteInt32(acks); + if(peerVersion>=6){ + MutexGuard m(queuedPacketsMutex); + if(currentExtras.empty()){ + s->WriteByte(0); + }else{ + s->WriteByte(XPFLAG_HAS_EXTRA); + s->WriteByte(static_cast(currentExtras.size())); + for(vector::iterator x=currentExtras.begin(); x!=currentExtras.end(); ++x){ + LOGV("Writing extra into header: type %u, length %lu", x->type, x->data.Length()); + assert(x->data.Length()<=254); + s->WriteByte(static_cast(x->data.Length()+1)); + s->WriteByte(x->type); + s->WriteBytes(*x->data, x->data.Length()); + if(x->firstContainingSeq==0) + x->firstContainingSeq=pseq; + } + } + } } } + + + MutexGuard m(queuedPacketsMutex); + recentOutgoingPackets.push_back(RecentOutgoingPacket{ + pseq, + 0, + GetCurrentTime(), + 0 + }); + while(recentOutgoingPackets.size()>MAX_RECENT_PACKETS) + recentOutgoingPackets.erase(recentOutgoingPackets.begin()); + lastSentSeq=pseq; + //LOGI("packet header size %d", s->GetLength()); } + void VoIPController::SendInit(){ { MutexGuard m(endpointsMutex); uint32_t initSeq=GenerateOutSeq(); - for(shared_ptr& e:endpoints){ - if(e->type==Endpoint::TYPE_TCP_RELAY && !useTCP) + for(pair& _e:endpoints){ + Endpoint& e=_e.second; + if(e.type==Endpoint::Type::TCP_RELAY && !useTCP) continue; BufferOutputStream out(1024); out.WriteInt32(PROTOCOL_VERSION); @@ -741,6 +1486,10 @@ void VoIPController::SendInit(){ uint32_t flags=0; if(config.enableCallUpgrade) flags|=INIT_FLAG_GROUP_CALLS_SUPPORTED; + if(config.enableVideoReceive) + flags|=INIT_FLAG_VIDEO_RECV_SUPPORTED; + if(config.enableVideoSend) + flags|=INIT_FLAG_VIDEO_SEND_SUPPORTED; if(dataSavingMode) flags|=INIT_FLAG_DATA_SAVING_ENABLED; out.WriteInt32(flags); @@ -756,19 +1505,27 @@ void VoIPController::SendInit(){ }else{ out.WriteByte(1); out.WriteInt32(CODEC_OPUS); - /*out.WriteByte(1); - out.WriteInt32(CODEC_AVC); - out.WriteByte(1); - out.WriteInt32(CODEC_AVC);*/ - out.WriteByte(0); - out.WriteByte(0); - } - sendQueue->Put(PendingOutgoingPacket{ + vector decoders=config.enableVideoReceive ? video::VideoRenderer::GetAvailableDecoders() : vector(); + vector encoders=config.enableVideoSend ? video::VideoSource::GetAvailableEncoders() : vector(); + out.WriteByte((unsigned char)decoders.size()); + for(uint32_t id:decoders){ + out.WriteInt32(id); + } + if(connectionMaxLayer>=92) + out.WriteByte((unsigned char)video::VideoRenderer::GetMaximumResolution()); + else + out.WriteByte(0); + /*out.WriteByte((unsigned char)encoders.size()); + for(uint32_t id:encoders){ + out.WriteInt32(id); + }*/ + } + SendOrEnqueuePacket(PendingOutgoingPacket{ /*.seq=*/initSeq, /*.type=*/PKT_INIT, /*.len=*/out.GetLength(), /*.data=*/Buffer(move(out)), - /*.endpoint=*/e->id + /*.endpoint=*/e.id }); } } @@ -787,49 +1544,105 @@ void VoIPController::InitUDPProxy(){ delete udpSocket; udpSocket=realUdpSocket; } + char sbuf[128]; + snprintf(sbuf, sizeof(sbuf), "%s:%u", proxyAddress.c_str(), proxyPort); + string proxyHostPort(sbuf); + if(proxyHostPort==lastTestedProxyServer && !proxySupportsUDP){ + LOGI("Proxy does not support UDP - using UDP directly instead"); + ResetUdpAvailability(); + return; + } + NetworkSocket* tcp=NetworkSocket::Create(PROTO_TCP); tcp->Connect(resolvedProxyAddress, proxyPort); - if(tcp->IsFailed()){ - lastError=ERROR_PROXY; - SetState(STATE_FAILED); - tcp->Close(); - delete tcp; - return; + + vector writeSockets; + vector readSockets; + vector errorSockets; + + while(!tcp->IsFailed() && !tcp->IsReadyToSend()){ + writeSockets.push_back(tcp); + if(!NetworkSocket::Select(readSockets, writeSockets, errorSockets, selectCanceller)){ + LOGW("Select canceled while waiting for proxy control socket to connect"); + delete tcp; + return; + } + } + LOGV("UDP proxy control socket ready to send"); + NetworkSocketSOCKS5Proxy* udpProxy=new NetworkSocketSOCKS5Proxy(tcp, realUdpSocket, proxyUsername, proxyPassword); + udpProxy->OnReadyToSend(); + writeSockets.clear(); + while(!udpProxy->IsFailed() && !tcp->IsFailed() && !udpProxy->IsReadyToSend()){ + readSockets.clear(); + errorSockets.clear(); + readSockets.push_back(tcp); + errorSockets.push_back(tcp); + if(!NetworkSocket::Select(readSockets, writeSockets, errorSockets, selectCanceller)){ + LOGW("Select canceled while waiting for UDP proxy to initialize"); + delete udpProxy; + return; + } + if(!readSockets.empty()) + udpProxy->OnReadyToReceive(); } - NetworkSocketSOCKS5Proxy* udpProxy=new NetworkSocketSOCKS5Proxy(tcp, udpSocket, proxyUsername, proxyPassword); - udpProxy->InitConnection(); - udpProxy->Open(); + LOGV("UDP proxy initialized"); + if(udpProxy->IsFailed()){ udpProxy->Close(); delete udpProxy; - useTCP=true; - useUDP=false; - udpConnectivityState=UDP_NOT_AVAILABLE; + proxySupportsUDP=false; }else{ udpSocket=udpProxy; } + ResetUdpAvailability(); } -void VoIPController::RunRecvThread(void* arg){ +void VoIPController::RunRecvThread(){ LOGI("Receive thread starting"); - unsigned char *buffer = (unsigned char *)malloc(1500); + Buffer buffer(1500); NetworkPacket packet={0}; + if(proxyProtocol==PROXY_SOCKS5){ + resolvedProxyAddress=NetworkSocket::ResolveDomainName(proxyAddress); + if(!resolvedProxyAddress){ + LOGW("Error resolving proxy address %s", proxyAddress.c_str()); + SetState(STATE_FAILED); + return; + } + }else{ + udpConnectivityState=UDP_PING_PENDING; + udpPingTimeoutID=messageThread.Post(std::bind(&VoIPController::SendUdpPings, this), 0.0, 0.5); + } while(runReceiver){ - packet.data=buffer; - packet.length=1500; + + if(proxyProtocol==PROXY_SOCKS5 && needReInitUdpProxy){ + InitUDPProxy(); + needReInitUdpProxy=false; + } + + packet.data=*buffer; + packet.length=buffer.Length(); vector readSockets; vector errorSockets; + vector writeSockets; readSockets.push_back(udpSocket); errorSockets.push_back(realUdpSocket); + if(!realUdpSocket->IsReadyToSend()) + writeSockets.push_back(realUdpSocket); { MutexGuard m(endpointsMutex); - for(shared_ptr& e:endpoints){ - if(e->type==Endpoint::TYPE_TCP_RELAY){ - if(e->socket){ - readSockets.push_back(e->socket); - errorSockets.push_back(e->socket); + for(pair& _e:endpoints){ + const Endpoint& e=_e.second; + if(e.type==Endpoint::Type::TCP_RELAY){ + if(e.socket){ + readSockets.push_back(e.socket); + errorSockets.push_back(e.socket); + if(!e.socket->IsReadyToSend()){ + NetworkSocketSOCKS5Proxy* proxy=dynamic_cast(e.socket); + if(!proxy || proxy->NeedSelectForSending()) + writeSockets.push_back(e.socket); + } } } } @@ -837,7 +1650,7 @@ void VoIPController::RunRecvThread(void* arg){ { MutexGuard m(socketSelectMutex); - bool selRes=NetworkSocket::Select(readSockets, errorSockets, selectCanceller); + bool selRes=NetworkSocket::Select(readSockets, writeSockets, errorSockets, selectCanceller); if(!selRes){ LOGV("Select canceled"); continue; @@ -853,31 +1666,23 @@ void VoIPController::RunRecvThread(void* arg){ return; } MutexGuard m(endpointsMutex); - for(vector::iterator itr=errorSockets.begin();itr!=errorSockets.end();++itr){ - for(shared_ptr& e:endpoints){ - if(e->socket && e->socket==*itr){ - e->socket->Close(); - delete e->socket; - e->socket=NULL; - LOGI("Closing failed TCP socket for %s:%u", e->GetAddress().ToString().c_str(), e->port); + for(NetworkSocket*& socket:errorSockets){ + for(pair& _e:endpoints){ + Endpoint& e=_e.second; + if(e.socket && e.socket==socket){ + e.socket->Close(); + delete e.socket; + e.socket=NULL; + LOGI("Closing failed TCP socket for %s:%u", e.GetAddress().ToString().c_str(), e.port); } } } continue; } - //NetworkSocket* socket=NULL; - - /*if(find(readSockets.begin(), readSockets.end(), realUdpSocket)!=readSockets.end()){ - socket=udpSocket; - }else if(readSockets.size()>0){ - socket=readSockets[0]; - }else{ - LOGI("no sockets to read from"); - continue; - }*/ - for(NetworkSocket*& socket:readSockets){ + //while(packet.length){ + packet.length=1500; socket->Receive(&packet); if(!packet.address){ LOGE("Packet has null address. This shouldn't happen."); @@ -889,27 +1694,38 @@ void VoIPController::RunRecvThread(void* arg){ continue; } //LOGV("Received %d bytes from %s:%d at %.5lf", len, packet.address->ToString().c_str(), packet.port, GetCurrentTime()); - shared_ptr srcEndpoint; + int64_t srcEndpointID=0; IPv4Address *src4=dynamic_cast(packet.address); if(src4){ MutexGuard m(endpointsMutex); - for(shared_ptr &e:endpoints){ - if(e->address==*src4 && e->port==packet.port){ - if((e->type!=Endpoint::TYPE_TCP_RELAY && packet.protocol==PROTO_UDP) || (e->type==Endpoint::TYPE_TCP_RELAY && packet.protocol==PROTO_TCP)){ - srcEndpoint=e; + for(pair& _e:endpoints){ + const Endpoint& e=_e.second; + if(e.address==*src4 && e.port==packet.port){ + if((e.type!=Endpoint::Type::TCP_RELAY && packet.protocol==PROTO_UDP) || (e.type==Endpoint::Type::TCP_RELAY && packet.protocol==PROTO_TCP)){ + srcEndpointID=e.id; break; } } } + if(!srcEndpointID && packet.protocol==PROTO_UDP){ + try{ + Endpoint &p2p=GetEndpointByType(Endpoint::Type::UDP_P2P_INET); + if(p2p.rtts[0]==0.0 && p2p.address.PrefixMatches(24, *packet.address)){ + LOGD("Packet source matches p2p endpoint partially: %s:%u", packet.address->ToString().c_str(), packet.port); + srcEndpointID=p2p.id; + } + }catch(out_of_range& ex){} + } }else{ IPv6Address *src6=dynamic_cast(packet.address); if(src6){ MutexGuard m(endpointsMutex); - for(shared_ptr &e:endpoints){ - if(e->v6address==*src6 && e->port==packet.port && e->address.IsEmpty()){ - if((e->type!=Endpoint::TYPE_TCP_RELAY && packet.protocol==PROTO_UDP) || (e->type==Endpoint::TYPE_TCP_RELAY && packet.protocol==PROTO_TCP)){ - srcEndpoint=e; + for(pair &_e:endpoints){ + const Endpoint& e=_e.second; + if(e.v6address==*src6 && e.port==packet.port && e.IsIPv6Only()){ + if((e.type!=Endpoint::Type::TCP_RELAY && packet.protocol==PROTO_UDP) || (e.type==Endpoint::Type::TCP_RELAY && packet.protocol==PROTO_TCP)){ + srcEndpointID=e.id; break; } } @@ -917,7 +1733,7 @@ void VoIPController::RunRecvThread(void* arg){ } } - if(!srcEndpoint){ + if(!srcEndpointID){ LOGW("Received a packet from unknown source %s:%u", packet.address->ToString().c_str(), packet.port); continue; } @@ -930,70 +1746,76 @@ void VoIPController::RunRecvThread(void* arg){ else stats.bytesRecvdWifi+=(uint64_t) len; try{ - ProcessIncomingPacket(packet, srcEndpoint); + ProcessIncomingPacket(packet, endpoints.at(srcEndpointID)); }catch(out_of_range& x){ LOGW("Error parsing packet: %s", x.what()); } + //} + } + + for(vector::iterator opkt=sendQueue.begin();opkt!=sendQueue.end();){ + Endpoint* endpoint=GetEndpointForPacket(*opkt); + if(!endpoint){ + opkt=sendQueue.erase(opkt); + LOGE("SendQueue contained packet for nonexistent endpoint"); + continue; + } + bool canSend; + if(endpoint->type!=Endpoint::Type::TCP_RELAY) + canSend=realUdpSocket->IsReadyToSend(); + else + canSend=endpoint->socket && endpoint->socket->IsReadyToSend(); + if(canSend){ + LOGI("Sending queued packet"); + SendOrEnqueuePacket(move(*opkt), false); + opkt=sendQueue.erase(opkt); + }else{ + ++opkt; + } } } - free(buffer); LOGI("=== recv thread exiting ==="); } -void VoIPController::RunSendThread(void* arg){ - unsigned char buf[1500]; - while(runReceiver){ - PendingOutgoingPacket pkt=sendQueue->GetBlocking(); - //if(pkt.data.Length()){ - shared_ptr endpoint; - if(pkt.endpoint){ - endpoint=GetEndpointByID(pkt.endpoint); - } - if(!endpoint){ // either packet has no endpoint specified or it no longer exists - endpoint=currentEndpoint; - } - if((endpoint->type==Endpoint::TYPE_TCP_RELAY && useTCP) || (endpoint->type!=Endpoint::TYPE_TCP_RELAY && useUDP)){ - BufferOutputStream p(buf, sizeof(buf)); - WritePacketHeader(pkt.seq, &p, pkt.type, (uint32_t)pkt.len); - p.WriteBytes(pkt.data); - if(pkt.type==PKT_STREAM_DATA){ - unsentStreamPackets--; - } - SendPacket(p.GetBuffer(), p.GetLength(), endpoint, pkt); - } - //}else{ - // LOGE("tried to send null packet"); - //} +bool VoIPController::WasOutgoingPacketAcknowledged(uint32_t seq){ + for(RecentOutgoingPacket& opkt:recentOutgoingPackets){ + if(opkt.seq==seq && opkt.ackTime!=0.0){ + return true; + } } - LOGI("=== send thread exiting ==="); + return false; } -void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, shared_ptr srcEndpoint){ - unsigned char* buffer=packet.data; +void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint& srcEndpoint){ + unsigned char *buffer=packet.data; size_t len=packet.length; - BufferInputStream in(buffer, (size_t)len); - if(memcmp(buffer, srcEndpoint->type==Endpoint::TYPE_UDP_RELAY || srcEndpoint->type==Endpoint::TYPE_TCP_RELAY ? (void*)srcEndpoint->peerTag : (void*)callID, 16)!=0){ - LOGW("Received packet has wrong peerTag"); - return; + BufferInputStream in(buffer, (size_t) len); + bool hasPeerTag=false; + if(peerVersion<9 || srcEndpoint.type==Endpoint::Type::UDP_RELAY || srcEndpoint.type==Endpoint::Type::TCP_RELAY){ + if(memcmp(buffer, srcEndpoint.type==Endpoint::Type::UDP_RELAY || srcEndpoint.type==Endpoint::Type::TCP_RELAY ? (void *) srcEndpoint.peerTag : (void *) callID, 16)!=0){ + LOGW("Received packet has wrong peerTag"); + return; + } + in.Seek(16); + hasPeerTag=true; } - in.Seek(16); - if(in.Remaining()>=16 && (srcEndpoint->type==Endpoint::TYPE_UDP_RELAY || srcEndpoint->type==Endpoint::TYPE_TCP_RELAY) - && *reinterpret_cast(buffer+16)==0xFFFFFFFFFFFFFFFFLL && *reinterpret_cast(buffer+24)==0xFFFFFFFF){ + if(in.Remaining()>=16 && (srcEndpoint.type==Endpoint::Type::UDP_RELAY || srcEndpoint.type==Endpoint::Type::TCP_RELAY) + && *reinterpret_cast(buffer+16)==0xFFFFFFFFFFFFFFFFLL && *reinterpret_cast(buffer+24)==0xFFFFFFFF){ // relay special request response in.Seek(16+12); uint32_t tlid=(uint32_t) in.ReadInt32(); if(tlid==TLID_UDP_REFLECTOR_SELF_INFO){ - if(srcEndpoint->type==Endpoint::TYPE_UDP_RELAY /*&& udpConnectivityState==UDP_PING_SENT*/ && in.Remaining()>=32){ + if(srcEndpoint.type==Endpoint::Type::UDP_RELAY /*&& udpConnectivityState==UDP_PING_SENT*/ && in.Remaining()>=32){ int32_t date=in.ReadInt32(); int64_t queryID=in.ReadInt64(); unsigned char myIP[16]; in.ReadBytes(myIP, 16); int32_t myPort=in.ReadInt32(); //udpConnectivityState=UDP_AVAILABLE; - LOGV("Received UDP ping reply from %s:%d: date=%d, queryID=%ld, my IP=%s, my port=%d", srcEndpoint->address.ToString().c_str(), srcEndpoint->port, date, (long int)queryID, IPv4Address(*reinterpret_cast(myIP+12)).ToString().c_str(), myPort); - srcEndpoint->udpPongCount++; - if(srcEndpoint->IsIPv6Only() && !didSendIPv6Endpoint){ + LOGV("Received UDP ping reply from %s:%d: date=%d, queryID=%ld, my IP=%s, my port=%d", srcEndpoint.address.ToString().c_str(), srcEndpoint.port, date, (long int) queryID, IPv4Address(*reinterpret_cast(myIP+12)).ToString().c_str(), myPort); + srcEndpoint.udpPongCount++; + if(srcEndpoint.IsIPv6Only() && !didSendIPv6Endpoint){ IPv6Address realAddr(myIP); if(realAddr==myIPv6){ LOGI("Public IPv6 matches local address"); @@ -1010,51 +1832,45 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, shared_ptr=16){ + if(in.Remaining()>=16){ MutexGuard _m(endpointsMutex); uint32_t myAddr=(uint32_t) in.ReadInt32(); uint32_t myPort=(uint32_t) in.ReadInt32(); uint32_t peerAddr=(uint32_t) in.ReadInt32(); uint32_t peerPort=(uint32_t) in.ReadInt32(); - for(vector>::iterator itrtr=endpoints.begin(); itrtr!=endpoints.end(); ++itrtr){ - shared_ptr ep=*itrtr; - if(ep->type==Endpoint::TYPE_UDP_P2P_INET && !ep->IsIPv6Only()){ - if(currentEndpoint==ep) - currentEndpoint=preferredRelay; - endpoints.erase(itrtr); - break; - } - } - for(vector>::iterator itrtr=endpoints.begin(); itrtr!=endpoints.end(); ++itrtr){ - shared_ptr ep=*itrtr; - if(ep->type==Endpoint::TYPE_UDP_P2P_LAN){ - if(currentEndpoint==ep) - currentEndpoint=preferredRelay; - endpoints.erase(itrtr); - break; - } - } + + constexpr int64_t p2pID=(int64_t) (FOURCC('P', '2', 'P', '4')) << 32; + constexpr int64_t lanID=(int64_t) (FOURCC('L', 'A', 'N', '4')) << 32; + + if(currentEndpoint==p2pID || currentEndpoint==lanID) + currentEndpoint=preferredRelay; + + endpoints.erase(lanID); + IPv4Address _peerAddr(peerAddr); IPv6Address emptyV6(string("::0")); unsigned char peerTag[16]; - endpoints.push_back(make_shared((int64_t)(FOURCC('P','2','P','4')) << 32, (uint16_t) peerPort, _peerAddr, emptyV6, Endpoint::TYPE_UDP_P2P_INET, peerTag)); - LOGW("Received reflector peer info, my=%08X:%u, peer=%08X:%u", myAddr, myPort, peerAddr, peerPort); - if(myAddr==peerAddr){ - LOGW("Detected LAN"); - IPv4Address lanAddr(0); - udpSocket->GetLocalInterfaceInfo(&lanAddr, NULL); - - BufferOutputStream pkt(8); - pkt.WriteInt32(lanAddr.GetAddress()); - pkt.WriteInt32(udpSocket->GetLocalPort()); - if(peerVersion<6){ - SendPacketReliably(PKT_LAN_ENDPOINT, pkt.GetBuffer(), pkt.GetLength(), 0.5, 10); - }else{ - Buffer buf(move(pkt)); - SendExtra(buf, EXTRA_TYPE_LAN_ENDPOINT); + LOGW("Received reflector peer info, my=%s:%u, peer=%s:%u", IPv4Address(myAddr).ToString().c_str(), myPort, IPv4Address(peerAddr).ToString().c_str(), peerPort); + if(waitingForRelayPeerInfo){ + Endpoint p2p(p2pID, (uint16_t) peerPort, _peerAddr, emptyV6, Endpoint::Type::UDP_P2P_INET, peerTag); + endpoints[p2pID]=p2p; + if(myAddr==peerAddr){ + LOGW("Detected LAN"); + IPv4Address lanAddr(0); + udpSocket->GetLocalInterfaceInfo(&lanAddr, NULL); + + BufferOutputStream pkt(8); + pkt.WriteInt32(lanAddr.GetAddress()); + pkt.WriteInt32(udpSocket->GetLocalPort()); + if(peerVersion<6){ + SendPacketReliably(PKT_LAN_ENDPOINT, pkt.GetBuffer(), pkt.GetLength(), 0.5, 10); + }else{ + Buffer buf(move(pkt)); + SendExtra(buf, EXTRA_TYPE_LAN_ENDPOINT); + } } + waitingForRelayPeerInfo=false; } - waitingForRelayPeerInfo=false; } }else{ LOGV("Received relay response with unknown tl id: 0x%08X", tlid); @@ -1067,15 +1883,13 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, shared_ptr=8 || (!peerVersion && connectionMaxLayer>=92); if(!useMTProto2){ unsigned char fingerprint[8], msgHash[16]; in.ReadBytes(fingerprint, 8); in.ReadBytes(msgHash, 16); - if(memcmp(fingerprint, keyFingerprint, 8)!=0){ - LOGW("Received packet has wrong key fingerprint"); - return; - } unsigned char key[32], iv[32]; KDF(msgHash, isOutgoing ? 8 : 0, key, iv); unsigned char aesOut[MSC_STACK_FALLBACK(in.Remaining(), 1500)]; @@ -1086,7 +1900,7 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, shared_ptr_in.Remaining()) - _len=_in.Remaining(); + _len=(uint32_t) _in.Remaining(); crypto.sha1((uint8_t *) (aesOut), (size_t) (_len+4), sha); if(memcmp(msgHash, sha+(SHA1_LENGTH-16), 16)!=0){ LOGW("Received packet has wrong hash after decryption"); @@ -1101,13 +1915,16 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, shared_ptrsizeof(decrypted)) return; - //LOGV("-> MSG KEY: %08x %08x %08x %08x, hashed %u", *reinterpret_cast(msgKey), *reinterpret_cast(msgKey+4), *reinterpret_cast(msgKey+8), *reinterpret_cast(msgKey+12), decryptedLen-4); - - /*uint8_t *decryptOffset = packet.data + in.GetOffset(); - if ((((intptr_t)decryptOffset) % sizeof(long)) != 0) { - LOGE("alignment2 packet.data+in.GetOffset()"); + if(decryptedLen%16!=0){ + LOGW("wrong decrypted length"); + return; } - if (decryptedLen % sizeof(long) != 0) { - LOGE("alignment2 decryptedLen"); - }*/ + crypto.aes_ige_decrypt(packet.data+in.GetOffset(), decrypted, decryptedLen, aesKey, aesIv); in=BufferInputStream(decrypted, decryptedLen); //LOGD("received packet length: %d", in.ReadInt32()); + size_t sizeSize=shortFormat ? 0 : 4; BufferOutputStream buf(decryptedLen+32); size_t x=isOutgoing ? 8 : 0; buf.WriteBytes(encryptionKey+88+x, 32); - buf.WriteBytes(decrypted+4, decryptedLen-4); + buf.WriteBytes(decrypted+sizeSize, decryptedLen-sizeSize); unsigned char msgKeyLarge[32]; crypto.sha256(buf.GetBuffer(), buf.GetLength(), msgKeyLarge); @@ -1143,16 +1957,16 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, shared_ptrdecryptedLen-4){ - LOGW("Received packet has wrong inner length (%d with total of %u)", (int)innerLen, (unsigned int)decryptedLen); + innerLen=(uint32_t) (shortFormat ? in.ReadInt16() : in.ReadInt32()); + if(innerLen>decryptedLen-sizeSize){ + LOGW("Received packet has wrong inner length (%d with total of %u)", (int) innerLen, (unsigned int) decryptedLen); return; } - if(decryptedLen-innerLen<12){ - LOGW("Received packet has too little padding (%u)", (unsigned int)(decryptedLen-innerLen)); + if(decryptedLen-innerLen<(shortFormat ? 16 : 12)){ + LOGW("Received packet has too little padding (%u)", (unsigned int) (decryptedLen-innerLen)); return; } - memcpy(buffer, decrypted+4, innerLen); + memcpy(buffer, decrypted+(shortFormat ? 2 : 4), innerLen); in=BufferInputStream(buffer, (size_t) innerLen); if(retryWith2){ LOGD("Successfully decrypted packet in MTProto2.0 fallback, upgrading"); @@ -1167,74 +1981,94 @@ void VoIPController::ProcessIncomingPacket(NetworkPacket &packet, shared_ptr(packet.address); + if(v4){ + LOGI("Incoming packet was decrypted successfully, changing P2P endpoint to %s:%u", packet.address->ToString().c_str(), packet.port); + srcEndpoint.address=*v4; + srcEndpoint.port=packet.port; + } + } + } + /*decryptedAudioBlock random_id:long random_bytes:string flags:# voice_call_id:flags.2?int128 in_seq_no:flags.4?int out_seq_no:flags.4?int * recent_received_mask:flags.5?int proto:flags.3?int extra:flags.1?string raw_data:flags.0?string = DecryptedAudioBlock simpleAudioBlock random_id:long random_bytes:string raw_data:string = DecryptedAudioBlock; */ uint32_t ackId, pseq, acks; unsigned char type, pflags; - uint32_t tlid=(uint32_t) in.ReadInt32(); - uint32_t packetInnerLen=0; - if(tlid==TLID_DECRYPTED_AUDIO_BLOCK){ - in.ReadInt64(); // random id - uint32_t randLen=(uint32_t) in.ReadTlLength(); - in.Seek(in.GetOffset()+randLen+pad4(randLen)); - uint32_t flags=(uint32_t) in.ReadInt32(); - type=(unsigned char) ((flags >> 24) & 0xFF); - if(!(flags & PFLAG_HAS_SEQ && flags & PFLAG_HAS_RECENT_RECV)){ - LOGW("Received packet doesn't have PFLAG_HAS_SEQ, PFLAG_HAS_RECENT_RECV, or both"); - - return; - } - if(flags & PFLAG_HAS_CALL_ID){ - unsigned char pktCallID[16]; - in.ReadBytes(pktCallID, 16); - if(memcmp(pktCallID, callID, 16)!=0){ - LOGW("Received packet has wrong call id"); - - lastError=ERROR_UNKNOWN; - SetState(STATE_FAILED); - return; - } - } + size_t packetInnerLen=0; + if(shortFormat){ + type=in.ReadByte(); ackId=(uint32_t) in.ReadInt32(); pseq=(uint32_t) in.ReadInt32(); acks=(uint32_t) in.ReadInt32(); - if(flags & PFLAG_HAS_PROTO){ - uint32_t proto=(uint32_t) in.ReadInt32(); - if(proto!=PROTOCOL_NAME){ - LOGW("Received packet uses wrong protocol"); + pflags=in.ReadByte(); + packetInnerLen=innerLen-14; + }else{ + uint32_t tlid=(uint32_t) in.ReadInt32(); + if(tlid==TLID_DECRYPTED_AUDIO_BLOCK){ + in.ReadInt64(); // random id + uint32_t randLen=(uint32_t) in.ReadTlLength(); + in.Seek(in.GetOffset()+randLen+pad4(randLen)); + uint32_t flags=(uint32_t) in.ReadInt32(); + type=(unsigned char) ((flags >> 24) & 0xFF); + if(!(flags & PFLAG_HAS_SEQ && flags & PFLAG_HAS_RECENT_RECV)){ + LOGW("Received packet doesn't have PFLAG_HAS_SEQ, PFLAG_HAS_RECENT_RECV, or both"); - lastError=ERROR_INCOMPATIBLE; - SetState(STATE_FAILED); return; } - } - if(flags & PFLAG_HAS_EXTRA){ - uint32_t extraLen=(uint32_t) in.ReadTlLength(); - in.Seek(in.GetOffset()+extraLen+pad4(extraLen)); - } - if(flags & PFLAG_HAS_DATA){ - packetInnerLen=in.ReadTlLength(); - } - pflags=0; - }else if(tlid==TLID_SIMPLE_AUDIO_BLOCK){ - in.ReadInt64(); // random id - uint32_t randLen=(uint32_t) in.ReadTlLength(); - in.Seek(in.GetOffset()+randLen+pad4(randLen)); - packetInnerLen=in.ReadTlLength(); - type=in.ReadByte(); - ackId=(uint32_t) in.ReadInt32(); - pseq=(uint32_t) in.ReadInt32(); - acks=(uint32_t) in.ReadInt32(); - if(peerVersion>=6) - pflags=in.ReadByte(); - else + if(flags & PFLAG_HAS_CALL_ID){ + unsigned char pktCallID[16]; + in.ReadBytes(pktCallID, 16); + if(memcmp(pktCallID, callID, 16)!=0){ + LOGW("Received packet has wrong call id"); + + lastError=ERROR_UNKNOWN; + SetState(STATE_FAILED); + return; + } + } + ackId=(uint32_t) in.ReadInt32(); + pseq=(uint32_t) in.ReadInt32(); + acks=(uint32_t) in.ReadInt32(); + if(flags & PFLAG_HAS_PROTO){ + uint32_t proto=(uint32_t) in.ReadInt32(); + if(proto!=PROTOCOL_NAME){ + LOGW("Received packet uses wrong protocol"); + + lastError=ERROR_INCOMPATIBLE; + SetState(STATE_FAILED); + return; + } + } + if(flags & PFLAG_HAS_EXTRA){ + uint32_t extraLen=(uint32_t) in.ReadTlLength(); + in.Seek(in.GetOffset()+extraLen+pad4(extraLen)); + } + if(flags & PFLAG_HAS_DATA){ + packetInnerLen=in.ReadTlLength(); + } pflags=0; - }else{ - LOGW("Received a packet of unknown type %08X", tlid); + }else if(tlid==TLID_SIMPLE_AUDIO_BLOCK){ + in.ReadInt64(); // random id + uint32_t randLen=(uint32_t) in.ReadTlLength(); + in.Seek(in.GetOffset()+randLen+pad4(randLen)); + packetInnerLen=in.ReadTlLength(); + type=in.ReadByte(); + ackId=(uint32_t) in.ReadInt32(); + pseq=(uint32_t) in.ReadInt32(); + acks=(uint32_t) in.ReadInt32(); + if(peerVersion>=6) + pflags=in.ReadByte(); + else + pflags=0; + }else{ + LOGW("Received a packet of unknown type %08X", tlid); - return; + return; + } } packetsReceived++; if(seqgt(pseq, lastRemoteSeq)){ @@ -1338,11 +2172,50 @@ simpleAudioBlock random_id:long random_bytes:string raw_data:string = DecryptedA } ++x; } + if(videoSource && !videoKeyframeRequested){ + // video frames are stored in sentVideoFrames in order of increasing numbers + // so if a frame (or part of it) is acknowledged but isn't sentVideoFrames[0], we know there was a packet loss + MutexGuard m(sentVideoFramesMutex); + for(SentVideoFrame& f:sentVideoFrames){ + for(vector::iterator s=f.unacknowledgedPackets.begin(); s!=f.unacknowledgedPackets.end();){ + if(WasOutgoingPacketAcknowledged(*s)){ + s=f.unacknowledgedPackets.erase(s); + }else{ + ++s; + } + } + } + bool first=true; + for(vector::iterator f=sentVideoFrames.begin();f!=sentVideoFrames.end();){ + if(f->unacknowledgedPackets.empty()){ + LOGV("Video frame %u was acknowledged", f->num); + if(first){ + f=sentVideoFrames.erase(f); + continue; + }else{ + LOGE("!!!!!!!!!!!!!!11 VIDEO FRAME LOSS DETECTED [1]"); + videoKeyframeRequested=true; + videoSource->RequestKeyFrame(); + break; + } + }else if(first){ + first=false; + }else if(!first && f->unacknowledgedPackets.size()fragmentCount){ + LOGE("!!!!!!!!!!!!!!11 VIDEO FRAME LOSS DETECTED [2]"); + videoKeyframeRequested=true; + videoSource->RequestKeyFrame(); + break; + } + ++f; + } + } } - if(srcEndpoint!=currentEndpoint && (srcEndpoint->type==Endpoint::TYPE_UDP_RELAY || srcEndpoint->type==Endpoint::TYPE_TCP_RELAY) && ((currentEndpoint->type!=Endpoint::TYPE_UDP_RELAY && currentEndpoint->type!=Endpoint::TYPE_TCP_RELAY) || currentEndpoint->averageRTT==0)){ + Endpoint* _currentEndpoint=&endpoints.at(currentEndpoint); + if(srcEndpoint.id!=currentEndpoint && (srcEndpoint.type==Endpoint::Type::UDP_RELAY || srcEndpoint.type==Endpoint::Type::TCP_RELAY) && ((_currentEndpoint->type!=Endpoint::Type::UDP_RELAY && _currentEndpoint->type!=Endpoint::Type::TCP_RELAY) || _currentEndpoint->averageRTT==0)){ if(seqgt(lastSentSeq-32, lastRemoteAckSeq)){ - currentEndpoint=srcEndpoint; + currentEndpoint=srcEndpoint.id; + _currentEndpoint=&srcEndpoint; LOGI("Peer network address probably changed, switching to relay"); if(allowP2p) SendPublicEndpointsRequest(); @@ -1359,30 +2232,41 @@ simpleAudioBlock random_id:long random_bytes:string raw_data:string = DecryptedA } } + if(config.logPacketStats){ + DebugLoggedPacket dpkt={ + static_cast(pseq), + GetCurrentTime()-connectionInitTime, + static_cast(packet.length) + }; + debugLoggedPackets.push_back(dpkt); + if(debugLoggedPackets.size()>=2500){ + debugLoggedPackets.erase(debugLoggedPackets.begin(), debugLoggedPackets.begin()+500); + } + } + +#ifdef LOG_PACKETS + LOGV("Received: from=%s:%u, seq=%u, length=%u, type=%s", srcEndpoint.GetAddress().ToString().c_str(), srcEndpoint.port, pseq, packet.length, GetPacketTypeString(type).c_str()); +#endif + //LOGV("acks: %u -> %.2lf, %.2lf, %.2lf, %.2lf, %.2lf, %.2lf, %.2lf, %.2lf", lastRemoteAckSeq, remoteAcks[0], remoteAcks[1], remoteAcks[2], remoteAcks[3], remoteAcks[4], remoteAcks[5], remoteAcks[6], remoteAcks[7]); //LOGD("recv: %u -> %.2lf, %.2lf, %.2lf, %.2lf, %.2lf, %.2lf, %.2lf, %.2lf", lastRemoteSeq, recvPacketTimes[0], recvPacketTimes[1], recvPacketTimes[2], recvPacketTimes[3], recvPacketTimes[4], recvPacketTimes[5], recvPacketTimes[6], recvPacketTimes[7]); //LOGI("RTT = %.3lf", GetAverageRTT()); //LOGV("Packet %u type is %d", pseq, type); if(type==PKT_INIT){ LOGD("Received init"); - if(!receivedInit){ - receivedInit=true; - if((srcEndpoint->type==Endpoint::TYPE_UDP_RELAY && udpConnectivityState!=UDP_BAD && udpConnectivityState!=UDP_NOT_AVAILABLE) || srcEndpoint->type==Endpoint::TYPE_TCP_RELAY){ - currentEndpoint=srcEndpoint; - if(srcEndpoint->type==Endpoint::TYPE_UDP_RELAY || (useTCP && srcEndpoint->type==Endpoint::TYPE_TCP_RELAY)) - preferredRelay=srcEndpoint; - } - LogDebugInfo(); - peerVersion=(uint32_t) in.ReadInt32(); - LOGI("Peer version is %d", peerVersion); - uint32_t minVer=(uint32_t) in.ReadInt32(); - if(minVer>PROTOCOL_VERSION || peerVersionPROTOCOL_VERSION || peerVersion(in.ReadInt32()); + peerVideoDecoders.push_back(id); + char* _id=reinterpret_cast(&id); + LOGD("%c%c%c%c", _id[3], _id[2], _id[1], _id[0]); + } + peerMaxVideoResolution=in.ReadByte(); + + SetupOutgoingVideoStream(); } BufferOutputStream out(1024); @@ -1424,13 +2321,25 @@ simpleAudioBlock random_id:long random_bytes:string raw_data:string = DecryptedA out.WriteInt16((*s)->frameDuration); out.WriteByte((unsigned char) ((*s)->enabled ? 1 : 0)); } - sendQueue->Put(PendingOutgoingPacket{ + LOGI("Sending init ack"); + SendOrEnqueuePacket(PendingOutgoingPacket{ /*.seq=*/GenerateOutSeq(), /*.type=*/PKT_INIT_ACK, /*.len=*/out.GetLength(), /*.data=*/Buffer(move(out)), /*.endpoint=*/0 }); + if(!receivedInit){ + receivedInit=true; + if((srcEndpoint.type==Endpoint::Type::UDP_RELAY && udpConnectivityState!=UDP_BAD && udpConnectivityState!=UDP_NOT_AVAILABLE) || srcEndpoint.type==Endpoint::Type::TCP_RELAY){ + currentEndpoint=srcEndpoint.id; + if(srcEndpoint.type==Endpoint::Type::UDP_RELAY || (useTCP && srcEndpoint.type==Endpoint::Type::TCP_RELAY)) + preferredRelay=srcEndpoint.id; + } + } + if(!audioStarted && receivedInitAck){ + StartAudio(); + audioStarted=true; } } if(type==PKT_INIT_ACK){ @@ -1474,12 +2383,13 @@ simpleAudioBlock random_id:long random_bytes:string raw_data:string = DecryptedA }else{ stm->codec=(uint32_t) in.ReadInt32(); } - stm->frameDuration=(uint16_t) in.ReadInt16(); + in.ReadInt16(); + stm->frameDuration=60; stm->enabled=in.ReadByte()==1; if(stm->type==STREAM_TYPE_AUDIO){ stm->jitterBuffer=make_shared(nullptr, stm->frameDuration); if(stm->frameDuration>50) - stm->jitterBuffer->SetMinPacketCount((uint32_t) ServerConfig::GetSharedInstance()->GetInt("jitter_initial_delay_60", 3)); + stm->jitterBuffer->SetMinPacketCount((uint32_t) ServerConfig::GetSharedInstance()->GetInt("jitter_initial_delay_60", 2)); else if(stm->frameDuration>30) stm->jitterBuffer->SetMinPacketCount((uint32_t) ServerConfig::GetSharedInstance()->GetInt("jitter_initial_delay_40", 4)); else @@ -1488,6 +2398,7 @@ simpleAudioBlock random_id:long random_bytes:string raw_data:string = DecryptedA }else if(stm->type==STREAM_TYPE_VIDEO){ if(!stm->packetReassembler){ stm->packetReassembler=make_shared(); + stm->packetReassembler->SetCallback(bind(&VoIPController::ProcessIncomingVideoFrame, this, placeholders::_1, placeholders::_2, placeholders::_3)); } }else{ LOGW("Unknown incoming stream type: %d", stm->type); @@ -1505,11 +2416,9 @@ simpleAudioBlock random_id:long random_bytes:string raw_data:string = DecryptedA LOGD("MTProto2 wasn't initially enabled for whatever reason but peer supports it; upgrading"); } - { - MutexGuard m(audioIOMutex); - if(!audioInput){ - StartAudio(); - } + if(!audioStarted && receivedInit){ + StartAudio(); + audioStarted=true; } messageThread.Post([this]{ if(state==STATE_WAIT_INIT_ACK){ @@ -1544,14 +2453,17 @@ simpleAudioBlock random_id:long random_bytes:string raw_data:string = DecryptedA break; } int i; - if(srcEndpoint->type==Endpoint::TYPE_UDP_RELAY && srcEndpoint!=peerPreferredRelay){ - peerPreferredRelay=srcEndpoint; + if(srcEndpoint.type==Endpoint::Type::UDP_RELAY && srcEndpoint.id!=peerPreferredRelay){ + peerPreferredRelay=srcEndpoint.id; } for(i=0;iStart(); audioOutStarted=true; } + bool fragmented=static_cast(sdlen & STREAM_DATA_XFLAG_FRAGMENTED); + bool extraFEC=static_cast(sdlen & STREAM_DATA_XFLAG_EXTRA_FEC); + bool keyframe=static_cast(sdlen & STREAM_DATA_XFLAG_KEYFRAME); + if(fragmented){ + fragmentIndex=in.ReadByte(); + fragmentCount=in.ReadByte(); + } + sdlen&=0x7FF; if(in.GetOffset()+sdlen>len){ return; } - if(incomingStreams.size()>0 && incomingStreams[0]->jitterBuffer /*&& !incomingStreams[0]->extraECEnabled*/) - incomingStreams[0]->jitterBuffer->HandleInput((unsigned char*) (buffer+in.GetOffset()), sdlen, pts, false); + shared_ptr stm; + for(shared_ptr& ss:incomingStreams){ + if(ss->id==streamID){ + stm=ss; + break; + } + } + if(stm && stm->type==STREAM_TYPE_AUDIO){ + if(stm->jitterBuffer){ + stm->jitterBuffer->HandleInput((unsigned char *) (buffer+in.GetOffset()), sdlen, pts, false); + if(extraFEC){ + in.Seek(in.GetOffset()+sdlen); + unsigned int fecCount=in.ReadByte(); + for(unsigned int j=0;jjitterBuffer->HandleInput(data, dlen, pts-(fecCount-j-1)*stm->frameDuration, true); + } + } + } + }else if(stm && stm->type==STREAM_TYPE_VIDEO){ + if(stm->packetReassembler){ + Buffer pdata(sdlen); + pdata.CopyFrom(buffer+in.GetOffset(), 0, sdlen); + stm->packetReassembler->AddFragment(std::move(pdata), fragmentIndex, fragmentCount, pts, keyframe); + } + //LOGV("Received video fragment %u of %u", fragmentIndex, fragmentCount); + }else{ + LOGW("received packet for unknown stream %u", (unsigned int)streamID); + } if(iaddress.ToString().c_str(), srcEndpoint->port); - if(srcEndpoint->type!=Endpoint::TYPE_UDP_RELAY && srcEndpoint->type!=Endpoint::TYPE_TCP_RELAY && !allowP2p){ + //LOGD("Received ping from %s:%d", srcEndpoint.address.ToString().c_str(), srcEndpoint.port); + if(srcEndpoint.type!=Endpoint::Type::UDP_RELAY && srcEndpoint.type!=Endpoint::Type::TCP_RELAY && !allowP2p){ LOGW("Received p2p ping but p2p is disabled by manual override"); return; } BufferOutputStream pkt(128); pkt.WriteInt32(pseq); - sendQueue->Put(PendingOutgoingPacket{ + SendOrEnqueuePacket(PendingOutgoingPacket{ /*.seq=*/GenerateOutSeq(), /*.type=*/PKT_PONG, /*.len=*/pkt.GetLength(), /*.data=*/Buffer(move(pkt)), - /*.endpoint=*/srcEndpoint->id, + /*.endpoint=*/srcEndpoint.id, }); } if(type==PKT_PONG){ if(packetInnerLen>=4){ uint32_t pingSeq=(uint32_t) in.ReadInt32(); - if(pingSeq==srcEndpoint->lastPingSeq){ - srcEndpoint->rtts.Add(GetCurrentTime()-srcEndpoint->lastPingTime); - srcEndpoint->averageRTT=srcEndpoint->rtts.NonZeroAverage(); - LOGD("Current RTT via %s: %.3f, average: %.3f", packet.address->ToString().c_str(), srcEndpoint->rtts[0], srcEndpoint->averageRTT); +#ifdef LOG_PACKETS + LOGD("Received pong for ping in seq %u", pingSeq); +#endif + if(pingSeq==srcEndpoint.lastPingSeq){ + srcEndpoint.rtts.Add(GetCurrentTime()-srcEndpoint.lastPingTime); + srcEndpoint.averageRTT=srcEndpoint.rtts.NonZeroAverage(); + LOGD("Current RTT via %s: %.3f, average: %.3f", packet.address->ToString().c_str(), srcEndpoint.rtts[0], srcEndpoint.averageRTT); + if(srcEndpoint.averageRTT>rateMaxAcceptableRTT) + needRate=true; } } } if(type==PKT_STREAM_STATE){ unsigned char id=in.ReadByte(); unsigned char enabled=in.ReadByte(); + LOGV("Peer stream state: id %u flags %u", (int)id, (int)enabled); for(vector>::iterator s=incomingStreams.begin();s!=incomingStreams.end();++s){ if((*s)->id==id){ (*s)->enabled=enabled==1; @@ -1610,24 +2565,17 @@ simpleAudioBlock random_id:long random_bytes:string raw_data:string = DecryptedA uint32_t peerAddr=(uint32_t) in.ReadInt32(); uint16_t peerPort=(uint16_t) in.ReadInt32(); MutexGuard m(endpointsMutex); - bool found=false; - for(shared_ptr& e:endpoints){ - if(e->type==Endpoint::TYPE_UDP_P2P_LAN){ - if(currentEndpoint==e) - currentEndpoint=preferredRelay; - found=true; - e->address=peerAddr; - break; - } - } - if(!found){ - IPv4Address v4addr(peerAddr); - IPv6Address v6addr(string("::0")); - unsigned char peerTag[16]; - endpoints.push_back(make_shared((int64_t)(FOURCC('L','A','N','4')) << 32, peerPort, v4addr, v6addr, Endpoint::TYPE_UDP_P2P_LAN, peerTag)); - } + constexpr int64_t lanID=(int64_t)(FOURCC('L','A','N','4')) << 32; + IPv4Address v4addr(peerAddr); + IPv6Address v6addr(string("::0")); + unsigned char peerTag[16]; + Endpoint lan(lanID, peerPort, v4addr, v6addr, Endpoint::Type::UDP_P2P_LAN, peerTag); + + if(currentEndpoint==lanID) + currentEndpoint=preferredRelay; + endpoints[lanID]=lan; } - if(type==PKT_NETWORK_CHANGED && currentEndpoint->type!=Endpoint::TYPE_UDP_RELAY && currentEndpoint->type!=Endpoint::TYPE_TCP_RELAY){ + if(type==PKT_NETWORK_CHANGED && _currentEndpoint->type!=Endpoint::Type::UDP_RELAY && _currentEndpoint->type!=Endpoint::Type::TCP_RELAY){ currentEndpoint=preferredRelay; if(allowP2p) SendPublicEndpointsRequest(); @@ -1668,12 +2616,15 @@ void VoIPController::ProcessExtraData(Buffer &data){ if(lastReceivedExtrasByType[type]==hash){ return; } + LOGE("ProcessExtraData"); lastReceivedExtrasByType[type]=hash; if(type==EXTRA_TYPE_STREAM_FLAGS){ unsigned char id=in.ReadByte(); uint32_t flags=static_cast(in.ReadInt32()); + LOGV("Peer stream state: id %u flags %u", (unsigned int)id, (unsigned int)flags); for(shared_ptr& s:incomingStreams){ if(s->id==id){ + bool prevEnabled=s->enabled; s->enabled=(flags & STREAM_FLAG_ENABLED)==STREAM_FLAG_ENABLED; if(flags & STREAM_FLAG_EXTRA_EC){ if(!s->extraECEnabled){ @@ -1688,12 +2639,42 @@ void VoIPController::ProcessExtraData(Buffer &data){ s->jitterBuffer->SetMinPacketCount(2); } } - UpdateAudioOutputState(); + if(prevEnabled!=s->enabled && s->type==STREAM_TYPE_VIDEO && videoRenderer) + videoRenderer->SetStreamEnabled(s->enabled); + UpdateAudioOutputState(); + break; + } + } + }else if(type==EXTRA_TYPE_STREAM_CSD){ + LOGI("Received codec specific data"); + /* + os.WriteByte(stream.id); + os.WriteByte(static_cast(stream.codecSpecificData.size())); + for(Buffer& b:stream.codecSpecificData){ + assert(b.Length()<255); + os.WriteByte(static_cast(b.Length())); + os.WriteBytes(b); + } + Buffer buf(move(os)); + SendExtra(buf, EXTRA_TYPE_STREAM_CSD); + */ + unsigned char streamID=in.ReadByte(); + for(shared_ptr& stm:incomingStreams){ + if(stm->id==streamID){ + stm->codecSpecificData.clear(); + stm->csdIsValid=false; + stm->width=static_cast(in.ReadInt16()); + stm->height=static_cast(in.ReadInt16()); + size_t count=(size_t)in.ReadByte(); + for(size_t i=0;icodecSpecificData.push_back(move(csd)); + } break; } } - }else if(type==EXTRA_TYPE_STREAM_CSD){ - }else if(type==EXTRA_TYPE_LAN_ENDPOINT){ if(!allowP2p) return; @@ -1701,25 +2682,20 @@ void VoIPController::ProcessExtraData(Buffer &data){ uint32_t peerAddr=(uint32_t) in.ReadInt32(); uint16_t peerPort=(uint16_t) in.ReadInt32(); MutexGuard m(endpointsMutex); - bool found=false; - for(shared_ptr& e:endpoints){ - if(e->type==Endpoint::TYPE_UDP_P2P_LAN){ - if(currentEndpoint==e) - currentEndpoint=preferredRelay; - found=true; - e->address=peerAddr; - break; - } - } - if(!found){ - IPv4Address v4addr(peerAddr); - IPv6Address v6addr(string("::0")); - unsigned char peerTag[16]; - endpoints.push_back(make_shared((int64_t)(FOURCC('L','A','N','4')) << 32, peerPort, v4addr, v6addr, Endpoint::TYPE_UDP_P2P_LAN, peerTag)); - } + constexpr int64_t lanID=(int64_t)(FOURCC('L','A','N','4')) << 32; + if(currentEndpoint==lanID) + currentEndpoint=preferredRelay; + + IPv4Address v4addr(peerAddr); + IPv6Address v6addr(string("::0")); + unsigned char peerTag[16]; + Endpoint lan(lanID, peerPort, v4addr, v6addr, Endpoint::Type::UDP_P2P_LAN, peerTag); + endpoints[lanID]=lan; }else if(type==EXTRA_TYPE_NETWORK_CHANGED){ LOGI("Peer network changed"); - if(currentEndpoint->type!=Endpoint::TYPE_UDP_RELAY && currentEndpoint->type!=Endpoint::TYPE_TCP_RELAY) + wasNetworkHandover=true; + const Endpoint& _currentEndpoint=endpoints.at(currentEndpoint); + if(_currentEndpoint.type!=Endpoint::Type::UDP_RELAY && _currentEndpoint.type!=Endpoint::Type::TCP_RELAY) currentEndpoint=preferredRelay; if(allowP2p) SendPublicEndpointsRequest(); @@ -1732,7 +2708,7 @@ void VoIPController::ProcessExtraData(Buffer &data){ if(!didReceiveGroupCallKey && !didSendGroupCallKey){ unsigned char groupKey[256]; in.ReadBytes(groupKey, 256); - messageThread.Post([this, groupKey]{ + messageThread.Post([this, &groupKey]{ if(callbacks.groupCallKeyReceived) callbacks.groupCallKeyReceived(this, groupKey); }); @@ -1755,26 +2731,22 @@ void VoIPController::ProcessExtraData(Buffer &data){ uint16_t port=static_cast(in.ReadInt16()); MutexGuard m(endpointsMutex); peerIPv6Available=true; - for(shared_ptr& e:endpoints){ - if(e->type==Endpoint::TYPE_UDP_P2P_INET && e->IsIPv6Only()){ - e->v6address=addr; - if(!myIPv6.IsEmpty()) - currentEndpoint=e; - return; - } - } - shared_ptr ep=make_shared(); - ep->type=Endpoint::TYPE_UDP_P2P_INET; - ep->port=port; - ep->v6address=addr; - ep->id=(int64_t)(FOURCC('P','2','P','6')) << 32; - endpoints.push_back(ep); + LOGV("Received peer IPv6 endpoint [%s]:%u", addr.ToString().c_str(), port); + + constexpr int64_t p2pID=(int64_t)(FOURCC('P','2','P','6')) << 32; + + Endpoint ep; + ep.type=Endpoint::Type::UDP_P2P_INET; + ep.port=port; + ep.v6address=addr; + ep.id=p2pID; + endpoints[p2pID]=ep; if(!myIPv6.IsEmpty()) - currentEndpoint=ep; + currentEndpoint=p2pID; } } -void VoIPController::ProcessAcknowledgedOutgoingExtra(VoIPController::UnacknowledgedExtraData &extra){ +void VoIPController::ProcessAcknowledgedOutgoingExtra(UnacknowledgedExtraData &extra){ if(extra.type==EXTRA_TYPE_GROUP_CALL_KEY){ if(!didReceiveGroupCallKeyAck){ didReceiveGroupCallKeyAck=true; @@ -1787,39 +2759,109 @@ void VoIPController::ProcessAcknowledgedOutgoingExtra(VoIPController::Unacknowle } Endpoint& VoIPController::GetRemoteEndpoint(){ - return *currentEndpoint; + return endpoints.at(currentEndpoint); } +Endpoint* VoIPController::GetEndpointForPacket(const PendingOutgoingPacket& pkt){ + Endpoint* endpoint=NULL; + if(pkt.endpoint){ + try{ + endpoint=&endpoints.at(pkt.endpoint); + }catch(out_of_range& x){ + LOGW("Unable to send packet via nonexistent endpoint %" PRIu64, pkt.endpoint); + return NULL; + } + } + if(!endpoint) + endpoint=&endpoints.at(currentEndpoint); + return endpoint; +} + +bool VoIPController::SendOrEnqueuePacket(PendingOutgoingPacket pkt, bool enqueue){ + Endpoint* endpoint=GetEndpointForPacket(pkt); + if(!endpoint){ + abort(); + return false; + } + + + bool canSend; + if(endpoint->type!=Endpoint::Type::TCP_RELAY){ + canSend=realUdpSocket->IsReadyToSend(); + }else{ + if(!endpoint->socket){ + LOGV("Connecting to %s:%u", endpoint->GetAddress().ToString().c_str(), endpoint->port); + if(proxyProtocol==PROXY_NONE){ + endpoint->socket=new NetworkSocketTCPObfuscated(NetworkSocket::Create(NetworkProtocol::PROTO_TCP)); + endpoint->socket->Connect(&endpoint->GetAddress(), endpoint->port); + }else if(proxyProtocol==PROXY_SOCKS5){ + NetworkSocket* tcp=NetworkSocket::Create(NetworkProtocol::PROTO_TCP); + tcp->Connect(resolvedProxyAddress, proxyPort); + NetworkSocketSOCKS5Proxy* proxy=new NetworkSocketSOCKS5Proxy(tcp, NULL, proxyUsername, proxyPassword); + endpoint->socket=proxy; + endpoint->socket->Connect(&endpoint->GetAddress(), endpoint->port); + } + selectCanceller->CancelSelect(); + } + canSend=endpoint->socket && endpoint->socket->IsReadyToSend(); + } + if(!canSend){ + if(enqueue){ + LOGW("Not ready to send - enqueueing"); + sendQueue.push_back(move(pkt)); + } + return false; + } + if((endpoint->type==Endpoint::Type::TCP_RELAY && useTCP) || (endpoint->type!=Endpoint::Type::TCP_RELAY && useUDP)){ + //BufferOutputStream p(buf, sizeof(buf)); + BufferOutputStream p(1500); + WritePacketHeader(pkt.seq, &p, pkt.type, (uint32_t)pkt.len); + p.WriteBytes(pkt.data); + SendPacket(p.GetBuffer(), p.GetLength(), *endpoint, pkt); + if(pkt.type==PKT_STREAM_DATA){ + unsentStreamPackets--; + } + } + return true; +} -void VoIPController::SendPacket(unsigned char *data, size_t len, shared_ptr ep, PendingOutgoingPacket& srcPacket){ +void VoIPController::SendPacket(unsigned char *data, size_t len, Endpoint& ep, PendingOutgoingPacket& srcPacket){ if(stopping) return; - if(ep->type==Endpoint::TYPE_TCP_RELAY && !useTCP) + if(ep.type==Endpoint::Type::TCP_RELAY && !useTCP) return; BufferOutputStream out(len+128); - if(ep->type==Endpoint::TYPE_UDP_RELAY || ep->type==Endpoint::TYPE_TCP_RELAY) - out.WriteBytes((unsigned char*)ep->peerTag, 16); - else + if(ep.type==Endpoint::Type::UDP_RELAY || ep.type==Endpoint::Type::TCP_RELAY) + out.WriteBytes((unsigned char*)ep.peerTag, 16); + else if(peerVersion<9) out.WriteBytes(callID, 16); if(len>0){ if(useMTProto2){ BufferOutputStream inner(len+128); - inner.WriteInt32((uint32_t)len); + size_t sizeSize; + if(peerVersion>=8 || (!peerVersion && connectionMaxLayer>=92)){ + inner.WriteInt16((uint16_t) len); + sizeSize=0; + }else{ + inner.WriteInt32((uint32_t) len); + out.WriteBytes(keyFingerprint, 8); + sizeSize=4; + } inner.WriteBytes(data, len); + size_t padLen=16-inner.GetLength()%16; - if(padLen<12) + if(padLen<16) padLen+=16; - unsigned char padding[28]; + unsigned char padding[32]; crypto.rand_bytes((uint8_t *) padding, padLen); inner.WriteBytes(padding, padLen); assert(inner.GetLength()%16==0); unsigned char key[32], iv[32], msgKey[16]; - out.WriteBytes(keyFingerprint, 8); BufferOutputStream buf(len+32); size_t x=isOutgoing ? 0 : 8; buf.WriteBytes(encryptionKey+88+x, 32); - buf.WriteBytes(inner.GetBuffer()+4, inner.GetLength()-4); + buf.WriteBytes(inner.GetBuffer()+sizeSize, inner.GetLength()-sizeSize); unsigned char msgKeyLarge[32]; crypto.sha256(buf.GetBuffer(), buf.GetLength(), msgKeyLarge); memcpy(msgKey, msgKeyLarge+8, 16); @@ -1832,7 +2874,7 @@ void VoIPController::SendPacket(unsigned char *data, size_t len, shared_ptraddress.ToString().c_str(), ep->port); + //LOGV("Sending %d bytes to %s:%d", out.GetLength(), ep.address.ToString().c_str(), ep.port); +#ifdef LOG_PACKETS + LOGV("Sending: to=%s:%u, seq=%u, length=%u, type=%s", ep.GetAddress().ToString().c_str(), ep.port, srcPacket.seq, out.GetLength(), GetPacketTypeString(srcPacket.type).c_str()); +#endif NetworkPacket pkt={0}; - pkt.address=&ep->GetAddress(); - pkt.port=ep->port; + pkt.address=&ep.GetAddress(); + pkt.port=ep.port; pkt.length=out.GetLength(); pkt.data=out.GetBuffer(); - pkt.protocol=ep->type==Endpoint::TYPE_TCP_RELAY ? PROTO_TCP : PROTO_UDP; + pkt.protocol=ep.type==Endpoint::Type::TCP_RELAY ? PROTO_TCP : PROTO_UDP; ActuallySendPacket(pkt, ep); } -void VoIPController::ActuallySendPacket(NetworkPacket &pkt, shared_ptr ep){ +void VoIPController::ActuallySendPacket(NetworkPacket &pkt, Endpoint& ep){ //LOGI("Sending packet of %d bytes", pkt.length); if(IS_MOBILE_NETWORK(networkType)) stats.bytesSentMobile+=(uint64_t)pkt.length; else stats.bytesSentWifi+=(uint64_t)pkt.length; - if(ep->type==Endpoint::TYPE_TCP_RELAY){ - if(ep->socket && !ep->socket->IsFailed()){ - ep->socket->Send(&pkt); - }else{ - if(ep->socket){ - LOGD("closing failed TCP socket: %s:%u", ep->address.ToString().c_str(), ep->port); - ep->socket->Close(); - delete ep->socket; - ep->socket=NULL; - } - LOGI("connecting to tcp: %s:%u", ep->address.ToString().c_str(), ep->port); - NetworkSocket* s; - if(proxyProtocol==PROXY_NONE){ - s=NetworkSocket::Create(PROTO_TCP); - }else if(proxyProtocol==PROXY_SOCKS5){ - NetworkSocket* rawTcp=NetworkSocket::Create(PROTO_TCP); - openingTcpSocket=rawTcp; - rawTcp->Connect(resolvedProxyAddress, proxyPort); - if(rawTcp->IsFailed()){ - openingTcpSocket=NULL; - rawTcp->Close(); - delete rawTcp; - LOGW("Error connecting to SOCKS5 proxy"); - return; - } - NetworkSocketSOCKS5Proxy* proxy=new NetworkSocketSOCKS5Proxy(rawTcp, NULL, proxyUsername, proxyPassword); - openingTcpSocket=proxy; - proxy->InitConnection(); - if(proxy->IsFailed()){ - openingTcpSocket=NULL; - LOGW("Proxy initialization failed"); - proxy->Close(); - delete proxy; - return; - } - s=proxy; - }/*else if(proxyProtocol==PROXY_HTTP){ - s=NetworkSocket::Create(PROTO_TCP); - }*/else{ - LOGE("Unsupported proxy protocol %d", proxyProtocol); - SetState(STATE_FAILED); - return; - } - s->Connect(&ep->address, ep->port); - if(s->IsFailed()){ - openingTcpSocket=NULL; - s->Close(); - delete s; - LOGW("Error connecting to %s:%u", ep->address.ToString().c_str(), ep->port); - }else{ - NetworkSocketTCPObfuscated* tcpWrapper=new NetworkSocketTCPObfuscated(s); - openingTcpSocket=tcpWrapper; - tcpWrapper->InitConnection(); - openingTcpSocket=NULL; - if(tcpWrapper->IsFailed()){ - tcpWrapper->Close(); - delete tcpWrapper; - LOGW("Error initializing connection to %s:%u", ep->address.ToString().c_str(), ep->port); - }else{ - tcpWrapper->Send(&pkt); - ep->socket=tcpWrapper; - selectCanceller->CancelSelect(); - } - } + if(ep.type==Endpoint::Type::TCP_RELAY){ + if(ep.socket && !ep.socket->IsFailed()){ + ep.socket->Send(&pkt); } }else{ udpSocket->Send(&pkt); } } -void VoIPController::SetNetworkType(int type){ - networkType=type; - UpdateDataSavingState(); - UpdateAudioBitrateLimit(); - myIPv6=IPv6Address(); - string itfName=udpSocket->GetLocalInterfaceInfo(NULL, &myIPv6); - LOGI("Local IPv6 address: %s", myIPv6.ToString().c_str()); - if(itfName!=activeNetItfName){ - udpSocket->OnActiveInterfaceChanged(); - LOGI("Active network interface changed: %s -> %s", activeNetItfName.c_str(), itfName.c_str()); - bool isFirstChange=activeNetItfName.length()==0 && state!=STATE_ESTABLISHED && state!=STATE_RECONNECTING; - activeNetItfName=itfName; - if(isFirstChange) - return; - if(currentEndpoint && currentEndpoint->type!=Endpoint::TYPE_UDP_RELAY){ - if(preferredRelay->type==Endpoint::TYPE_UDP_RELAY) - currentEndpoint=preferredRelay; - MutexGuard m(endpointsMutex); - for(vector>::iterator itr=endpoints.begin();itr!=endpoints.end();){ - shared_ptr endpoint=*itr; - if(endpoint->type==Endpoint::TYPE_UDP_RELAY && useTCP){ - useTCP=false; - if(preferredRelay->type==Endpoint::TYPE_TCP_RELAY){ - preferredRelay=endpoint; - currentEndpoint=endpoint; - } - }else if(endpoint->type==Endpoint::TYPE_TCP_RELAY && endpoint->socket){ - endpoint->socket->Close(); - } - //if(endpoint->type==Endpoint::TYPE_UDP_P2P_INET){ - endpoint->averageRTT=0; - endpoint->rtts.Reset(); - //} - if(endpoint->type==Endpoint::TYPE_UDP_P2P_LAN){ - itr=endpoints.erase(itr); - }else{ - ++itr; - } - } - } - lastUdpPingTime=0; - if(proxyProtocol==PROXY_SOCKS5) - InitUDPProxy(); - if(allowP2p && currentEndpoint){ - SendPublicEndpointsRequest(); - } - BufferOutputStream s(4); - s.WriteInt32(dataSavingMode ? INIT_FLAG_DATA_SAVING_ENABLED : 0); - if(peerVersion<6){ - SendPacketReliably(PKT_NETWORK_CHANGED, s.GetBuffer(), s.GetLength(), 1, 20); - }else{ - Buffer buf(move(s)); - SendExtra(buf, EXTRA_TYPE_NETWORK_CHANGED); - } - selectCanceller->CancelSelect(); - didSendIPv6Endpoint=false; - AddIPv6Relays(); - ResetUdpAvailability(); - ResetEndpointPingStats(); - } - LOGI("set network type: %d, active interface %s", type, activeNetItfName.c_str()); +std::string VoIPController::NetworkTypeToString(int type){ + switch(type){ + case NET_TYPE_WIFI: + return "wifi"; + case NET_TYPE_GPRS: + return "gprs"; + case NET_TYPE_EDGE: + return "edge"; + case NET_TYPE_3G: + return "3g"; + case NET_TYPE_HSPA: + return "hspa"; + case NET_TYPE_LTE: + return "lte"; + case NET_TYPE_ETHERNET: + return "ethernet"; + case NET_TYPE_OTHER_HIGH_SPEED: + return "other_high_speed"; + case NET_TYPE_OTHER_LOW_SPEED: + return "other_low_speed"; + case NET_TYPE_DIALUP: + return "dialup"; + case NET_TYPE_OTHER_MOBILE: + return "other_mobile"; + default: + return "unknown"; + } +} + +std::string VoIPController::GetPacketTypeString(unsigned char type){ + switch(type){ + case PKT_INIT: + return "init"; + case PKT_INIT_ACK: + return "init_ack"; + case PKT_STREAM_STATE: + return "stream_state"; + case PKT_STREAM_DATA: + return "stream_data"; + case PKT_PING: + return "ping"; + case PKT_PONG: + return "pong"; + case PKT_LAN_ENDPOINT: + return "lan_endpoint"; + case PKT_NETWORK_CHANGED: + return "network_changed"; + case PKT_NOP: + return "nop"; + case PKT_STREAM_EC: + return "stream_ec"; + } + char buf[255]; + snprintf(buf, sizeof(buf), "unknown(%u)", type); + return string(buf); } void VoIPController::AddIPv6Relays(){ if(!myIPv6.IsEmpty() && !didAddIPv6Relays){ - unordered_map>> endpointsByAddress; + unordered_map> endpointsByAddress; MutexGuard m(endpointsMutex); - for(shared_ptr& e:endpoints){ - if((e->type==Endpoint::TYPE_UDP_RELAY || e->type==Endpoint::TYPE_TCP_RELAY) && !e->v6address.IsEmpty() && !e->address.IsEmpty()){ - endpointsByAddress[e->v6address.ToString()].push_back(e); - } - } - //int globalId=callID[15]; - for(unordered_map>>::iterator addr=endpointsByAddress.begin();addr!=endpointsByAddress.end();++addr){ - shared_ptr best=NULL; - //int bestDiff=256; - for(shared_ptr& e:addr->second){ - //int epId=(int) (e->id & 0xFF); - //int diff=abs(globalId-epId); - //if(diff v6only=make_shared(*best); - v6only->address=IPv4Address(0); - v6only->id=v6only->id ^ ((int64_t)(FOURCC('I','P','v','6')) << 32); - endpoints.push_back(v6only); - LOGD("Adding IPv6-only endpoint [%s]:%u", v6only->v6address.ToString().c_str(), v6only->port); - } + for(pair& _e:endpoints){ + Endpoint& e=_e.second; + if((e.type==Endpoint::Type::UDP_RELAY || e.type==Endpoint::Type::TCP_RELAY) && !e.v6address.IsEmpty() && !e.address.IsEmpty()){ + endpointsByAddress[e.v6address.ToString()].push_back(e); + } + } + for(pair>& addr:endpointsByAddress){ + for(Endpoint& e:addr.second){ + didAddIPv6Relays=true; + e.address=IPv4Address(0); + e.id=e.id ^ ((int64_t)(FOURCC('I','P','v','6')) << 32); + e.averageRTT=0; + e.lastPingSeq=0; + e.lastPingTime=0; + e.rtts.Reset(); + e.udpPongCount=0; + endpoints[e.id]=e; + LOGD("Adding IPv6-only endpoint [%s]:%u", e.v6address.ToString().c_str(), e.port); } } } @@ -2038,192 +3009,76 @@ void VoIPController::AddIPv6Relays(){ void VoIPController::AddTCPRelays(){ if(!didAddTcpRelays){ + bool wasSetCurrentToTCP=setCurrentEndpointToTCP; + LOGV("Adding TCP relays"); MutexGuard m(endpointsMutex); - vector> relays; - for(shared_ptr &e:endpoints){ - if(e->type!=Endpoint::TYPE_UDP_RELAY) + vector relays; + for(pair &_e:endpoints){ + Endpoint& e=_e.second; + if(e.type!=Endpoint::Type::UDP_RELAY) continue; - shared_ptr tcpRelay=make_shared(*e); - tcpRelay->type=Endpoint::TYPE_TCP_RELAY; - tcpRelay->averageRTT=0; - tcpRelay->lastPingSeq=0; - tcpRelay->lastPingTime=0; - tcpRelay->rtts.Reset(); - tcpRelay->udpPongCount=0; - tcpRelay->id=tcpRelay->id ^ ((int64_t) (FOURCC('T', 'C', 'P', 0)) << 32); - if(setCurrentEndpointToTCP && currentEndpoint->type!=Endpoint::TYPE_TCP_RELAY){ + if(wasSetCurrentToTCP && !useUDP){ + e.rtts.Reset(); + e.averageRTT=0; + e.lastPingSeq=0; + } + Endpoint tcpRelay(e); + tcpRelay.type=Endpoint::Type::TCP_RELAY; + tcpRelay.averageRTT=0; + tcpRelay.lastPingSeq=0; + tcpRelay.lastPingTime=0; + tcpRelay.rtts.Reset(); + tcpRelay.udpPongCount=0; + tcpRelay.id=tcpRelay.id ^ ((int64_t) (FOURCC('T', 'C', 'P', 0)) << 32); + if(setCurrentEndpointToTCP && endpoints.at(currentEndpoint).type!=Endpoint::Type::TCP_RELAY){ + LOGV("Setting current endpoint to TCP"); setCurrentEndpointToTCP=false; - currentEndpoint=tcpRelay; - preferredRelay=tcpRelay; + currentEndpoint=tcpRelay.id; + preferredRelay=tcpRelay.id; } relays.push_back(tcpRelay); } - endpoints.insert(endpoints.end(), relays.begin(), relays.end()); - didAddTcpRelays=true; - } -} - -double VoIPController::GetAverageRTT(){ - if(lastSentSeq>=lastRemoteAckSeq){ - uint32_t diff=lastSentSeq-lastRemoteAckSeq; - //LOGV("rtt diff=%u", diff); - if(diff<32){ - double res=0; - int count=0; - /*for(i=diff;i<32;i++){ - if(remoteAcks[i-diff]>0){ - res+=(remoteAcks[i-diff]-sentPacketTimes[i]); - count++; - } - }*/ - MutexGuard m(queuedPacketsMutex); - for(std::vector::iterator itr=recentOutgoingPackets.begin();itr!=recentOutgoingPackets.end();++itr){ - if(itr->ackTime>0){ - res+=(itr->ackTime-itr->sendTime); - count++; - } - } - if(count>0) - res/=count; - return res; - } - } - return 999; -} - -#if defined(__APPLE__) -static void initMachTimestart() { - mach_timebase_info_data_t tb = { 0, 0 }; - mach_timebase_info(&tb); - VoIPController::machTimebase = tb.numer; - VoIPController::machTimebase /= tb.denom; - VoIPController::machTimestart = mach_absolute_time(); -} -#endif - -double VoIPController::GetCurrentTime(){ -#if defined(__linux__) - struct timespec ts; - clock_gettime(CLOCK_MONOTONIC, &ts); - return ts.tv_sec+(double)ts.tv_nsec/1000000000.0; -#elif defined(__APPLE__) - static pthread_once_t token = PTHREAD_ONCE_INIT; - pthread_once(&token, &initMachTimestart); - return (mach_absolute_time() - machTimestart) * machTimebase / 1000000000.0f; -#elif defined(_WIN32) - if(!didInitWin32TimeScale){ - LARGE_INTEGER scale; - QueryPerformanceFrequency(&scale); - win32TimeScale=scale.QuadPart; - didInitWin32TimeScale=true; - } - LARGE_INTEGER t; - QueryPerformanceCounter(&t); - return (double)t.QuadPart/(double)win32TimeScale; -#endif -} - -void VoIPController::SetState(int state){ - this->state=state; - LOGV("Call state changed to %d", state); - stateChangeTime=GetCurrentTime(); - messageThread.Post([this, state]{ - if(callbacks.connectionStateChanged) - callbacks.connectionStateChanged(this, state); - }); - if(state==STATE_ESTABLISHED){ - SetMicMute(micMuted); - if(!wasEstablished){ - wasEstablished=true; - messageThread.Post(std::bind(&VoIPController::UpdateRTT, this), 0.1, 0.5); - messageThread.Post(std::bind(&VoIPController::UpdateAudioBitrate, this), 0.0, 0.3); - messageThread.Post(std::bind(&VoIPController::UpdateCongestion, this), 0.0, 1.0); - messageThread.Post(std::bind(&VoIPController::UpdateSignalBars, this), 1.0, 1.0); - messageThread.Post(std::bind(&VoIPController::TickJitterBufferAngCongestionControl, this), 0.0, 0.1); - } - } -} - - -void VoIPController::SetMicMute(bool mute){ - if(micMuted==mute) - return; - micMuted=mute; - if(audioInput){ - if(mute) - audioInput->Stop(); - else - audioInput->Start(); - if(!audioInput->IsInitialized()){ - lastError=ERROR_AUDIO_IO; - SetState(STATE_FAILED); - return; - } - } - if(echoCanceller) - echoCanceller->Enable(!mute); - if(state==STATE_ESTABLISHED){ - for(shared_ptr& s:outgoingStreams){ - if(s->type==STREAM_TYPE_AUDIO){ - s->enabled=!mute; - if(peerVersion<6){ - unsigned char buf[2]; - buf[0]=s->id; - buf[1]=(char) (mute ? 0 : 1); - SendPacketReliably(PKT_STREAM_STATE, buf, 2, .5f, 20); - }else{ - SendStreamFlags(*s); - } - } - } - } - if(mute){ - if(noStreamsNopID==MessageThread::INVALID_ID) - noStreamsNopID=messageThread.Post(std::bind(&VoIPController::SendNopPacket, this), 0.2, 0.2); - }else{ - if(noStreamsNopID!=MessageThread::INVALID_ID){ - messageThread.Cancel(noStreamsNopID); - noStreamsNopID=MessageThread::INVALID_ID; - } - } -} - - -void VoIPController::UpdateAudioOutputState(){ - bool areAnyAudioStreamsEnabled=false; - for(vector>::iterator s=incomingStreams.begin();s!=incomingStreams.end();++s){ - if((*s)->type==STREAM_TYPE_AUDIO && (*s)->enabled) - areAnyAudioStreamsEnabled=true; - } - /*if(jitterBuffer){ - jitterBuffer->Reset(); - } - if(decoder){ - decoder->ResetQueue(); - }*/ - if(audioOutput){ - if(audioOutput->IsPlaying()!=areAnyAudioStreamsEnabled){ - if(areAnyAudioStreamsEnabled) - audioOutput->Start(); - else - audioOutput->Stop(); - } + for(Endpoint& e:relays){ + endpoints[e.id]=move(e); + } + didAddTcpRelays=true; } } -void VoIPController::SendStreamFlags(Stream& stream){ - BufferOutputStream s(5); - s.WriteByte(stream.id); - uint32_t flags=0; - if(stream.enabled) - flags|=STREAM_FLAG_ENABLED; - if(stream.extraECEnabled) - flags|=STREAM_FLAG_EXTRA_EC; - s.WriteInt32(flags); - Buffer buf(move(s)); - SendExtra(buf, EXTRA_TYPE_STREAM_FLAGS); +#if defined(__APPLE__) +static void initMachTimestart() { + mach_timebase_info_data_t tb = { 0, 0 }; + mach_timebase_info(&tb); + VoIPController::machTimebase = tb.numer; + VoIPController::machTimebase /= tb.denom; + VoIPController::machTimestart = mach_absolute_time(); +} +#endif + +double VoIPController::GetCurrentTime(){ +#if defined(__linux__) + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return ts.tv_sec+(double)ts.tv_nsec/1000000000.0; +#elif defined(__APPLE__) + static pthread_once_t token = PTHREAD_ONCE_INIT; + pthread_once(&token, &initMachTimestart); + return (mach_absolute_time() - machTimestart) * machTimebase / 1000000000.0f; +#elif defined(_WIN32) + if(!didInitWin32TimeScale){ + LARGE_INTEGER scale; + QueryPerformanceFrequency(&scale); + win32TimeScale=scale.QuadPart; + didInitWin32TimeScale=true; + } + LARGE_INTEGER t; + QueryPerformanceCounter(&t); + return (double)t.QuadPart/(double)win32TimeScale; +#endif } + + void VoIPController::KDF(unsigned char* msgKey, size_t x, unsigned char* aesKey, unsigned char* aesIv){ uint8_t sA[SHA1_LENGTH], sB[SHA1_LENGTH], sC[SHA1_LENGTH], sD[SHA1_LENGTH]; BufferOutputStream buf(128); @@ -2280,74 +3135,8 @@ void VoIPController::KDF2(unsigned char* msgKey, size_t x, unsigned char *aesKey memcpy(aesIv, buf.GetBuffer(), 32); } -string VoIPController::GetDebugString(){ - string r="Remote endpoints: \n"; - char buffer[2048]; - MutexGuard m(endpointsMutex); - for(shared_ptr& endpoint:endpoints){ - const char* type; - switch(endpoint->type){ - case Endpoint::TYPE_UDP_P2P_INET: - type="UDP_P2P_INET"; - break; - case Endpoint::TYPE_UDP_P2P_LAN: - type="UDP_P2P_LAN"; - break; - case Endpoint::TYPE_UDP_RELAY: - type="UDP_RELAY"; - break; - case Endpoint::TYPE_TCP_RELAY: - type="TCP_RELAY"; - break; - default: - type="UNKNOWN"; - break; - } - snprintf(buffer, sizeof(buffer), "%s:%u %dms %d 0x%" PRIx64 " [%s%s]\n", endpoint->address.IsEmpty() ? ("["+endpoint->v6address.ToString()+"]").c_str() : endpoint->address.ToString().c_str(), endpoint->port, (int)(endpoint->averageRTT*1000), endpoint->udpPongCount, (uint64_t)endpoint->id, type, currentEndpoint==endpoint ? ", IN_USE" : ""); - r+=buffer; - } - if(shittyInternetMode){ - r+="ShittyInternetMode enabled\n"; - } - double avgLate[3]; - shared_ptr jitterBuffer=incomingStreams.size()==1 ? incomingStreams[0]->jitterBuffer : NULL; - if(jitterBuffer) - jitterBuffer->GetAverageLateCount(avgLate); - else - memset(avgLate, 0, 3*sizeof(double)); - snprintf(buffer, sizeof(buffer), - "Jitter buffer: %d/%.2f | %.1f, %.1f, %.1f\n" - "RTT avg/min: %d/%d\n" - "Congestion window: %d/%d bytes\n" - "Key fingerprint: %02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%s\n" - "Last sent/ack'd seq: %u/%u\n" - "Last recvd seq: %u\n" - "Send/recv losses: %u/%u (%d%%)\n" - "Audio bitrate: %d kbit\n" - "Outgoing queue: %u\n" -// "Packet grouping: %d\n" - "Frame size out/in: %d/%d\n" - "Bytes sent/recvd: %llu/%llu", - jitterBuffer ? jitterBuffer->GetMinPacketCount() : 0, jitterBuffer ? jitterBuffer->GetAverageDelay() : 0, avgLate[0], avgLate[1], avgLate[2], - // (int)(GetAverageRTT()*1000), 0, - (int)(conctl->GetAverageRTT()*1000), (int)(conctl->GetMinimumRTT()*1000), - int(conctl->GetInflightDataSize()), int(conctl->GetCongestionWindow()), - keyFingerprint[0],keyFingerprint[1],keyFingerprint[2],keyFingerprint[3],keyFingerprint[4],keyFingerprint[5],keyFingerprint[6],keyFingerprint[7], - useMTProto2 ? " (MTProto2.0)" : "", - lastSentSeq, lastRemoteAckSeq, lastRemoteSeq, - conctl->GetSendLossCount(), recvLossCount, encoder ? encoder->GetPacketLoss() : 0, - encoder ? (encoder->GetBitrate()/1000) : 0, - static_cast(unsentStreamPackets), -// audioPacketGrouping, - outgoingStreams[0]->frameDuration, incomingStreams.size()>0 ? incomingStreams[0]->frameDuration : 0, - (long long unsigned int)(stats.bytesSentMobile+stats.bytesSentWifi), - (long long unsigned int)(stats.bytesRecvdMobile+stats.bytesRecvdWifi)); - r+=buffer; - return r; -} - -void VoIPController::SendPublicEndpointsRequest(Endpoint& relay){ +void VoIPController::SendPublicEndpointsRequest(const Endpoint& relay){ if(!useUDP) return; LOGD("Sending public endpoints request to %s:%d", relay.address.ToString().c_str(), relay.port); @@ -2365,22 +3154,14 @@ void VoIPController::SendPublicEndpointsRequest(Endpoint& relay){ udpSocket->Send(&pkt); } -shared_ptr VoIPController::GetEndpointByType(int type){ - if(type==Endpoint::TYPE_UDP_RELAY && preferredRelay) - return preferredRelay; - for(shared_ptr& e:endpoints){ - if(e->type==type) - return e; - } - return NULL; -} - -shared_ptr VoIPController::GetEndpointByID(int64_t id){ - for(shared_ptr& e:endpoints){ - if(e->id==id) - return e; +Endpoint& VoIPController::GetEndpointByType(int type){ + if(type==Endpoint::Type::UDP_RELAY && preferredRelay) + return endpoints.at(preferredRelay); + for(pair& e:endpoints){ + if(e.second.type==type) + return e.second; } - return NULL; + throw out_of_range("no endpoint"); } @@ -2390,7 +3171,7 @@ void VoIPController::SendPacketReliably(unsigned char type, unsigned char *data, if(data){ Buffer b(len); b.CopyFrom(data, 0, len); - pkt={move(b)}; + pkt.data=move(b); } pkt.type=type; pkt.retryInterval=retryInterval; @@ -2403,474 +3184,282 @@ void VoIPController::SendPacketReliably(unsigned char type, unsigned char *data, } messageThread.Post(std::bind(&VoIPController::UpdateQueuedPackets, this)); if(timeout>0.0){ - messageThread.Post(std::bind(&VoIPController::UpdateQueuedPackets, this), timeout); - } -} - -void VoIPController::SendExtra(Buffer &data, unsigned char type){ - MutexGuard m(queuedPacketsMutex); - LOGV("Sending extra type %u length %lu", type, data.Length()); - for(vector::iterator x=currentExtras.begin();x!=currentExtras.end();++x){ - if(x->type==type){ - x->firstContainingSeq=0; - x->data=move(data); - return; - } - } - UnacknowledgedExtraData xd={type, move(data), 0}; - currentExtras.push_back(move(xd)); -} - - -void VoIPController::SetConfig(const Config& cfg){ - config=cfg; - if(tgvoipLogFile){ - fclose(tgvoipLogFile); - tgvoipLogFile=NULL; - } - if(!config.logFilePath.empty()){ -#ifndef _WIN32 - tgvoipLogFile=fopen(config.logFilePath.c_str(), "a"); -#else - if(_wfopen_s(&tgvoipLogFile, config.logFilePath.c_str(), L"a")!=0){ - tgvoipLogFile=NULL; - } -#endif - tgvoip_log_file_write_header(tgvoipLogFile); - }else{ - tgvoipLogFile=NULL; - } - if(statsDump){ - fclose(statsDump); - statsDump=NULL; - } - if(!config.statsDumpFilePath.empty()){ -#ifndef _WIN32 - statsDump=fopen(config.statsDumpFilePath.c_str(), "w"); -#else - if(_wfopen_s(&statsDump, config.statsDumpFilePath.c_str(), L"w")!=0){ - statsDump=NULL; - } -#endif - if(statsDump) - fprintf(statsDump, "Time\tRTT\tLRSeq\tLSSeq\tLASeq\tLostR\tLostS\tCWnd\tBitrate\tLoss%%\tJitter\tJDelay\tAJDelay\n"); - //else - // LOGW("Failed to open stats dump file %s for writing", config.statsDumpFilePath.c_str()); - }else{ - statsDump=NULL; - } - UpdateDataSavingState(); - UpdateAudioBitrateLimit(); -} - - -void VoIPController::UpdateDataSavingState(){ - if(config.dataSaving==DATA_SAVING_ALWAYS){ - dataSavingMode=true; - }else if(config.dataSaving==DATA_SAVING_MOBILE){ - dataSavingMode=networkType==NET_TYPE_GPRS || networkType==NET_TYPE_EDGE || - networkType==NET_TYPE_3G || networkType==NET_TYPE_HSPA || networkType==NET_TYPE_LTE || networkType==NET_TYPE_OTHER_MOBILE; - }else{ - dataSavingMode=false; - } - LOGI("update data saving mode, config %d, enabled %d, reqd by peer %d", config.dataSaving, dataSavingMode, dataSavingRequestedByPeer); -} - - -void VoIPController::DebugCtl(int request, int param){ - if(request==1){ // set bitrate - maxBitrate=param; - if(encoder){ - encoder->SetBitrate(maxBitrate); - } - }else if(request==2){ // set packet loss - if(encoder){ - encoder->SetPacketLoss(param); - } - }else if(request==3){ // force enable/disable p2p - allowP2p=param==1; - if(!allowP2p && currentEndpoint && currentEndpoint->type!=Endpoint::TYPE_UDP_RELAY){ - currentEndpoint=preferredRelay; - }else if(allowP2p){ - SendPublicEndpointsRequest(); - } - BufferOutputStream s(4); - s.WriteInt32(dataSavingMode ? INIT_FLAG_DATA_SAVING_ENABLED : 0); - SendPacketReliably(PKT_NETWORK_CHANGED, s.GetBuffer(), s.GetLength(), 1, 20); - }else if(request==4){ - if(echoCanceller) - echoCanceller->Enable(param==1); - } -} - - -const char* VoIPController::GetVersion(){ - return LIBTGVOIP_VERSION; -} - - -int64_t VoIPController::GetPreferredRelayID(){ - if(preferredRelay) - return preferredRelay->id; - return 0; -} - - -int VoIPController::GetLastError(){ - return lastError; -} - - -void VoIPController::GetStats(TrafficStats *stats){ - memcpy(stats, &this->stats, sizeof(TrafficStats)); -} - -#ifdef TGVOIP_USE_AUDIO_SESSION -void VoIPController::SetAcquireAudioSession(void (^completion)(void (^)())) { - this->acquireAudioSession = [completion copy]; -} - -void VoIPController::ReleaseAudioSession(void (^completion)()) { - completion(); -} -#endif - -void VoIPController::LogDebugInfo(){ - string json="{\"endpoints\":["; - for(vector>::iterator itr=endpoints.begin();itr!=endpoints.end();++itr){ - shared_ptr e=*itr; - char buffer[1024]; - const char* typeStr="unknown"; - switch(e->type){ - case Endpoint::TYPE_UDP_RELAY: - typeStr="udp_relay"; - break; - case Endpoint::TYPE_UDP_P2P_INET: - typeStr="udp_p2p_inet"; - break; - case Endpoint::TYPE_UDP_P2P_LAN: - typeStr="udp_p2p_lan"; - break; - case Endpoint::TYPE_TCP_RELAY: - typeStr="tcp_relay"; - break; - } - snprintf(buffer, 1024, "{\"address\":\"%s\",\"port\":%u,\"type\":\"%s\",\"rtt\":%u%s%s}", e->address.ToString().c_str(), e->port, typeStr, (unsigned int)round(e->averageRTT*1000), currentEndpoint==e ? ",\"in_use\":true" : "", preferredRelay==e ? ",\"preferred\":true" : ""); - json+=buffer; - if(itr!=endpoints.end()-1) - json+=","; - } - json+="],"; - char buffer[1024]; - const char* netTypeStr; - switch(networkType){ - case NET_TYPE_WIFI: - netTypeStr="wifi"; - break; - case NET_TYPE_GPRS: - netTypeStr="gprs"; - break; - case NET_TYPE_EDGE: - netTypeStr="edge"; - break; - case NET_TYPE_3G: - netTypeStr="3g"; - break; - case NET_TYPE_HSPA: - netTypeStr="hspa"; - break; - case NET_TYPE_LTE: - netTypeStr="lte"; - break; - case NET_TYPE_ETHERNET: - netTypeStr="ethernet"; - break; - case NET_TYPE_OTHER_HIGH_SPEED: - netTypeStr="other_high_speed"; - break; - case NET_TYPE_OTHER_LOW_SPEED: - netTypeStr="other_low_speed"; - break; - case NET_TYPE_DIALUP: - netTypeStr="dialup"; - break; - case NET_TYPE_OTHER_MOBILE: - netTypeStr="other_mobile"; - break; - default: - netTypeStr="unknown"; - break; - } - snprintf(buffer, 1024, "\"time\":%u,\"network_type\":\"%s\"}", (unsigned int)time(NULL), netTypeStr); - json+=buffer; - debugLogs.push_back(json); -} - -string VoIPController::GetDebugLog(){ - string log="{\"events\":["; - - for(vector::iterator itr=debugLogs.begin();itr!=debugLogs.end();++itr){ - log+=(*itr); - if((itr+1)!=debugLogs.end()) - log+=","; - } - log+="],\"libtgvoip_version\":\"" LIBTGVOIP_VERSION "\"}"; - return log; -} - -void VoIPController::GetDebugLog(char *buffer){ - strcpy(buffer, GetDebugLog().c_str()); -} - -size_t VoIPController::GetDebugLogLength(){ - size_t len=128; - for(vector::iterator itr=debugLogs.begin();itr!=debugLogs.end();++itr){ - len+=(*itr).length()+1; - } - return len; -} - -vector VoIPController::EnumerateAudioInputs(){ - vector devs; - audio::AudioInput::EnumerateDevices(devs); - return devs; -} - -vector VoIPController::EnumerateAudioOutputs(){ - vector devs; - audio::AudioOutput::EnumerateDevices(devs); - return devs; + messageThread.Post(std::bind(&VoIPController::UpdateQueuedPackets, this), timeout); + } } -void VoIPController::SetCurrentAudioInput(string id){ - currentAudioInput=id; - if(audioInput) - audioInput->SetCurrentDevice(id); +void VoIPController::SendExtra(Buffer &data, unsigned char type){ + MutexGuard m(queuedPacketsMutex); + LOGV("Sending extra type %u length %lu", type, data.Length()); + for(vector::iterator x=currentExtras.begin();x!=currentExtras.end();++x){ + if(x->type==type){ + x->firstContainingSeq=0; + x->data=move(data); + return; + } + } + UnacknowledgedExtraData xd={type, move(data), 0}; + currentExtras.push_back(move(xd)); } -void VoIPController::SetCurrentAudioOutput(string id){ - currentAudioOutput=id; - if(audioOutput) - audioOutput->SetCurrentDevice(id); -} -string VoIPController::GetCurrentAudioInputID(){ - return currentAudioInput; -} -string VoIPController::GetCurrentAudioOutputID(){ - return currentAudioOutput; -} -void VoIPController::SetProxy(int protocol, string address, uint16_t port, string username, string password){ - proxyProtocol=protocol; - proxyAddress=address; - proxyPort=port; - proxyUsername=username; - proxyPassword=password; + +void VoIPController::DebugCtl(int request, int param){ + if(request==1){ // set bitrate + maxBitrate=param; + if(encoder){ + encoder->SetBitrate(maxBitrate); + } + }else if(request==2){ // set packet loss + if(encoder){ + encoder->SetPacketLoss(param); + } + }else if(request==3){ // force enable/disable p2p + allowP2p=param==1; + /*if(!allowP2p && currentEndpoint && currentEndpoint->type!=Endpoint::Type::UDP_RELAY){ + currentEndpoint=preferredRelay; + }else if(allowP2p){ + SendPublicEndpointsRequest(); + }*/ + BufferOutputStream s(4); + s.WriteInt32(dataSavingMode ? INIT_FLAG_DATA_SAVING_ENABLED : 0); + SendPacketReliably(PKT_NETWORK_CHANGED, s.GetBuffer(), s.GetLength(), 1, 20); + }else if(request==4){ + if(echoCanceller) + echoCanceller->Enable(param==1); + } } -void VoIPController::SendUdpPing(shared_ptr endpoint){ - if(endpoint->type!=Endpoint::TYPE_UDP_RELAY) +void VoIPController::SendUdpPing(Endpoint& endpoint){ + if(endpoint.type!=Endpoint::Type::UDP_RELAY) return; - LOGV("Sending UDP ping to %s:%d", endpoint->GetAddress().ToString().c_str(), endpoint->port); BufferOutputStream p(1024); - p.WriteBytes(endpoint->peerTag, 16); + p.WriteBytes(endpoint.peerTag, 16); p.WriteInt32(-1); p.WriteInt32(-1); p.WriteInt32(-1); p.WriteInt32(-2); - p.WriteInt64(12345); + int64_t id; + crypto.rand_bytes(reinterpret_cast(&id), 8); + p.WriteInt64(id); NetworkPacket pkt={0}; - pkt.address=&endpoint->GetAddress(); - pkt.port=endpoint->port; + pkt.address=&endpoint.GetAddress(); + pkt.port=endpoint.port; pkt.protocol=PROTO_UDP; pkt.data=p.GetBuffer(); pkt.length=p.GetLength(); udpSocket->Send(&pkt); + LOGV("Sending UDP ping to %s:%d, id %" PRId64, endpoint.GetAddress().ToString().c_str(), endpoint.port, id); } -void VoIPController::StartAudio(){ - shared_ptr& outgoingAudioStream=outgoingStreams[0]; - LOGI("before create audio io"); -#if defined(TGVOIP_USE_SOFTWARE_AUDIO) - audioInput = softwareMediaInput; - audioOutput = softwareMediaOutput; -#else - audioIO=audio::AudioIO::Create(); - audioInput=audioIO->GetInput(); - audioOutput=audioIO->GetOutput(); -#endif - LOGI("AEC: %d NS: %d AGC: %d", config.enableAEC, config.enableNS, config.enableAGC); - echoCanceller=new EchoCanceller(config.enableAEC, config.enableNS, config.enableAGC); - encoder=new OpusEncoder(audioInput, peerVersion>=6); - encoder->SetCallback(AudioInputCallback, this); - encoder->SetOutputFrameDuration(outgoingAudioStream->frameDuration); - encoder->SetEchoCanceller(echoCanceller); - encoder->SetSecondaryEncoderEnabled(false); - -#if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) - dynamic_cast(audioInput)->SetDataCallback(audioInputDataCallback); - dynamic_cast(audioOutput)->SetDataCallback(audioOutputDataCallback); -#endif - - if(!audioOutput->IsInitialized()){ - LOGE("Erorr initializing audio playback"); - lastError=ERROR_AUDIO_IO; - - SetState(STATE_FAILED); - return; +void VoIPController::ResetUdpAvailability(){ + LOGI("Resetting UDP availability"); + if(udpPingTimeoutID!=MessageThread::INVALID_ID){ + messageThread.Cancel(udpPingTimeoutID); } - UpdateAudioBitrateLimit(); - - /*voip_stream_t* incomingAudioStream=incomingStreams[0]; - jitterBuffer=new JitterBuffer(NULL, incomingAudioStream->frameDuration); - decoder=new OpusDecoder(audioOutput); - decoder->SetEchoCanceller(echoCanceller); - decoder->SetJitterBuffer(jitterBuffer); - decoder->SetFrameDuration(incomingAudioStream->frameDuration); - decoder->Start(); - if(incomingAudioStream->frameDuration>50) - jitterBuffer->SetMinPacketCount((uint32_t) ServerConfig::GetSharedInstance()->GetInt("jitter_initial_delay_60", 3)); - else if(incomingAudioStream->frameDuration>30) - jitterBuffer->SetMinPacketCount((uint32_t) ServerConfig::GetSharedInstance()->GetInt("jitter_initial_delay_40", 4)); - else - jitterBuffer->SetMinPacketCount((uint32_t) ServerConfig::GetSharedInstance()->GetInt("jitter_initial_delay_20", 6));*/ - //audioOutput->Start(); - OnAudioOutputReady(); - - encoder->Start(); - if(!micMuted){ - audioInput->Start(); - if(!audioInput->IsInitialized()){ - LOGE("Erorr initializing audio capture"); - lastError=ERROR_AUDIO_IO; - - SetState(STATE_FAILED); - return; + { + MutexGuard m(endpointsMutex); + for(pair& e:endpoints){ + e.second.udpPongCount=0; } } + udpPingCount=0; + udpConnectivityState=UDP_PING_PENDING; + udpPingTimeoutID=messageThread.Post(std::bind(&VoIPController::SendUdpPings, this), 0.0, 0.5); } -void VoIPController::OnAudioOutputReady(){ - LOGI("Audio I/O ready"); - shared_ptr& stm=incomingStreams[0]; - outputAGC=new AutomaticGainControl(); - outputAGC->SetPassThrough(!outputAGCEnabled); - stm->decoder=make_shared(audioOutput, true, peerVersion>=6); - stm->decoder->AddAudioEffect(outputAGC); - stm->decoder->SetEchoCanceller(echoCanceller); - stm->decoder->SetJitterBuffer(stm->jitterBuffer); - stm->decoder->SetFrameDuration(stm->frameDuration); - stm->decoder->Start(); -} - -int VoIPController::GetSignalBarsCount(){ - return signalBarsHistory.NonZeroAverage(); +void VoIPController::ResetEndpointPingStats(){ + MutexGuard m(endpointsMutex); + for(pair& e:endpoints){ + e.second.averageRTT=0.0; + e.second.rtts.Reset(); + } } -void VoIPController::SetCallbacks(VoIPController::Callbacks callbacks){ - this->callbacks=callbacks; - if(callbacks.connectionStateChanged) - callbacks.connectionStateChanged(this, state); -} -void VoIPController::SetAudioOutputGainControlEnabled(bool enabled){ - LOGD("New output AGC state: %d", enabled); - outputAGCEnabled=enabled; - if(outputAGC) - outputAGC->SetPassThrough(!enabled); -} -uint32_t VoIPController::GetPeerCapabilities(){ - return peerCapabilities; -} +#pragma mark - Video -void VoIPController::SendGroupCallKey(unsigned char *key){ - if(!(peerCapabilities & TGVOIP_PEER_CAP_GROUP_CALLS)){ - LOGE("Tried to send group call key but peer isn't capable of them"); - return; - } - if(didSendGroupCallKey){ - LOGE("Tried to send a group call key repeatedly"); - return; +void VoIPController::SetVideoSource(video::VideoSource *source){ + if(videoSource){ + videoSource->Stop(); + videoSource->SetCallback(nullptr); } - if(!isOutgoing){ - LOGE("You aren't supposed to send group call key in an incoming call, use VoIPController::RequestCallUpgrade() instead"); - return; + videoSource=source; + shared_ptr stm=GetStreamByType(STREAM_TYPE_VIDEO, true); + if(videoSource){ + if(!stm->enabled){ + stm->enabled=true; + SendStreamFlags(*stm); + } + videoSource->Reset(stm->codec, min(peerMaxVideoResolution, INIT_VIDEO_RES_1080)); + videoSource->Start(); + videoSource->SetCallback(bind(&VoIPController::SendVideoFrame, this, placeholders::_1, placeholders::_2)); + }else{ + if(stm->enabled){ + stm->enabled=false; + SendStreamFlags(*stm); + } } - didSendGroupCallKey=true; - Buffer buf(256); - buf.CopyFrom(key, 0, 256); - SendExtra(buf, EXTRA_TYPE_GROUP_CALL_KEY); } -void VoIPController::RequestCallUpgrade(){ - if(!(peerCapabilities & TGVOIP_PEER_CAP_GROUP_CALLS)){ - LOGE("Tried to send group call key but peer isn't capable of them"); - return; - } - if(didSendUpgradeRequest){ - LOGE("Tried to send upgrade request repeatedly"); - return; - } - if(isOutgoing){ - LOGE("You aren't supposed to send an upgrade request in an outgoing call, generate an encryption key and use VoIPController::SendGroupCallKey instead"); - return; - } - didSendUpgradeRequest=true; - Buffer empty(0); - SendExtra(empty, EXTRA_TYPE_REQUEST_GROUP); +void VoIPController::SetVideoRenderer(video::VideoRenderer *renderer){ + videoRenderer=renderer; } -void VoIPController::SetEchoCancellationStrength(int strength){ - echoCancellationStrength=strength; - if(echoCanceller) - echoCanceller->SetAECStrength(strength); +void VoIPController::SetVideoCodecSpecificData(const std::vector& data){ + outgoingStreams[1]->codecSpecificData.clear(); + for(const Buffer& csd:data){ + outgoingStreams[1]->codecSpecificData.push_back(Buffer::CopyOf(csd)); + } + LOGI("Set outgoing video stream CSD"); } -void VoIPController::ResetUdpAvailability(){ - LOGI("Resetting UDP availability"); - if(udpPingTimeoutID!=MessageThread::INVALID_ID){ - messageThread.Cancel(udpPingTimeoutID); - } - { - MutexGuard m(endpointsMutex); - for(shared_ptr& e:endpoints){ - e->udpPongCount=0; +void VoIPController::SendVideoFrame(const Buffer &frame, uint32_t flags){ + LOGI("Send video frame %u flags %u", (unsigned int)frame.Length(), flags); + shared_ptr stm=GetStreamByType(STREAM_TYPE_VIDEO, true); + if(stm){ + if(firstVideoFrameTime==0.0) + firstVideoFrameTime=GetCurrentTime(); + + if(videoKeyframeRequested){ + if(flags & VIDEO_FRAME_FLAG_KEYFRAME){ + sentVideoFrames.clear(); + videoKeyframeRequested=false; + }else{ + LOGV("Dropping input video frame waiting for key frame"); + return; + } } - } - udpPingCount=0; - udpConnectivityState=UDP_PING_PENDING; - udpPingTimeoutID=messageThread.Post(std::bind(&VoIPController::SendUdpPings, this), 0.0, 0.5); -} -void VoIPController::ResetEndpointPingStats(){ - MutexGuard m(endpointsMutex); - for(shared_ptr& e:endpoints){ - e->averageRTT=0.0; - e->rtts.Reset(); + uint32_t pts=videoFrameCount++; + if(!stm->csdIsValid){ + vector& csd=videoSource->GetCodecSpecificData(); + stm->codecSpecificData.clear(); + for(Buffer& b:csd){ + stm->codecSpecificData.push_back(Buffer::CopyOf(b)); + } + stm->csdIsValid=true; + stm->width=videoSource->GetFrameWidth(); + stm->height=videoSource->GetFrameHeight(); + SendStreamCSD(*stm); + } + + size_t segmentCount=frame.Length()/1024; + if(frame.Length()%1024>0) + segmentCount++; + SentVideoFrame sentFrame; + sentFrame.num=pts; + sentFrame.fragmentCount=static_cast(segmentCount); + for(size_t seg=0;segid | pflags)); // streamID + flags + int16_t lengthAndFlags=static_cast(len & 0x7FF); + if(segmentCount>1) + lengthAndFlags |= STREAM_DATA_XFLAG_FRAGMENTED; + if(flags & VIDEO_FRAME_FLAG_KEYFRAME) + lengthAndFlags |= STREAM_DATA_XFLAG_KEYFRAME; + pkt.WriteInt16(lengthAndFlags); + //pkt.WriteInt32(audioTimestampOut); + pkt.WriteInt32(pts); + if(segmentCount>1){ + pkt.WriteByte((unsigned char)seg); + pkt.WriteByte((unsigned char)segmentCount); + } + //LOGV("Sending segment %u of %u", (unsigned int)seg, (unsigned int)segmentCount); + pkt.WriteBytes(frame, offset, len); + unsentStreamPackets++; + + uint32_t seq=GenerateOutSeq(); + PendingOutgoingPacket p{ + /*.seq=*/seq, + /*.type=*/PKT_STREAM_DATA, + /*.len=*/pkt.GetLength(), + /*.data=*/Buffer(move(pkt)), + /*.endpoint=*/0, + }; + SendOrEnqueuePacket(move(p)); + sentFrame.unacknowledgedPackets.push_back(seq); + } + MutexGuard m(sentVideoFramesMutex); + sentVideoFrames.push_back(sentFrame); + } +} + +void VoIPController::SendStreamCSD(VoIPController::Stream &stream){ + assert(stream.csdIsValid); + + BufferOutputStream os(256); + os.WriteByte(stream.id); + os.WriteInt16((int16_t)stream.width); + os.WriteInt16((int16_t)stream.height); + os.WriteByte(static_cast(stream.codecSpecificData.size())); + for(Buffer& b:stream.codecSpecificData){ + assert(b.Length()<255); + os.WriteByte(static_cast(b.Length())); + os.WriteBytes(b); + } + Buffer buf(move(os)); + SendExtra(buf, EXTRA_TYPE_STREAM_CSD); +} + +void VoIPController::ProcessIncomingVideoFrame(Buffer frame, uint32_t pts, bool keyframe){ + //LOGI("Incoming video frame size %u pts %u", (unsigned int)frame.Length(), pts); + if(frame.Length()==0){ + LOGE("EMPTY FRAME"); + } + if(videoRenderer){ + shared_ptr stm=GetStreamByType(STREAM_TYPE_VIDEO, false); + if(!stm->csdIsValid){ + videoRenderer->Reset(stm->codec, stm->width, stm->height, stm->codecSpecificData); + stm->csdIsValid=true; + } + if(lastReceivedVideoFrameNumber==UINT32_MAX || lastReceivedVideoFrameNumber==pts-1 || keyframe){ + lastReceivedVideoFrameNumber=pts; + //LOGV("3 before decode %u", (unsigned int)frame.Length()); + videoRenderer->DecodeAndDisplay(move(frame), pts); + }else{ + LOGW("Skipping non-keyframe after packet loss..."); + } } } -#if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) -void VoIPController::SetAudioDataCallbacks(std::function input, std::function output){ - audioInputDataCallback=input; - audioOutputDataCallback=output; -} -#endif +void VoIPController::SetupOutgoingVideoStream(){ + vector myEncoders=video::VideoSource::GetAvailableEncoders(); + shared_ptr vstm=make_shared(); + vstm->id=2; + vstm->type=STREAM_TYPE_VIDEO; -int VoIPController::GetConnectionState(){ - return state; + if(find(myEncoders.begin(), myEncoders.end(), CODEC_HEVC)!=myEncoders.end() && find(peerVideoDecoders.begin(), peerVideoDecoders.end(), CODEC_HEVC)!=peerVideoDecoders.end()){ + vstm->codec=CODEC_HEVC; + }else if(find(myEncoders.begin(), myEncoders.end(), CODEC_AVC)!=myEncoders.end() && find(peerVideoDecoders.begin(), peerVideoDecoders.end(), CODEC_AVC)!=peerVideoDecoders.end()){ + vstm->codec=CODEC_AVC; + }else if(find(myEncoders.begin(), myEncoders.end(), CODEC_VP8)!=myEncoders.end() && find(peerVideoDecoders.begin(), peerVideoDecoders.end(), CODEC_VP8)!=peerVideoDecoders.end()){ + vstm->codec=CODEC_VP8; + }else{ + LOGW("Can't setup outgoing video stream: no codecs in common"); + return; + } + + vstm->enabled=false; + outgoingStreams.push_back(vstm); } #pragma mark - Timer methods void VoIPController::SendUdpPings(){ - for(shared_ptr& e:endpoints){ - if(e->type==Endpoint::TYPE_UDP_RELAY){ - SendUdpPing(e); + LOGW("Send udp pings"); + MutexGuard m(endpointsMutex); + for(pair& e:endpoints){ + if(e.second.type==Endpoint::Type::UDP_RELAY){ + SendUdpPing(e.second); } } if(udpConnectivityState==UDP_UNKNOWN || udpConnectivityState==UDP_PING_PENDING) @@ -2885,10 +3474,11 @@ void VoIPController::SendUdpPings(){ void VoIPController::EvaluateUdpPingResults(){ double avgPongs=0; int count=0; - for(shared_ptr& e:endpoints){ - if(e->type==Endpoint::TYPE_UDP_RELAY){ - if(e->udpPongCount>0){ - avgPongs+=(double) e->udpPongCount; + for(pair& _e:endpoints){ + Endpoint& e=_e.second; + if(e.type==Endpoint::Type::UDP_RELAY){ + if(e.udpPongCount>0){ + avgPongs+=(double) e.udpPongCount; count++; } } @@ -2898,21 +3488,36 @@ void VoIPController::EvaluateUdpPingResults(){ else avgPongs=0.0; LOGI("UDP ping reply count: %.2f", avgPongs); + if(avgPongs==0.0 && proxyProtocol==PROXY_SOCKS5 && udpSocket!=realUdpSocket){ + LOGI("Proxy does not let UDP through, closing proxy connection and using UDP directly"); + NetworkSocket* proxySocket=udpSocket; + proxySocket->Close(); + udpSocket=realUdpSocket; + selectCanceller->CancelSelect(); + delete proxySocket; + proxySupportsUDP=false; + ResetUdpAvailability(); + return; + } bool configUseTCP=ServerConfig::GetSharedInstance()->GetBoolean("use_tcp", true); if(configUseTCP){ if(avgPongs==0.0 || (udpConnectivityState==UDP_BAD && avgPongs<7.0)){ + if(needRateFlags & NEED_RATE_FLAG_UDP_NA) + needRate=true; udpConnectivityState=UDP_NOT_AVAILABLE; useTCP=true; + useUDP=avgPongs>1.0; + if(endpoints.at(currentEndpoint).type!=Endpoint::Type::TCP_RELAY) + setCurrentEndpointToTCP=true; AddTCPRelays(); - useUDP=false; waitingForRelayPeerInfo=false; - if(currentEndpoint->type!=Endpoint::TYPE_TCP_RELAY) - setCurrentEndpointToTCP=true; }else if(avgPongs<3.0){ + if(needRateFlags & NEED_RATE_FLAG_UDP_BAD) + needRate=true; udpConnectivityState=UDP_BAD; useTCP=true; - AddTCPRelays(); setCurrentEndpointToTCP=true; + AddTCPRelays(); udpPingTimeoutID=messageThread.Post(std::bind(&VoIPController::SendUdpPings, this), 0.5, 0.5); }else{ udpPingTimeoutID=MessageThread::INVALID_ID; @@ -2927,60 +3532,66 @@ void VoIPController::EvaluateUdpPingResults(){ void VoIPController::SendRelayPings(){ MutexGuard m(endpointsMutex); if((state==STATE_ESTABLISHED || state==STATE_RECONNECTING) && endpoints.size()>1){ - shared_ptr minPingRelay=preferredRelay; - double minPing=preferredRelay->averageRTT*(preferredRelay->type==Endpoint::TYPE_TCP_RELAY ? 2 : 1); + Endpoint* _preferredRelay=&endpoints.at(preferredRelay); + Endpoint* _currentEndpoint=&endpoints.at(currentEndpoint); + Endpoint* minPingRelay=_preferredRelay; + double minPing=_preferredRelay->averageRTT*(_preferredRelay->type==Endpoint::Type::TCP_RELAY ? 2 : 1); if(minPing==0.0) // force the switch to an available relay, if any minPing=DBL_MAX; - for(shared_ptr& endpoint:endpoints){ - if(endpoint->type==Endpoint::TYPE_TCP_RELAY && !useTCP) + for(pair& _endpoint:endpoints){ + Endpoint& endpoint=_endpoint.second; + if(endpoint.type==Endpoint::Type::TCP_RELAY && !useTCP) + continue; + if(endpoint.type==Endpoint::Type::UDP_RELAY && !useUDP) continue; - if(GetCurrentTime()-endpoint->lastPingTime>=10){ - LOGV("Sending ping to %s", endpoint->GetAddress().ToString().c_str()); - sendQueue->Put(PendingOutgoingPacket{ - /*.seq=*/(endpoint->lastPingSeq=GenerateOutSeq()), + if(GetCurrentTime()-endpoint.lastPingTime>=10){ + LOGV("Sending ping to %s", endpoint.GetAddress().ToString().c_str()); + SendOrEnqueuePacket(PendingOutgoingPacket{ + /*.seq=*/(endpoint.lastPingSeq=GenerateOutSeq()), /*.type=*/PKT_PING, /*.len=*/0, /*.data=*/Buffer(), - /*.endpoint=*/endpoint->id + /*.endpoint=*/endpoint.id }); - endpoint->lastPingTime=GetCurrentTime(); + endpoint.lastPingTime=GetCurrentTime(); } - if(endpoint->type==Endpoint::TYPE_UDP_RELAY || (useTCP && endpoint->type==Endpoint::TYPE_TCP_RELAY)){ - double k=endpoint->type==Endpoint::TYPE_UDP_RELAY ? 1 : 2; - if(endpoint->averageRTT>0 && endpoint->averageRTT*kaverageRTT*k; - minPingRelay=endpoint; + if((useUDP && endpoint.type==Endpoint::Type::UDP_RELAY) || (useTCP && endpoint.type==Endpoint::Type::TCP_RELAY)){ + double k=endpoint.type==Endpoint::Type::UDP_RELAY ? 1 : 2; + if(endpoint.averageRTT>0 && endpoint.averageRTT*kaddress.ToString().c_str()); - if(currentEndpoint->type==Endpoint::TYPE_UDP_RELAY || currentEndpoint->type==Endpoint::TYPE_TCP_RELAY) + if(minPingRelay->id!=preferredRelay){ + preferredRelay=minPingRelay->id; + _preferredRelay=minPingRelay; + LOGV("set preferred relay to %s", _preferredRelay->address.ToString().c_str()); + if(_currentEndpoint->type==Endpoint::Type::UDP_RELAY || _currentEndpoint->type==Endpoint::Type::TCP_RELAY){ currentEndpoint=preferredRelay; - LogDebugInfo(); - } - if(currentEndpoint->type==Endpoint::TYPE_UDP_RELAY){ - shared_ptr p2p=GetEndpointByType(Endpoint::TYPE_UDP_P2P_INET); - if(p2p){ - shared_ptr lan=GetEndpointByType(Endpoint::TYPE_UDP_P2P_LAN); - if(lan && lan->averageRTT>0 && lan->averageRTTtype==Endpoint::Type::UDP_RELAY && useUDP){ + constexpr int64_t p2pID=(int64_t)(FOURCC('P','2','P','4')) << 32; + constexpr int64_t lanID=(int64_t)(FOURCC('L','A','N','4')) << 32; + + if(endpoints.find(p2pID)!=endpoints.end()){ + Endpoint& p2p=endpoints[p2pID]; + if(endpoints.find(lanID)!=endpoints.end() && endpoints[lanID].averageRTT>0 && endpoints[lanID].averageRTTaverageRTT>0 && p2p->averageRTT0 && p2p.averageRTT0 && minPingaverageRTT*p2pToRelaySwitchThreshold){ + if(minPing>0 && minPing<_currentEndpoint->averageRTT*p2pToRelaySwitchThreshold){ LOGI("Switching to relay"); currentEndpoint=preferredRelay; - LogDebugInfo(); } } } @@ -3011,10 +3622,9 @@ void VoIPController::UpdateCongestion(){ prevSendLossCount=sendLossCount; double packetsPerSec=1000/(double) outgoingStreams[0]->frameDuration; double avgSendLossCount=sendLossCountHistory.Average()/packetsPerSec; - //LOGV("avg send loss: %.1f%%", avgSendLossCount*100); + //LOGV("avg send loss: %.3f%%", avgSendLossCount*100); - if(avgSendLossCount>0.125 && networkType!=NET_TYPE_GPRS && networkType!=NET_TYPE_EDGE){ - encoder->SetPacketLoss(40); + if(avgSendLossCount>packetLossToEnableExtraEC && networkType!=NET_TYPE_GPRS && networkType!=NET_TYPE_EDGE){ if(!shittyInternetMode){ // Shitty Internet Modeâ„¢. Redundant redundancy you can trust. shittyInternetMode=true; @@ -3028,24 +3638,36 @@ void VoIPController::UpdateCongestion(){ if(encoder) encoder->SetSecondaryEncoderEnabled(true); LOGW("Enabling extra EC"); + if(needRateFlags & NEED_RATE_FLAG_SHITTY_INTERNET_MODE) + needRate=true; + wasExtraEC=true; } - }else if(avgSendLossCount>0.1){ + } + + if(avgSendLossCount>0.08){ encoder->SetPacketLoss(40); + extraEcLevel=4; }else if(avgSendLossCount>0.075){ encoder->SetPacketLoss(35); - }else if(avgSendLossCount>0.0625){ - encoder->SetPacketLoss(30); + extraEcLevel=3; }else if(avgSendLossCount>0.05){ + encoder->SetPacketLoss(30); + extraEcLevel=3; + }else if(avgSendLossCount>0.03){ encoder->SetPacketLoss(25); - }else if(avgSendLossCount>0.025){ + extraEcLevel=2; + }else if(avgSendLossCount>0.02){ encoder->SetPacketLoss(20); + extraEcLevel=2; }else if(avgSendLossCount>0.01){ encoder->SetPacketLoss(17); }else{ encoder->SetPacketLoss(15); } + if(avgSendLossCount>rateMaxAcceptableSendLoss) + needRate=true; - if((avgSendLossCount<0.15 || networkType==NET_TYPE_EDGE || networkType==NET_TYPE_GPRS) && shittyInternetMode){ + if((avgSendLossCount &s:outgoingStreams){ if(s->type==STREAM_TYPE_AUDIO){ @@ -3058,6 +3680,8 @@ void VoIPController::UpdateCongestion(){ encoder->SetSecondaryEncoderEnabled(false); LOGW("Disabling extra EC"); } + if(!wasEncoderLaggy && encoder->GetComplexity()<10) + wasEncoderLaggy=true; } } @@ -3085,18 +3709,23 @@ void VoIPController::UpdateAudioBitrate(){ if(state==STATE_ESTABLISHED && time-lastRecvPacketTime>=reconnectingTimeout){ SetState(STATE_RECONNECTING); + if(needRateFlags & NEED_RATE_FLAG_RECONNECTING) + needRate=true; + wasReconnecting=true; ResetUdpAvailability(); } if(state==STATE_ESTABLISHED || state==STATE_RECONNECTING){ if(time-lastRecvPacketTime>=config.recvTimeout){ - if(currentEndpoint && currentEndpoint->type!=Endpoint::TYPE_UDP_RELAY && currentEndpoint->type!=Endpoint::TYPE_TCP_RELAY){ + const Endpoint& _currentEndpoint=endpoints.at(currentEndpoint); + if(_currentEndpoint.type!=Endpoint::Type::UDP_RELAY && _currentEndpoint.type!=Endpoint::Type::TCP_RELAY){ LOGW("Packet receive timeout, switching to relay"); currentEndpoint=preferredRelay; - for(shared_ptr& e:endpoints){ - if(e->type==Endpoint::TYPE_UDP_P2P_INET || e->type==Endpoint::TYPE_UDP_P2P_LAN){ - e->averageRTT=0; - e->rtts.Reset(); + for(pair& _e:endpoints){ + Endpoint& e=_e.second; + if(e.type==Endpoint::Type::UDP_P2P_INET || e.type==Endpoint::Type::UDP_P2P_LAN){ + e.averageRTT=0; + e.rtts.Reset(); } } if(allowP2p){ @@ -3131,7 +3760,7 @@ void VoIPController::UpdateSignalBars(){ int signalBarCount=4; if(state==STATE_RECONNECTING || waitingForAcks) signalBarCount=1; - if(currentEndpoint->type==Endpoint::TYPE_TCP_RELAY){ + if(endpoints.at(currentEndpoint).type==Endpoint::Type::TCP_RELAY){ signalBarCount=MIN(signalBarCount, 3); } if(avgSendLossCount>0.1){ @@ -3164,38 +3793,46 @@ void VoIPController::UpdateSignalBars(){ } void VoIPController::UpdateQueuedPackets(){ - MutexGuard m(queuedPacketsMutex); - for(std::vector::iterator qp=queuedPackets.begin();qp!=queuedPackets.end();){ - if(qp->timeout>0 && qp->firstSentTime>0 && GetCurrentTime()-qp->firstSentTime>=qp->timeout){ - LOGD("Removing queued packet because of timeout"); - qp=queuedPackets.erase(qp); - continue; - } - if(GetCurrentTime()-qp->lastSentTime>=qp->retryInterval){ - messageThread.Post(std::bind(&VoIPController::UpdateQueuedPackets, this), qp->retryInterval); - uint32_t seq=GenerateOutSeq(); - qp->seqs.Add(seq); - qp->lastSentTime=GetCurrentTime(); - //LOGD("Sending queued packet, seq=%u, type=%u, len=%u", seq, qp.type, qp.data.Length()); - Buffer buf(qp->data.Length()); - if(qp->firstSentTime==0) - qp->firstSentTime=qp->lastSentTime; - if(qp->data.Length()) - buf.CopyFrom(qp->data, qp->data.Length()); - sendQueue->Put(PendingOutgoingPacket{ - /*.seq=*/seq, - /*.type=*/qp->type, - /*.len=*/qp->data.Length(), - /*.data=*/move(buf), - /*.endpoint=*/0 - }); + vector packetsToSend; + { + MutexGuard m(queuedPacketsMutex); + for(std::vector::iterator qp=queuedPackets.begin(); qp!=queuedPackets.end();){ + if(qp->timeout>0 && qp->firstSentTime>0 && GetCurrentTime()-qp->firstSentTime>=qp->timeout){ + LOGD("Removing queued packet because of timeout"); + qp=queuedPackets.erase(qp); + continue; + } + if(GetCurrentTime()-qp->lastSentTime>=qp->retryInterval){ + messageThread.Post(std::bind(&VoIPController::UpdateQueuedPackets, this), qp->retryInterval); + uint32_t seq=GenerateOutSeq(); + qp->seqs.Add(seq); + qp->lastSentTime=GetCurrentTime(); + //LOGD("Sending queued packet, seq=%u, type=%u, len=%u", seq, qp.type, qp.data.Length()); + Buffer buf(qp->data.Length()); + if(qp->firstSentTime==0) + qp->firstSentTime=qp->lastSentTime; + if(qp->data.Length()) + buf.CopyFrom(qp->data, qp->data.Length()); + packetsToSend.push_back(PendingOutgoingPacket{ + /*.seq=*/seq, + /*.type=*/qp->type, + /*.len=*/qp->data.Length(), + /*.data=*/move(buf), + /*.endpoint=*/0 + }); + } + ++qp; } - ++qp; + } + for(PendingOutgoingPacket& pkt:packetsToSend){ + SendOrEnqueuePacket(move(pkt)); } } void VoIPController::SendNopPacket(){ - sendQueue->Put(PendingOutgoingPacket{ + if(state!=STATE_ESTABLISHED) + return; + SendOrEnqueuePacket(PendingOutgoingPacket{ /*.seq=*/(firstSentPing=GenerateOutSeq()), /*.type=*/PKT_NOP, /*.len=*/0, @@ -3209,9 +3846,9 @@ void VoIPController::SendPublicEndpointsRequest(){ return; LOGI("Sending public endpoints request"); MutexGuard m(endpointsMutex); - for(shared_ptr& e:endpoints){ - if(e->type==Endpoint::TYPE_UDP_RELAY && !e->IsIPv6Only()){ - SendPublicEndpointsRequest(*e); + for(pair& e:endpoints){ + if(e.second.type==Endpoint::Type::UDP_RELAY && !e.second.IsIPv6Only()){ + SendPublicEndpointsRequest(e.second); } } publicEndpointsReqCount++; @@ -3241,13 +3878,13 @@ void VoIPController::TickJitterBufferAngCongestionControl(){ #pragma mark - Endpoint -Endpoint::Endpoint(int64_t id, uint16_t port, IPv4Address& _address, IPv6Address& _v6address, char type, unsigned char peerTag[16]) : address(_address), v6address(_v6address){ +Endpoint::Endpoint(int64_t id, uint16_t port, IPv4Address& _address, IPv6Address& _v6address, Type type, unsigned char peerTag[16]) : address(_address), v6address(_v6address){ this->id=id; this->port=port; this->type=type; memcpy(this->peerTag, peerTag, 16); - if(type==TYPE_UDP_RELAY && ServerConfig::GetSharedInstance()->GetBoolean("force_tcp", false)) - this->type=TYPE_TCP_RELAY; + if(type==Type::UDP_RELAY && ServerConfig::GetSharedInstance()->GetBoolean("force_tcp", false)) + this->type=Type::TCP_RELAY; lastPingSeq=0; lastPingTime=0; @@ -3264,11 +3901,15 @@ Endpoint::Endpoint() : address(0), v6address(string("::0")) { udpPongCount=0; } +const NetworkAddress &Endpoint::GetAddress() const{ + return IsIPv6Only() ? (NetworkAddress&)v6address : (NetworkAddress&)address; +} + NetworkAddress &Endpoint::GetAddress(){ return IsIPv6Only() ? (NetworkAddress&)v6address : (NetworkAddress&)address; } -bool Endpoint::IsIPv6Only(){ +bool Endpoint::IsIPv6Only() const{ return address.IsEmpty() && !v6address.IsEmpty(); } @@ -3278,3 +3919,46 @@ Endpoint::~Endpoint(){ delete socket; } } + +#pragma mark - AudioInputTester + +AudioInputTester::AudioInputTester(std::string deviceID) : deviceID(deviceID){ + io=audio::AudioIO::Create(deviceID, "default"); + if(io->Failed()){ + LOGE("Audio IO failed"); + return; + } + input=io->GetInput(); + input->SetCallback([](unsigned char* data, size_t size, void* ctx) -> size_t{ + reinterpret_cast(ctx)->Update(reinterpret_cast(data), size/2); + return 0; + }, this); + input->Start(); + /*thread=new MessageThread(); + thread->Start(); + thread->Post([this]{ + this->callback(maxSample/(float)INT16_MAX); + maxSample=0; + }, updateInterval, updateInterval);*/ +} + +AudioInputTester::~AudioInputTester(){ + //thread->Stop(); + //delete thread; + input->Stop(); + delete io; +} + +void AudioInputTester::Update(int16_t *samples, size_t count){ + for(size_t i=0;imaxSample) + maxSample=s; + } +} + +float AudioInputTester::GetAndResetLevel(){ + float s=maxSample; + maxSample=0; + return s/(float)INT16_MAX; +} diff --git a/libtgvoip/VoIPController.h b/libtgvoip/VoIPController.h index cba0c3e..8f3b416 100755 --- a/libtgvoip/VoIPController.h +++ b/libtgvoip/VoIPController.h @@ -19,7 +19,10 @@ #include #include #include +#include #include +#include "video/VideoSource.h" +#include "video/VideoRenderer.h" #include #if defined(TGVOIP_USE_SOFTWARE_AUDIO) #include @@ -39,8 +42,9 @@ #include "Buffers.h" #include "PacketReassembler.h" #include "MessageThread.h" +#include "utils.h" -#define LIBTGVOIP_VERSION "2.2.4" +#define LIBTGVOIP_VERSION "2.4.3" #ifdef _WIN32 #undef GetCurrentTime @@ -48,6 +52,8 @@ #endif #define TGVOIP_PEER_CAP_GROUP_CALLS 1 +#define TGVOIP_PEER_CAP_VIDEO_CAPTURE 2 +#define TGVOIP_PEER_CAP_VIDEO_DISPLAY 4 namespace tgvoip{ @@ -104,29 +110,37 @@ namespace tgvoip{ void (*aes_cbc_encrypt)(uint8_t* in, uint8_t* out, size_t length, uint8_t* key, uint8_t* iv); void (*aes_cbc_decrypt)(uint8_t* in, uint8_t* out, size_t length, uint8_t* key, uint8_t* iv); }; + + struct CellularCarrierInfo{ + std::string name; + std::string mcc; + std::string mnc; + std::string countryCode; + }; class Endpoint{ friend class VoIPController; friend class VoIPGroupController; public: - enum{ - TYPE_UDP_P2P_INET=1, - TYPE_UDP_P2P_LAN, - TYPE_UDP_RELAY, - TYPE_TCP_RELAY + enum Type{ + UDP_P2P_INET=1, + UDP_P2P_LAN, + UDP_RELAY, + TCP_RELAY }; - Endpoint(int64_t id, uint16_t port, IPv4Address& address, IPv6Address& v6address, char type, unsigned char* peerTag); + Endpoint(int64_t id, uint16_t port, IPv4Address& address, IPv6Address& v6address, Type type, unsigned char* peerTag); Endpoint(); ~Endpoint(); + const NetworkAddress& GetAddress() const; NetworkAddress& GetAddress(); - bool IsIPv6Only(); + bool IsIPv6Only() const; int64_t id; uint16_t port; IPv4Address address; IPv6Address v6address; - char type; + Type type; unsigned char peerTag[16]; private: @@ -149,27 +163,30 @@ namespace tgvoip{ }; class AudioInputDevice : public AudioDevice{ - + }; - - struct EncodedVideoFrame{ - unsigned char* data; - size_t size; - uint32_t flags; - - EncodedVideoFrame(size_t size){ - this->size=size; - data=(unsigned char*)malloc(size); - } - - ~EncodedVideoFrame(){ - free(data); + + class AudioInputTester{ + public: + AudioInputTester(const std::string deviceID); + ~AudioInputTester(); + TGVOIP_DISALLOW_COPY_AND_ASSIGN(AudioInputTester); + float GetAndResetLevel(); + bool Failed(){ + return io && io->Failed(); } + private: + void Update(int16_t* samples, size_t count); + audio::AudioIO* io=NULL; + audio::AudioInput* input=NULL; + int16_t maxSample=0; + std::string deviceID; }; class VoIPController{ friend class VoIPGroupController; public: + TGVOIP_DISALLOW_COPY_AND_ASSIGN(VoIPController); struct Config{ Config(double initTimeout=30.0, double recvTimeout=20.0, int dataSaving=DATA_SAVING_NEVER, bool enableAEC=false, bool enableNS=false, bool enableAGC=false, bool enableCallUpgrade=false){ this->initTimeout=initTimeout; @@ -197,6 +214,12 @@ namespace tgvoip{ bool enableAGC; bool enableCallUpgrade; + + bool logPacketStats=false; + bool enableVolumeControl=false; + + bool enableVideoSend=false; + bool enableVideoReceive=false; }; struct TrafficStats{ @@ -214,6 +237,8 @@ namespace tgvoip{ * Set the initial endpoints (relays) * @param endpoints Endpoints converted from phone.PhoneConnection TL objects * @param allowP2p Whether p2p connectivity is allowed + * @param connectionMaxLayer The max_layer field from the phoneCallProtocol object returned by Telegram server. + * DO NOT HARDCODE THIS VALUE, it's extremely important for backwards compatibility. */ void SetRemoteEndpoints(std::vector endpoints, bool allowP2p, int32_t connectionMaxLayer); /** @@ -294,12 +319,6 @@ namespace tgvoip{ * @return */ std::string GetDebugLog(); - /** - * - * @param buffer - */ - void GetDebugLog(char* buffer); - size_t GetDebugLogLength(); /** * * @return @@ -368,11 +387,30 @@ namespace tgvoip{ void RequestCallUpgrade(); void SetEchoCancellationStrength(int strength); int GetConnectionState(); - + bool NeedRate(); + /** + * Get the maximum connection layer supported by this libtgvoip version. + * Pass this as max_layer in the phone.phoneConnection TL object when requesting and accepting calls. + */ + static int32_t GetConnectionMaxLayer(){ + return 92; + }; + /** + * Get the persistable state of the library, like proxy capabilities, to save somewhere on the disk. Call this at the end of the call. + * Using this will speed up the connection establishment in some cases. + */ + std::vector GetPersistentState(); + /** + * Load the persistable state. Call this before starting the call. + */ + void SetPersistentState(std::vector state); + #if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) void SetAudioDataCallbacks(std::function input, std::function output); #endif + void SetVideoCodecSpecificData(const std::vector& data); + struct Callbacks{ void (*connectionStateChanged)(VoIPController*, int); void (*signalBarCountChanged)(VoIPController*, int); @@ -385,6 +423,14 @@ namespace tgvoip{ float GetOutputLevel(){ return 0.0f; }; + void SetVideoSource(video::VideoSource* source); + void SetVideoRenderer(video::VideoRenderer* renderer); + + void SetInputVolume(float level); + void SetOutputVolume(float level); +#if defined(__APPLE__) && defined(TARGET_OS_OSX) + void SetAudioOutputDuckingEnabled(bool enabled); +#endif #if defined(TGVOIP_USE_SOFTWARE_AUDIO) pj::AudioMedia * AudioMediaInput() {return softwareMediaInput;}; @@ -403,17 +449,53 @@ namespace tgvoip{ double ackTime; }; struct PendingOutgoingPacket{ + PendingOutgoingPacket(uint32_t seq, unsigned char type, size_t len, Buffer&& data, int64_t endpoint){ + this->seq=seq; + this->type=type; + this->len=len; + this->data=std::move(data); + this->endpoint=endpoint; + } + PendingOutgoingPacket(PendingOutgoingPacket&& other){ + seq=other.seq; + type=other.type; + len=other.len; + data=std::move(other.data); + endpoint=other.endpoint; + } + PendingOutgoingPacket& operator=(PendingOutgoingPacket&& other){ + if(this!=&other){ + seq=other.seq; + type=other.type; + len=other.len; + data=std::move(other.data); + endpoint=other.endpoint; + } + return *this; + } + TGVOIP_DISALLOW_COPY_AND_ASSIGN(PendingOutgoingPacket); uint32_t seq; unsigned char type; size_t len; Buffer data; int64_t endpoint; }; - struct SegmentedPacket{ - unsigned char type; - - }; struct QueuedPacket{ +#if defined(_MSC_VER) && _MSC_VER <= 1800 // VS2013 doesn't support auto-generating move constructors + //TGVOIP_DISALLOW_COPY_AND_ASSIGN(QueuedPacket); + QueuedPacket(QueuedPacket&& other){ + data=std::move(other.data); + type=other.type; + seqs=other.seqs; + firstSentTime=other.firstSentTime; + lastSentTime=other.lastSentTime; + retryInterval=other.retryInterval; + timeout=other.timeout; + } + QueuedPacket(){ + + } +#endif Buffer data; unsigned char type; HistoricBuffer seqs; @@ -422,18 +504,26 @@ namespace tgvoip{ double retryInterval; double timeout; }; - virtual void ProcessIncomingPacket(NetworkPacket& packet, std::shared_ptr srcEndpoint); + virtual void ProcessIncomingPacket(NetworkPacket& packet, Endpoint& srcEndpoint); virtual void ProcessExtraData(Buffer& data); virtual void WritePacketHeader(uint32_t seq, BufferOutputStream* s, unsigned char type, uint32_t length); - virtual void SendPacket(unsigned char* data, size_t len, std::shared_ptr ep, PendingOutgoingPacket& srcPacket); + virtual void SendPacket(unsigned char* data, size_t len, Endpoint& ep, PendingOutgoingPacket& srcPacket); virtual void SendInit(); - virtual void SendUdpPing(std::shared_ptr endpoint); + virtual void SendUdpPing(Endpoint& endpoint); virtual void SendRelayPings(); virtual void OnAudioOutputReady(); virtual void SendExtra(Buffer& data, unsigned char type); void SendStreamFlags(Stream& stream); + void SendStreamCSD(Stream& stream); void InitializeTimers(); void ResetEndpointPingStats(); + void SendVideoFrame(const Buffer& frame, uint32_t flags); + void ProcessIncomingVideoFrame(Buffer frame, uint32_t pts, bool keyframe); + std::shared_ptr GetStreamByType(int type, bool outgoing); + Endpoint* GetEndpointForPacket(const PendingOutgoingPacket& pkt); + bool SendOrEnqueuePacket(PendingOutgoingPacket pkt, bool enqueue=true); + static std::string NetworkTypeToString(int type); + CellularCarrierInfo GetCarrierInfo(); private: struct Stream{ @@ -449,8 +539,24 @@ namespace tgvoip{ std::shared_ptr packetReassembler; std::shared_ptr callbackWrapper; std::vector codecSpecificData; + bool csdIsValid=false; + unsigned int width=0; + unsigned int height=0; + uint16_t rotation=0; }; struct UnacknowledgedExtraData{ +#if defined(_MSC_VER) && _MSC_VER <= 1800 // VS2013 doesn't support auto-generating move constructors + UnacknowledgedExtraData(UnacknowledgedExtraData&& other){ + type=other.type; + data=std::move(other.data); + firstContainingSeq=other.firstContainingSeq; + } + UnacknowledgedExtraData(unsigned char _type, Buffer&& _data, uint32_t _firstContainingSeq){ + type=_type; + data=_data; + firstContainingSeq=_firstContainingSeq; + } +#endif unsigned char type; Buffer data; uint32_t firstContainingSeq; @@ -463,11 +569,20 @@ namespace tgvoip{ UDP_NOT_AVAILABLE, UDP_BAD }; + struct DebugLoggedPacket{ + int32_t seq; + double timestamp; + int32_t length; + }; + struct SentVideoFrame{ + uint32_t num; + uint32_t fragmentCount; + std::vector unacknowledgedPackets; + }; - void RunRecvThread(void* arg); - void RunSendThread(void* arg); + void RunRecvThread(); + void RunSendThread(); void HandleAudioInput(unsigned char* data, size_t len, unsigned char* secondaryData, size_t secondaryLen); - void HandleVideoInput(EncodedVideoFrame& frame); void UpdateAudioBitrateLimit(); void SetState(int state); void UpdateAudioOutputState(); @@ -477,13 +592,12 @@ namespace tgvoip{ void KDF2(unsigned char* msgKey, size_t x, unsigned char* aesKey, unsigned char* aesIv); static void AudioInputCallback(unsigned char* data, size_t length, unsigned char* secondaryData, size_t secondaryLength, void* param); void SendPublicEndpointsRequest(); - void SendPublicEndpointsRequest(Endpoint& relay); - std::shared_ptr GetEndpointByType(int type); - std::shared_ptr GetEndpointByID(int64_t id); + void SendPublicEndpointsRequest(const Endpoint& relay); + Endpoint& GetEndpointByType(int type); void SendPacketReliably(unsigned char type, unsigned char* data, size_t len, double retryInterval, double timeout); uint32_t GenerateOutSeq(); - void LogDebugInfo(); - void ActuallySendPacket(NetworkPacket& pkt, std::shared_ptr ep); + void ActuallySendPacket(NetworkPacket& pkt, Endpoint& ep); + void InitializeAudio(); void StartAudio(); void ProcessAcknowledgedOutgoingExtra(UnacknowledgedExtraData& extra); void AddIPv6Relays(); @@ -498,14 +612,17 @@ namespace tgvoip{ void SendNopPacket(); void TickJitterBufferAngCongestionControl(); void ResetUdpAvailability(); + std::string GetPacketTypeString(unsigned char type); + void SetupOutgoingVideoStream(); + bool WasOutgoingPacketAcknowledged(uint32_t seq); int state; - std::vector> endpoints; - std::shared_ptr currentEndpoint; - std::shared_ptr preferredRelay; - std::shared_ptr peerPreferredRelay; + std::map endpoints; + int64_t currentEndpoint=0; + int64_t preferredRelay=0; + int64_t peerPreferredRelay=0; bool runReceiver; - uint32_t seq; + std::atomic seq; uint32_t lastRemoteSeq; uint32_t lastRemoteAckSeq; uint32_t lastSentSeq; @@ -514,11 +631,11 @@ namespace tgvoip{ HistoricBuffer sendLossCountHistory; uint32_t audioTimestampIn; uint32_t audioTimestampOut; - std::shared_ptr audioIO; - tgvoip::audio::AudioInput* audioInput; - tgvoip::audio::AudioOutput* audioOutput; + tgvoip::audio::AudioIO* audioIO=NULL; + tgvoip::audio::AudioInput* audioInput=NULL; + tgvoip::audio::AudioOutput* audioOutput=NULL; OpusEncoder* encoder; - BlockingQueue* sendQueue; + std::vector sendQueue; EchoCanceller* echoCanceller; Mutex sendBufferMutex; Mutex endpointsMutex; @@ -561,7 +678,6 @@ namespace tgvoip{ TrafficStats stats; bool receivedInit; bool receivedInitAck; - std::vector debugLogs; bool isOutgoing; NetworkSocket* udpSocket; NetworkSocket* realUdpSocket; @@ -572,8 +688,8 @@ namespace tgvoip{ bool useUDP; bool didAddTcpRelays; SocketSelectCanceller* selectCanceller; - NetworkSocket* openingTcpSocket; HistoricBuffer signalBarsHistory; + bool audioStarted=false; int udpConnectivityState; double lastUdpPingTime; @@ -587,8 +703,6 @@ namespace tgvoip{ std::string proxyPassword; IPv4Address* resolvedProxyAddress; - AutomaticGainControl* outputAGC; - bool outputAGCEnabled; uint32_t peerCapabilities; Callbacks callbacks; bool didReceiveGroupCallKey; @@ -607,6 +721,7 @@ namespace tgvoip{ bool peerIPv6Available; IPv6Address myIPv6; bool shittyInternetMode; + int extraEcLevel=0; std::vector ecAudioPackets; bool didAddIPv6Relays; bool didSendIPv6Endpoint; @@ -615,15 +730,48 @@ namespace tgvoip{ bool wasEstablished=false; bool receivedFirstStreamPacket=false; std::atomic unsentStreamPackets; + HistoricBuffer unsentStreamPacketsHistory; + bool needReInitUdpProxy=true; + bool needRate=false; + std::vector debugLoggedPackets; uint32_t initTimeoutID=MessageThread::INVALID_ID; uint32_t noStreamsNopID=MessageThread::INVALID_ID; uint32_t udpPingTimeoutID=MessageThread::INVALID_ID; + effects::Volume outputVolume; + effects::Volume inputVolume; + + std::vector peerVideoDecoders; + int peerMaxVideoResolution=0; + #if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) std::function audioInputDataCallback; std::function audioOutputDataCallback; #endif +#if defined(__APPLE__) && defined(TARGET_OS_OSX) + bool macAudioDuckingEnabled=true; +#endif + + video::VideoSource* videoSource=NULL; + video::VideoRenderer* videoRenderer=NULL; + double firstVideoFrameTime=0.0; + uint32_t videoFrameCount=0; + uint32_t lastReceivedVideoFrameNumber=UINT32_MAX; + std::vector sentVideoFrames; + Mutex sentVideoFramesMutex; + bool videoKeyframeRequested=false; + + /*** debug report problems ***/ + bool wasReconnecting=false; + bool wasExtraEC=false; + bool wasEncoderLaggy=false; + bool wasNetworkHandover=false; + + /*** persistable state values ***/ + bool proxySupportsUDP=true; + bool proxySupportsTCP=true; + std::string lastTestedProxyServer=""; /*** server config values ***/ uint32_t maxAudioBitrate; @@ -641,6 +789,11 @@ namespace tgvoip{ double p2pToRelaySwitchThreshold; double relayToP2pSwitchThreshold; double reconnectingTimeout; + uint32_t needRateFlags; + double rateMaxAcceptableRTT; + double rateMaxAcceptableSendLoss; + double packetLossToEnableExtraEC; + uint32_t maxUnsentStreamPackets; #if defined(TGVOIP_USE_SOFTWARE_AUDIO) tgvoip::audio::SoftwareAudioInput* softwareMediaInput; tgvoip::audio::SoftwareAudioOutput* softwareMediaOutput; @@ -679,11 +832,11 @@ namespace tgvoip{ virtual std::string GetDebugString(); virtual void SetNetworkType(int type); protected: - virtual void ProcessIncomingPacket(NetworkPacket& packet, std::shared_ptr srcEndpoint); + virtual void ProcessIncomingPacket(NetworkPacket& packet, Endpoint& srcEndpoint); virtual void SendInit(); - virtual void SendUdpPing(std::shared_ptr endpoint); + virtual void SendUdpPing(Endpoint& endpoint); virtual void SendRelayPings(); - virtual void SendPacket(unsigned char* data, size_t len, std::shared_ptr ep, PendingOutgoingPacket& srcPacket); + virtual void SendPacket(unsigned char* data, size_t len, Endpoint& ep, PendingOutgoingPacket& srcPacket); virtual void WritePacketHeader(uint32_t seq, BufferOutputStream* s, unsigned char type, uint32_t length); virtual void OnAudioOutputReady(); private: @@ -703,7 +856,7 @@ namespace tgvoip{ unsigned char reflectorSelfSecret[16]; unsigned char reflectorSelfTagHash[32]; int32_t userSelfID; - std::shared_ptr groupReflector; + Endpoint groupReflector; AudioMixer* audioMixer; AudioLevelMeter selfLevelMeter; Callbacks groupCallbacks; diff --git a/libtgvoip/VoIPGroupController.cpp b/libtgvoip/VoIPGroupController.cpp index c1f336b..5efcb9b 100644 --- a/libtgvoip/VoIPGroupController.cpp +++ b/libtgvoip/VoIPGroupController.cpp @@ -38,15 +38,16 @@ VoIPGroupController::~VoIPGroupController(){ } void VoIPGroupController::SetGroupCallInfo(unsigned char *encryptionKey, unsigned char *reflectorGroupTag, unsigned char *reflectorSelfTag, unsigned char *reflectorSelfSecret, unsigned char* reflectorSelfTagHash, int32_t selfUserID, IPv4Address reflectorAddress, IPv6Address reflectorAddressV6, uint16_t reflectorPort){ - shared_ptr e=make_shared(); - e->address=reflectorAddress; - e->v6address=reflectorAddressV6; - e->port=reflectorPort; - memcpy(e->peerTag, reflectorGroupTag, 16); - e->type=Endpoint::TYPE_UDP_RELAY; - endpoints.push_back(e); + Endpoint e; + e.address=reflectorAddress; + e.v6address=reflectorAddressV6; + e.port=reflectorPort; + memcpy(e.peerTag, reflectorGroupTag, 16); + e.type=Endpoint::Type::UDP_RELAY; + e.id=FOURCC('G','R','P','R'); + endpoints[e.id]=e; groupReflector=e; - currentEndpoint=e; + currentEndpoint=e.id; memcpy(this->encryptionKey, encryptionKey, 256); memcpy(this->reflectorSelfTag, reflectorSelfTag, 16); @@ -217,7 +218,7 @@ void VoIPGroupController::SendInit(){ SendRecentPacketsRequest(); } -void VoIPGroupController::ProcessIncomingPacket(NetworkPacket &packet, shared_ptr srcEndpoint){ +void VoIPGroupController::ProcessIncomingPacket(NetworkPacket &packet, Endpoint& srcEndpoint){ //LOGD("Received incoming packet from %s:%u, %u bytes", packet.address->ToString().c_str(), packet.port, packet.length); if(packet.length<17 || packet.length>2000){ LOGW("Received packet has wrong length %d", (int)packet.length); @@ -302,7 +303,7 @@ void VoIPGroupController::ProcessIncomingPacket(NetworkPacket &packet, shared_pt if(state!=STATE_ESTABLISHED) SetState(STATE_ESTABLISHED); if(!audioInput){ - StartAudio(); + InitializeAudio(); if(state!=STATE_FAILED){ // audioOutput->Start(); } @@ -429,7 +430,7 @@ void VoIPGroupController::ProcessIncomingPacket(NetworkPacket &packet, shared_pt break; } int i; - //if(srcEndpoint->type==Endpoint::TYPE_UDP_RELAY && srcEndpoint!=peerPreferredRelay){ + //if(srcEndpoint->type==Endpoint::Type::UDP_RELAY && srcEndpoint!=peerPreferredRelay){ // peerPreferredRelay=srcEndpoint; //} for(i=0;i endpoint){ +void VoIPGroupController::SendUdpPing(Endpoint& endpoint){ } @@ -525,8 +526,8 @@ void VoIPGroupController::SendSpecialReflectorRequest(unsigned char *data, size_ out.WriteBytes(buf, 16); NetworkPacket pkt={0}; - pkt.address=&groupReflector->address; - pkt.port=groupReflector->port; + pkt.address=&groupReflector.address; + pkt.port=groupReflector.port; pkt.protocol=PROTO_UDP; pkt.data=out.GetBuffer(); pkt.length=out.GetLength(); @@ -536,9 +537,9 @@ void VoIPGroupController::SendSpecialReflectorRequest(unsigned char *data, size_ void VoIPGroupController::SendRelayPings(){ //LOGV("Send relay pings 2"); double currentTime=GetCurrentTime(); - if(currentTime-groupReflector->lastPingTime>=0.25){ + if(currentTime-groupReflector.lastPingTime>=0.25){ SendRecentPacketsRequest(); - groupReflector->lastPingTime=currentTime; + groupReflector.lastPingTime=currentTime; } } @@ -589,10 +590,10 @@ void VoIPGroupController::WritePacketHeader(uint32_t seq, BufferOutputStream *s, } } -void VoIPGroupController::SendPacket(unsigned char *data, size_t len, shared_ptr ep, PendingOutgoingPacket& srcPacket){ +void VoIPGroupController::SendPacket(unsigned char *data, size_t len, Endpoint& ep, PendingOutgoingPacket& srcPacket){ if(stopping) return; - if(ep->type==Endpoint::TYPE_TCP_RELAY && !useTCP) + if(ep.type==Endpoint::Type::TCP_RELAY && !useTCP) return; BufferOutputStream out(len+128); //LOGV("send group packet %u", len); @@ -652,11 +653,11 @@ void VoIPGroupController::SendPacket(unsigned char *data, size_t len, shared_ptr stats.bytesSentWifi+=(uint64_t)out.GetLength(); NetworkPacket pkt={0}; - pkt.address=(NetworkAddress*)&ep->address; - pkt.port=ep->port; + pkt.address=(NetworkAddress*)&ep.address; + pkt.port=ep.port; pkt.length=out.GetLength(); pkt.data=out.GetBuffer(); - pkt.protocol=ep->type==Endpoint::TYPE_TCP_RELAY ? PROTO_TCP : PROTO_UDP; + pkt.protocol=ep.type==Endpoint::Type::TCP_RELAY ? PROTO_TCP : PROTO_UDP; ActuallySendPacket(pkt, ep); } @@ -746,26 +747,27 @@ void VoIPGroupController::SerializeAndUpdateOutgoingStreams(){ std::string VoIPGroupController::GetDebugString(){ std::string r="Remote endpoints: \n"; char buffer[2048]; - for(shared_ptr& endpoint:endpoints){ + for(pair& _endpoint:endpoints){ + Endpoint& endpoint=_endpoint.second; const char* type; - switch(endpoint->type){ - case Endpoint::TYPE_UDP_P2P_INET: + switch(endpoint.type){ + case Endpoint::Type::UDP_P2P_INET: type="UDP_P2P_INET"; break; - case Endpoint::TYPE_UDP_P2P_LAN: + case Endpoint::Type::UDP_P2P_LAN: type="UDP_P2P_LAN"; break; - case Endpoint::TYPE_UDP_RELAY: + case Endpoint::Type::UDP_RELAY: type="UDP_RELAY"; break; - case Endpoint::TYPE_TCP_RELAY: + case Endpoint::Type::TCP_RELAY: type="TCP_RELAY"; break; default: type="UNKNOWN"; break; } - snprintf(buffer, sizeof(buffer), "%s:%u %dms [%s%s]\n", endpoint->address.ToString().c_str(), endpoint->port, (int)(endpoint->averageRTT*1000), type, currentEndpoint==endpoint ? ", IN_USE" : ""); + snprintf(buffer, sizeof(buffer), "%s:%u %dms [%s%s]\n", endpoint.address.ToString().c_str(), endpoint.port, (int)(endpoint.averageRTT*1000), type, currentEndpoint==endpoint.id ? ", IN_USE" : ""); r+=buffer; } double avgLate[3]; diff --git a/libtgvoip/VoIPServerConfig.cpp b/libtgvoip/VoIPServerConfig.cpp index 56cc6c4..27f15a7 100644 --- a/libtgvoip/VoIPServerConfig.cpp +++ b/libtgvoip/VoIPServerConfig.cpp @@ -28,74 +28,43 @@ ServerConfig *ServerConfig::GetSharedInstance(){ bool ServerConfig::GetBoolean(std::string name, bool fallback){ MutexGuard sync(mutex); - if(ContainsKey(name)){ - std::string val=config[name]; - if(val=="true") - return true; - if(val=="false") - return false; - } + if(ContainsKey(name) && config[name].is_bool()) + return config[name].bool_value(); return fallback; } double ServerConfig::GetDouble(std::string name, double fallback){ MutexGuard sync(mutex); - if(ContainsKey(name)){ - std::string val=config[name]; - std::istringstream stm(val); - double rval=fallback; - stm.imbue(std::locale("C")); - stm >> rval; - if(!stm.fail()) - return rval; - } + if(ContainsKey(name) && config[name].is_number()) + return config[name].number_value(); return fallback; } int32_t ServerConfig::GetInt(std::string name, int32_t fallback){ MutexGuard sync(mutex); - if(ContainsKey(name)){ - std::string val=config[name]; - char* end; - const char* start=val.c_str(); - int32_t d=strtol(start, &end, 0); - if(end!=start){ - return d; - } - } + if(ContainsKey(name) && config[name].is_number()) + return config[name].int_value(); return fallback; } std::string ServerConfig::GetString(std::string name, std::string fallback){ MutexGuard sync(mutex); - if(ContainsKey(name)) - return config[name]; + if(ContainsKey(name) && config[name].is_string()) + return config[name].string_value(); return fallback; } -void ServerConfig::Update(std::map newValues){ +void ServerConfig::Update(std::string jsonString){ MutexGuard sync(mutex); LOGD("=== Updating voip config ==="); - config.clear(); - for(std::map::iterator itr=newValues.begin();itr!=newValues.end();++itr){ - std::string key=itr->first; - std::string val=itr->second; - LOGV("%s -> %s", key.c_str(), val.c_str()); - config[key]=val; - } -} - -void ServerConfig::Update(const char **values, int count) { - std::map result; - for (int i = 0; i < count / 2; i++) { - result[values[i * 2 + 0]] = std::string(values[i * 2 + 1]); - } - Update(result); + LOGD("%s", jsonString.c_str()); + std::string jsonError; + config=json11::Json::parse(jsonString, jsonError); + if(!jsonError.empty()) + LOGE("Error parsing server config: %s", jsonError.c_str()); } bool ServerConfig::ContainsKey(std::string key){ - return config.find(key)!=config.end(); + return config.object_items().find(key)!=config.object_items().end(); } - - diff --git a/libtgvoip/VoIPServerConfig.h b/libtgvoip/VoIPServerConfig.h index f1770a0..3eb5124 100644 --- a/libtgvoip/VoIPServerConfig.h +++ b/libtgvoip/VoIPServerConfig.h @@ -11,6 +11,7 @@ #include #include #include "threading.h" +#include "json11.hpp" namespace tgvoip{ @@ -23,13 +24,12 @@ class ServerConfig{ double GetDouble(std::string name, double fallback); std::string GetString(std::string name, std::string fallback); bool GetBoolean(std::string name, bool fallback); - void Update(std::map newValues); - void Update(const char **values, int count); + void Update(std::string jsonString); private: static ServerConfig* sharedInstance; bool ContainsKey(std::string key); - std::map config; + json11::Json config; Mutex mutex; }; } diff --git a/libtgvoip/aclocal.m4 b/libtgvoip/aclocal.m4 index 5e9a876..897cabf 100644 --- a/libtgvoip/aclocal.m4 +++ b/libtgvoip/aclocal.m4 @@ -22,7 +22,7 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # -# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Copyright (C) 1996-2001, 2003-2018 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives @@ -241,8 +241,8 @@ esac ofile=libtool can_build_shared=yes -# All known linkers require a '.a' archive for static linking (except MSVC, -# which needs '.lib'). +# All known linkers require a '.a' archive for static linking (except MSVC and +# ICC, which need '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld @@ -1056,8 +1056,8 @@ int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD - echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD - $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$AR $AR_FLAGS libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR $AR_FLAGS libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF @@ -1507,9 +1507,22 @@ need_locks=$enable_libtool_lock m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} -: ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) -_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +# Use ARFLAGS variable as AR's operation code to sync the variable naming with +# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have +# higher priority because thats what people were doing historically (setting +# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS +# variable obsoleted/removed. + +test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} +lt_ar_flags=$AR_FLAGS +_LT_DECL([], [lt_ar_flags], [0], [Flags to create an archive (by configure)]) + +# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override +# by AR_FLAGS because that was never working and AR_FLAGS is about to die. +_LT_DECL([], [AR_FLAGS], [\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}], + [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no @@ -2221,26 +2234,35 @@ m4_defun([_LT_CMD_STRIPLIB], striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - AC_MSG_RESULT([yes]) +if test -z "$STRIP"; then + AC_MSG_RESULT([no]) else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP"; then + if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) + else + case $host_os in + darwin*) + # FIXME - insert some real tests, host_os isn't really good enough striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) - else + ;; + freebsd*) + if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) AC_MSG_RESULT([no]) - fi - ;; - *) - AC_MSG_RESULT([no]) - ;; - esac + ;; + esac + fi fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) @@ -2579,8 +2601,8 @@ m4_if([$1], [],[ dynamic_linker='Win32 ld.exe' ;; - *,cl*) - # Native MSVC + *,cl* | *,icl*) + # Native MSVC or ICC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' @@ -2636,7 +2658,7 @@ m4_if([$1], [],[ ;; *) - # Assume MSVC wrapper + # Assume MSVC and ICC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; @@ -4024,7 +4046,7 @@ for ac_symprfx in "" "_"; do if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. - # Also find C++ and __fastcall symbols from MSVC++, + # Also find C++ and __fastcall symbols from MSVC++ or ICC, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ @@ -4933,7 +4955,7 @@ m4_if([$1], [CXX], [ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else - _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) @@ -4941,7 +4963,7 @@ m4_if([$1], [CXX], [ ;; cygwin* | mingw* | cegcc*) case $cc_basename in - cl*) + cl* | icl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) @@ -4998,15 +5020,15 @@ dnl Note also adjust exclude_expsyms for C++ above. case $host_os in cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time + # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. + # Microsoft Visual C++ or Intel C++ Compiler. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) + # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) with_gnu_ld=yes ;; openbsd* | bitrig*) @@ -5170,6 +5192,7 @@ _LT_EOF emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' ;; interix[[3-9]]*) @@ -5387,7 +5410,7 @@ _LT_EOF if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else - _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no @@ -5570,12 +5593,12 @@ _LT_EOF cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. + # Microsoft Visual C++ or Intel C++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in - cl*) - # Native MSVC + cl* | icl*) + # Native MSVC or ICC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes @@ -5616,7 +5639,7 @@ _LT_EOF fi' ;; *) - # Assume MSVC wrapper + # Assume MSVC and ICC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. @@ -5875,6 +5898,7 @@ _LT_EOF emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' ;; osf3*) @@ -6641,8 +6665,8 @@ if test yes != "$_lt_caught_CXX_error"; then cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC + ,cl* | no,cl* | ,icl* | no,icl*) + # Native MSVC or ICC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' @@ -6740,6 +6764,7 @@ if test yes != "$_lt_caught_CXX_error"; then emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' ;; dgux*) @@ -8370,7 +8395,7 @@ _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], # Helper functions for option handling. -*- Autoconf -*- # -# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Copyright (C) 2004-2005, 2007-2009, 2011-2018 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # @@ -8802,7 +8827,7 @@ LT_OPTION_DEFINE([LTDL_INIT], [convenience], # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # -# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Copyright (C) 2004-2005, 2007-2008, 2011-2018 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # @@ -8927,7 +8952,7 @@ m4_define([lt_dict_filter], # ltversion.m4 -- version numbers -*- Autoconf -*- # -# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. +# Copyright (C) 2004, 2011-2018 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives @@ -8936,22 +8961,22 @@ m4_define([lt_dict_filter], # @configure_input@ -# serial 4179 ltversion.m4 +# serial 4221 ltversion.m4 # This file is part of GNU Libtool -m4_define([LT_PACKAGE_VERSION], [2.4.6]) -m4_define([LT_PACKAGE_REVISION], [2.4.6]) +m4_define([LT_PACKAGE_VERSION], [2.4.6.42-b88ce]) +m4_define([LT_PACKAGE_REVISION], [2.4.6.42]) AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4.6' -macro_revision='2.4.6' +[macro_version='2.4.6.42-b88ce' +macro_revision='2.4.6.42' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # -# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Copyright (C) 2004-2005, 2007, 2009, 2011-2018 Free Software # Foundation, Inc. # Written by Scott James Remnant, 2004. # diff --git a/libtgvoip/audio/AudioIO.cpp b/libtgvoip/audio/AudioIO.cpp index 96fe5f2..ad2ec82 100644 --- a/libtgvoip/audio/AudioIO.cpp +++ b/libtgvoip/audio/AudioIO.cpp @@ -49,39 +49,39 @@ using namespace tgvoip; using namespace tgvoip::audio; using namespace std; -shared_ptr AudioIO::Create(){ +AudioIO* AudioIO::Create(std::string inputDevice, std::string outputDevice){ #if !defined(TGVOIP_USE_SOFTWARE_AUDIO) - std::string inputDevice="default", outputDevice="default"; #if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) - return std::make_shared(); + return new AudioIOCallback(); #elif defined(__ANDROID__) - return std::make_shared>(); + return new ContextlessAudioIO(); #elif defined(__APPLE__) #if TARGET_OS_OSX if(kCFCoreFoundationVersionNumber>(inputDevice, outputDevice); + return new ContextlessAudioIO(inputDevice, outputDevice); #endif - return std::make_shared(); + return new AudioUnitIO(inputDevice, outputDevice); #elif defined(_WIN32) #ifdef TGVOIP_WINXP_COMPAT if(LOBYTE(LOWORD(GetVersion()))<6) - return std::make_shared>(inputDevice, outputDevice); + return new ContextlessAudioIO(inputDevice, outputDevice); #endif - return std::make_shared>(inputDevice, outputDevice); + return new ContextlessAudioIO(inputDevice, outputDevice); #elif defined(__linux__) #ifndef WITHOUT_ALSA #ifndef WITHOUT_PULSE if(AudioPulse::Load()){ - std::shared_ptr io=std::make_shared(inputDevice, outputDevice); + AudioIO* io=new AudioPulse(inputDevice, outputDevice); if(!io->Failed() && io->GetInput()->IsInitialized() && io->GetOutput()->IsInitialized()) return io; LOGW("PulseAudio available but not working; trying ALSA"); + delete io; } #endif - return std::make_shared>(inputDevice, outputDevice); + return new ContextlessAudioIO(inputDevice, outputDevice); #else - return std::make_shared(inputDevice, outputDevice); + return new AudioPulse(inputDevice, outputDevice); #endif #endif #endif diff --git a/libtgvoip/audio/AudioIO.h b/libtgvoip/audio/AudioIO.h index 5a58e65..e60af25 100644 --- a/libtgvoip/audio/AudioIO.h +++ b/libtgvoip/audio/AudioIO.h @@ -21,7 +21,7 @@ namespace tgvoip{ AudioIO(){}; virtual ~AudioIO(){}; TGVOIP_DISALLOW_COPY_AND_ASSIGN(AudioIO); - static std::shared_ptr Create(); + static AudioIO* Create(std::string inputDevice, std::string outputDevice); virtual AudioInput* GetInput()=0; virtual AudioOutput* GetOutput()=0; bool Failed(); diff --git a/libtgvoip/audio/AudioIOCallback.cpp b/libtgvoip/audio/AudioIOCallback.cpp index fd1a459..012a705 100644 --- a/libtgvoip/audio/AudioIOCallback.cpp +++ b/libtgvoip/audio/AudioIOCallback.cpp @@ -34,7 +34,7 @@ AudioOutput* AudioIOCallback::GetOutput(){ #pragma mark - Input AudioInputCallback::AudioInputCallback(){ - thread=new Thread(new MethodPointer(&AudioInputCallback::RunThread, this), NULL); + thread=new Thread(std::bind(&AudioInputCallback::RunThread, this)); thread->SetName("AudioInputCallback"); } @@ -60,7 +60,7 @@ void AudioInputCallback::SetDataCallback(std::function c dataCallback=c; } -void AudioInputCallback::RunThread(void*){ +void AudioInputCallback::RunThread(){ int16_t buf[960]; while(running){ double t=VoIPController::GetCurrentTime(); @@ -76,7 +76,7 @@ void AudioInputCallback::RunThread(void*){ #pragma mark - Output AudioOutputCallback::AudioOutputCallback(){ - thread=new Thread(new MethodPointer(&AudioOutputCallback::RunThread, this), NULL); + thread=new Thread(std::bind(&AudioOutputCallback::RunThread, this)); thread->SetName("AudioOutputCallback"); } @@ -106,7 +106,7 @@ void AudioOutputCallback::SetDataCallback(std::function dataCallback=c; } -void AudioOutputCallback::RunThread(void*){ +void AudioOutputCallback::RunThread(){ int16_t buf[960]; while(running){ double t=VoIPController::GetCurrentTime(); diff --git a/libtgvoip/audio/AudioIOCallback.h b/libtgvoip/audio/AudioIOCallback.h index 36ba03b..4240970 100644 --- a/libtgvoip/audio/AudioIOCallback.h +++ b/libtgvoip/audio/AudioIOCallback.h @@ -7,7 +7,7 @@ #ifndef LIBTGVOIP_AUDIO_IO_CALLBACK #define LIBTGVOIP_AUDIO_IO_CALLBACK -#include +#include "AudioIO.h" #include #include "../threading.h" @@ -22,7 +22,7 @@ namespace tgvoip{ virtual void Stop() override; void SetDataCallback(std::function c); private: - void RunThread(void*); + void RunThread(); bool running=false; bool recording=false; Thread* thread; @@ -38,7 +38,7 @@ namespace tgvoip{ virtual bool IsPlaying() override; void SetDataCallback(std::function c); private: - void RunThread(void*); + void RunThread(); bool running=false; bool playing=false; Thread* thread; diff --git a/libtgvoip/client/android/tg_voip_jni.cpp b/libtgvoip/client/android/tg_voip_jni.cpp index e93f052..9d6eeff 100644 --- a/libtgvoip/client/android/tg_voip_jni.cpp +++ b/libtgvoip/client/android/tg_voip_jni.cpp @@ -9,13 +9,17 @@ #include #include #include -#include -#include -#include -#include -#include -#include -#include +#include "../../VoIPServerConfig.h" +#include "../../VoIPController.h" +#include "../../os/android/AudioOutputOpenSLES.h" +#include "../../os/android/AudioInputOpenSLES.h" +#include "../../os/android/AudioInputAndroid.h" +#include "../../os/android/AudioOutputAndroid.h" +#include "../../os/android/VideoSourceAndroid.h" +#include "../../os/android/VideoRendererAndroid.h" +#include "../../audio/Resampler.h" +#include "../../os/android/JNIUtilities.h" +#include "../../PrivateDefines.h" #ifdef TGVOIP_HAS_CONFIG #include @@ -33,8 +37,9 @@ jmethodID groupCallKeySentMethod=NULL; jmethodID callUpgradeRequestReceivedMethod=NULL; jclass jniUtilitiesClass=NULL; -struct impl_data_android_t{ +struct ImplDataAndroid{ jobject javaObject; + std::string persistentStateFile=""; }; #ifndef TGVOIP_PACKAGE_PATH @@ -45,429 +50,508 @@ struct impl_data_android_t{ #define TGVOIP_PEER_TAG_VARIABLE_NAME "peer_tag" #endif -#ifndef TGVOIP_FUNC -#define TGVOIP_FUNC(RETURN_TYPE, NAME, ...) \ - extern "C" { \ - JNIEXPORT RETURN_TYPE \ - Java_org_telegram_messenger_voip_##NAME( \ - JNIEnv *env, ##__VA_ARGS__); \ - } \ - JNIEXPORT RETURN_TYPE \ - Java_org_telegram_messenger_voip_##NAME( \ - JNIEnv *env, ##__VA_ARGS__) +#ifndef TGVOIP_ENDPOINT_CLASS +#define TGVOIP_ENDPOINT_CLASS "org/telegram/tgnet/TLRPC$TL_phoneConnection" #endif using namespace tgvoip; using namespace tgvoip::audio; namespace tgvoip { +#pragma mark - Callbacks + void updateConnectionState(VoIPController *cntrlr, int state){ - impl_data_android_t *impl=(impl_data_android_t *) cntrlr->implData; - if(!impl->javaObject) - return; - JNIEnv *env=NULL; - bool didAttach=false; - sharedJVM->GetEnv((void **) &env, JNI_VERSION_1_6); - if(!env){ - sharedJVM->AttachCurrentThread(&env, NULL); - didAttach=true; - } + ImplDataAndroid *impl=(ImplDataAndroid *) cntrlr->implData; + jni::AttachAndCallVoidMethod(setStateMethod, impl->javaObject, state); + } - if(setStateMethod) - env->CallVoidMethod(impl->javaObject, setStateMethod, state); + void updateSignalBarCount(VoIPController *cntrlr, int count){ + ImplDataAndroid *impl=(ImplDataAndroid *) cntrlr->implData; + jni::AttachAndCallVoidMethod(setSignalBarsMethod, impl->javaObject, count); + } - if(didAttach){ - sharedJVM->DetachCurrentThread(); - } + void updateGroupCallStreams(VoIPGroupController *cntrlr, unsigned char *streams, size_t len){ + ImplDataAndroid *impl=(ImplDataAndroid *) cntrlr->implData; + if(!impl->javaObject) + return; + jni::DoWithJNI([streams, len, &impl](JNIEnv* env){ + if(setSelfStreamsMethod){ + jbyteArray jstreams=env->NewByteArray(static_cast(len)); + jbyte *el=env->GetByteArrayElements(jstreams, NULL); + memcpy(el, streams, len); + env->ReleaseByteArrayElements(jstreams, el, 0); + env->CallVoidMethod(impl->javaObject, setSelfStreamsMethod, jstreams); + } + }); } - void updateSignalBarCount(VoIPController *cntrlr, int count){ - impl_data_android_t *impl=(impl_data_android_t *) cntrlr->implData; + void groupCallKeyReceived(VoIPController *cntrlr, const unsigned char *key){ + ImplDataAndroid *impl=(ImplDataAndroid *) cntrlr->implData; if(!impl->javaObject) return; - JNIEnv *env=NULL; - bool didAttach=false; - sharedJVM->GetEnv((void **) &env, JNI_VERSION_1_6); - if(!env){ - sharedJVM->AttachCurrentThread(&env, NULL); - didAttach=true; - } + jni::DoWithJNI([key, &impl](JNIEnv* env){ + if(groupCallKeyReceivedMethod){ + jbyteArray jkey=env->NewByteArray(256); + jbyte *el=env->GetByteArrayElements(jkey, NULL); + memcpy(el, key, 256); + env->ReleaseByteArrayElements(jkey, el, 0); + env->CallVoidMethod(impl->javaObject, groupCallKeyReceivedMethod, jkey); + } + }); + } - if(setSignalBarsMethod) - env->CallVoidMethod(impl->javaObject, setSignalBarsMethod, count); + void groupCallKeySent(VoIPController *cntrlr){ + ImplDataAndroid *impl=(ImplDataAndroid *) cntrlr->implData; + jni::AttachAndCallVoidMethod(groupCallKeySentMethod, impl->javaObject); + } - if(didAttach){ - sharedJVM->DetachCurrentThread(); - } + void callUpgradeRequestReceived(VoIPController* cntrlr){ + ImplDataAndroid *impl=(ImplDataAndroid *) cntrlr->implData; + jni::AttachAndCallVoidMethod(callUpgradeRequestReceivedMethod, impl->javaObject); } - void updateGroupCallStreams(VoIPGroupController *cntrlr, unsigned char *streams, size_t len){ - impl_data_android_t *impl=(impl_data_android_t *) cntrlr->implData; - if(!impl->javaObject) - return; - JNIEnv *env=NULL; - bool didAttach=false; - sharedJVM->GetEnv((void **) &env, JNI_VERSION_1_6); - if(!env){ - sharedJVM->AttachCurrentThread(&env, NULL); - didAttach=true; - } + void updateParticipantAudioState(VoIPGroupController *cntrlr, int32_t userID, bool enabled){ + ImplDataAndroid *impl=(ImplDataAndroid *) cntrlr->implData; + jni::AttachAndCallVoidMethod(setParticipantAudioEnabledMethod, impl->javaObject, userID, enabled); + } + +#pragma mark - VoIPController + + uint32_t AndroidCodecToFOURCC(std::string mime){ + if(mime=="video/avc") + return CODEC_AVC; + else if(mime=="video/hevc") + return CODEC_HEVC; + else if(mime=="video/x-vnd.on2.vp8") + return CODEC_VP8; + else if(mime=="video/x-vnd.on2.vp9") + return CODEC_VP9; + return 0; + } - if(setSelfStreamsMethod){ - jbyteArray jstreams=env->NewByteArray(len); - jbyte *el=env->GetByteArrayElements(jstreams, NULL); - memcpy(el, streams, len); - env->ReleaseByteArrayElements(jstreams, el, 0); - env->CallVoidMethod(impl->javaObject, setSelfStreamsMethod, jstreams); + jlong VoIPController_nativeInit(JNIEnv* env, jobject thiz, jstring persistentStateFile) { + ImplDataAndroid* impl=new ImplDataAndroid(); + impl->javaObject=env->NewGlobalRef(thiz); + if(persistentStateFile){ + impl->persistentStateFile=jni::JavaStringToStdString(env, persistentStateFile); } + VoIPController* cntrlr=new VoIPController(); + cntrlr->implData=impl; + VoIPController::Callbacks callbacks; + callbacks.connectionStateChanged=updateConnectionState; + callbacks.signalBarCountChanged=updateSignalBarCount; + callbacks.groupCallKeyReceived=groupCallKeyReceived; + callbacks.groupCallKeySent=groupCallKeySent; + callbacks.upgradeToGroupCallRequested=callUpgradeRequestReceived; + cntrlr->SetCallbacks(callbacks); + if(!impl->persistentStateFile.empty()){ + FILE* f=fopen(impl->persistentStateFile.c_str(), "r"); + if(f){ + fseek(f, 0, SEEK_END); + size_t len=static_cast(ftell(f)); + fseek(f, 0, SEEK_SET); + if(len<1024*512 && len>0){ + char *fbuf=static_cast(malloc(len)); + fread(fbuf, 1, len, f); + std::vector state(fbuf, fbuf+len); + free(fbuf); + cntrlr->SetPersistentState(state); + } + fclose(f); + } + } + /*if(video::VideoRendererAndroid::availableDecoders.empty() || video::VideoSourceAndroid::availableEncoders.empty()){ + video::VideoRendererAndroid::availableDecoders.clear(); + video::VideoSourceAndroid::availableEncoders.clear(); + jmethodID getCodecsMethod=env->GetStaticMethodID(jniUtilitiesClass, "getSupportedVideoCodecs", "()[[Ljava/lang/String;"); + jobjectArray codecs=static_cast(env->CallStaticObjectMethod(jniUtilitiesClass, getCodecsMethod)); + jobjectArray encoders=static_cast(env->GetObjectArrayElement(codecs, 0)); + jobjectArray decoders=static_cast(env->GetObjectArrayElement(codecs, 1)); + for(jsize i=0;iGetArrayLength(encoders);i++){ + std::string codec=jni::JavaStringToStdString(env, static_cast(env->GetObjectArrayElement(encoders, i))); + uint32_t id=AndroidCodecToFOURCC(codec); + if(id) + video::VideoSourceAndroid::availableEncoders.push_back(id); + } + for(jsize i=0;iGetArrayLength(decoders);i++){ + std::string codec=jni::JavaStringToStdString(env, static_cast(env->GetObjectArrayElement(decoders, i))); + uint32_t id=AndroidCodecToFOURCC(codec); + if(id) + video::VideoRendererAndroid::availableDecoders.push_back(id); + } + jmethodID getMaxResolutionMethod=env->GetStaticMethodID(jniUtilitiesClass, "getMaxVideoResolution", "()I"); + video::VideoRendererAndroid::maxResolution=env->CallStaticIntMethod(jniUtilitiesClass, getMaxResolutionMethod); + }*/ + return (jlong)(intptr_t)cntrlr; + } + void VoIPController_nativeStart(JNIEnv* env, jobject thiz, jlong inst){ + ((VoIPController*)(intptr_t)inst)->Start(); + } - if(didAttach){ - sharedJVM->DetachCurrentThread(); - } + void VoIPController_nativeConnect(JNIEnv* env, jobject thiz, jlong inst){ + ((VoIPController*)(intptr_t)inst)->Connect(); } - void groupCallKeyReceived(VoIPController *cntrlr, const unsigned char *key){ - impl_data_android_t *impl=(impl_data_android_t *) cntrlr->implData; - if(!impl->javaObject) - return; - JNIEnv *env=NULL; - bool didAttach=false; - sharedJVM->GetEnv((void **) &env, JNI_VERSION_1_6); - if(!env){ - sharedJVM->AttachCurrentThread(&env, NULL); - didAttach=true; - } + void VoIPController_nativeSetProxy(JNIEnv* env, jobject thiz, jlong inst, jstring _address, jint port, jstring _username, jstring _password){ + ((VoIPController*)(intptr_t)inst)->SetProxy(PROXY_SOCKS5, jni::JavaStringToStdString(env, _address), (uint16_t)port, jni::JavaStringToStdString(env, _username), jni::JavaStringToStdString(env, _password)); + } - if(groupCallKeyReceivedMethod){ - jbyteArray jkey=env->NewByteArray(256); - jbyte *el=env->GetByteArrayElements(jkey, NULL); - memcpy(el, key, 256); - env->ReleaseByteArrayElements(jkey, el, 0); - env->CallVoidMethod(impl->javaObject, groupCallKeyReceivedMethod, jkey); - } + void VoIPController_nativeSetEncryptionKey(JNIEnv* env, jobject thiz, jlong inst, jbyteArray key, jboolean isOutgoing){ + jbyte* akey=env->GetByteArrayElements(key, NULL); + ((VoIPController*)(intptr_t)inst)->SetEncryptionKey((char *) akey, isOutgoing); + env->ReleaseByteArrayElements(key, akey, JNI_ABORT); + } - if(didAttach){ - sharedJVM->DetachCurrentThread(); + void VoIPController_nativeSetRemoteEndpoints(JNIEnv* env, jobject thiz, jlong inst, jobjectArray endpoints, jboolean allowP2p, jboolean tcp, jint connectionMaxLayer){ + size_t len=(size_t) env->GetArrayLength(endpoints); + std::vector eps; + /*public String ip; + public String ipv6; + public int port; + public byte[] peer_tag;*/ + jclass epClass=env->GetObjectClass(env->GetObjectArrayElement(endpoints, 0)); + jfieldID ipFld=env->GetFieldID(epClass, "ip", "Ljava/lang/String;"); + jfieldID ipv6Fld=env->GetFieldID(epClass, "ipv6", "Ljava/lang/String;"); + jfieldID portFld=env->GetFieldID(epClass, "port", "I"); + jfieldID peerTagFld=env->GetFieldID(epClass, TGVOIP_PEER_TAG_VARIABLE_NAME, "[B"); + jfieldID idFld=env->GetFieldID(epClass, "id", "J"); + int i; + for(i=0;iGetObjectArrayElement(endpoints, i); + jstring ip=(jstring) env->GetObjectField(endpoint, ipFld); + jstring ipv6=(jstring) env->GetObjectField(endpoint, ipv6Fld); + jint port=env->GetIntField(endpoint, portFld); + jlong id=env->GetLongField(endpoint, idFld); + jbyteArray peerTag=(jbyteArray) env->GetObjectField(endpoint, peerTagFld); + IPv4Address v4addr(jni::JavaStringToStdString(env, ip)); + IPv6Address v6addr("::0"); + if(ipv6 && env->GetStringLength(ipv6)){ + v6addr=IPv6Address(jni::JavaStringToStdString(env, ipv6)); + } + unsigned char pTag[16]; + if(peerTag && env->GetArrayLength(peerTag)){ + jbyte* peerTagBytes=env->GetByteArrayElements(peerTag, NULL); + memcpy(pTag, peerTagBytes, 16); + env->ReleaseByteArrayElements(peerTag, peerTagBytes, JNI_ABORT); + } + eps.push_back(Endpoint((int64_t)id, (uint16_t)port, v4addr, v6addr, tcp ? Endpoint::Type::TCP_RELAY : Endpoint::Type::UDP_RELAY, pTag)); } + ((VoIPController*)(intptr_t)inst)->SetRemoteEndpoints(eps, allowP2p, connectionMaxLayer); } - void groupCallKeySent(VoIPController *cntrlr){ - impl_data_android_t *impl=(impl_data_android_t *) cntrlr->implData; - if(!impl->javaObject) - return; - JNIEnv *env=NULL; - bool didAttach=false; - sharedJVM->GetEnv((void **) &env, JNI_VERSION_1_6); - if(!env){ - sharedJVM->AttachCurrentThread(&env, NULL); - didAttach=true; - } + void VoIPController_nativeSetNativeBufferSize(JNIEnv* env, jclass thiz, jint size){ + AudioOutputOpenSLES::nativeBufferSize=(unsigned int) size; + AudioInputOpenSLES::nativeBufferSize=(unsigned int) size; + } - if(groupCallKeySentMethod){ - env->CallVoidMethod(impl->javaObject, groupCallKeySentMethod); + void VoIPController_nativeRelease(JNIEnv* env, jobject thiz, jlong inst){ + //env->DeleteGlobalRef(AudioInputAndroid::jniClass); + + VoIPController* ctlr=((VoIPController*)(intptr_t)inst); + ImplDataAndroid* impl=(ImplDataAndroid*)ctlr->implData; + ctlr->Stop(); + std::vector state=ctlr->GetPersistentState(); + delete ctlr; + env->DeleteGlobalRef(impl->javaObject); + if(!impl->persistentStateFile.empty()){ + FILE* f=fopen(impl->persistentStateFile.c_str(), "w"); + if(f){ + fwrite(state.data(), 1, state.size(), f); + fclose(f); + } } + delete impl; + } - if(didAttach){ - sharedJVM->DetachCurrentThread(); - } + jstring VoIPController_nativeGetDebugString(JNIEnv* env, jobject thiz, jlong inst){ + std::string str=((VoIPController*)(intptr_t)inst)->GetDebugString(); + return env->NewStringUTF(str.c_str()); } - void callUpgradeRequestReceived(VoIPController* cntrlr){ - impl_data_android_t *impl=(impl_data_android_t *) cntrlr->implData; - if(!impl->javaObject) - return; - JNIEnv *env=NULL; - bool didAttach=false; - sharedJVM->GetEnv((void **) &env, JNI_VERSION_1_6); - if(!env){ - sharedJVM->AttachCurrentThread(&env, NULL); - didAttach=true; - } + void VoIPController_nativeSetNetworkType(JNIEnv* env, jobject thiz, jlong inst, jint type){ + ((VoIPController*)(intptr_t)inst)->SetNetworkType(type); + } - if(groupCallKeySentMethod){ - env->CallVoidMethod(impl->javaObject, callUpgradeRequestReceivedMethod); - } + void VoIPController_nativeSetMicMute(JNIEnv* env, jobject thiz, jlong inst, jboolean mute){ + ((VoIPController*)(intptr_t)inst)->SetMicMute(mute); + } - if(didAttach){ - sharedJVM->DetachCurrentThread(); + void VoIPController_nativeSetConfig(JNIEnv* env, jobject thiz, jlong inst, jdouble recvTimeout, jdouble initTimeout, jint dataSavingMode, jboolean enableAEC, jboolean enableNS, jboolean enableAGC, jstring logFilePath, jstring statsDumpPath, jboolean logPacketStats){ + VoIPController::Config cfg; + cfg.initTimeout=initTimeout; + cfg.recvTimeout=recvTimeout; + cfg.dataSaving=dataSavingMode; + cfg.enableAEC=enableAEC; + cfg.enableNS=enableNS; + cfg.enableAGC=enableAGC; + cfg.enableCallUpgrade=false; + cfg.logPacketStats=logPacketStats; + if(logFilePath){ + cfg.logFilePath=jni::JavaStringToStdString(env, logFilePath); + } + if(statsDumpPath){ + cfg.statsDumpFilePath=jni::JavaStringToStdString(env, statsDumpPath); } + + ((VoIPController*)(intptr_t)inst)->SetConfig(cfg); } - void updateParticipantAudioState(VoIPGroupController *cntrlr, int32_t userID, bool enabled){ - impl_data_android_t *impl=(impl_data_android_t *) cntrlr->implData; - if(!impl->javaObject) - return; - JNIEnv *env=NULL; - bool didAttach=false; - sharedJVM->GetEnv((void **) &env, JNI_VERSION_1_6); - if(!env){ - sharedJVM->AttachCurrentThread(&env, NULL); - didAttach=true; - } + void VoIPController_nativeDebugCtl(JNIEnv* env, jobject thiz, jlong inst, jint request, jint param){ + ((VoIPController*)(intptr_t)inst)->DebugCtl(request, param); + } - if(setParticipantAudioEnabledMethod){ - env->CallVoidMethod(impl->javaObject, setParticipantAudioEnabledMethod, userID, enabled); - } + jstring VoIPController_nativeGetVersion(JNIEnv* env, jclass clasz){ + return env->NewStringUTF(VoIPController::GetVersion()); + } + jlong VoIPController_nativeGetPreferredRelayID(JNIEnv* env, jclass clasz, jlong inst){ + return ((VoIPController*)(intptr_t)inst)->GetPreferredRelayID(); + } - if(didAttach){ - sharedJVM->DetachCurrentThread(); - } + jint VoIPController_nativeGetLastError(JNIEnv* env, jclass clasz, jlong inst){ + return ((VoIPController*)(intptr_t)inst)->GetLastError(); } -} -TGVOIP_FUNC(jlong, VoIPController_nativeInit, jobject thiz, jint systemVersion) { - env->GetJavaVM(&sharedJVM); - if(!AudioInputAndroid::jniClass){ - jclass cls=env->FindClass(TGVOIP_PACKAGE_PATH "/AudioRecordJNI"); - AudioInputAndroid::jniClass=(jclass) env->NewGlobalRef(cls); - AudioInputAndroid::initMethod=env->GetMethodID(cls, "init", "(IIII)V"); - AudioInputAndroid::releaseMethod=env->GetMethodID(cls, "release", "()V"); - AudioInputAndroid::startMethod=env->GetMethodID(cls, "start", "()Z"); - AudioInputAndroid::stopMethod=env->GetMethodID(cls, "stop", "()V"); + void VoIPController_nativeGetStats(JNIEnv* env, jclass clasz, jlong inst, jobject stats){ + VoIPController::TrafficStats _stats; + ((VoIPController*)(intptr_t)inst)->GetStats(&_stats); + jclass cls=env->GetObjectClass(stats); + env->SetLongField(stats, env->GetFieldID(cls, "bytesSentWifi", "J"), _stats.bytesSentWifi); + env->SetLongField(stats, env->GetFieldID(cls, "bytesSentMobile", "J"), _stats.bytesSentMobile); + env->SetLongField(stats, env->GetFieldID(cls, "bytesRecvdWifi", "J"), _stats.bytesRecvdWifi); + env->SetLongField(stats, env->GetFieldID(cls, "bytesRecvdMobile", "J"), _stats.bytesRecvdMobile); + } - cls=env->FindClass(TGVOIP_PACKAGE_PATH "/AudioTrackJNI"); - AudioOutputAndroid::jniClass=(jclass) env->NewGlobalRef(cls); - AudioOutputAndroid::initMethod=env->GetMethodID(cls, "init", "(IIII)V"); - AudioOutputAndroid::releaseMethod=env->GetMethodID(cls, "release", "()V"); - AudioOutputAndroid::startMethod=env->GetMethodID(cls, "start", "()V"); - AudioOutputAndroid::stopMethod=env->GetMethodID(cls, "stop", "()V"); + jstring VoIPController_nativeGetDebugLog(JNIEnv* env, jobject thiz, jlong inst){ + VoIPController* ctlr=((VoIPController*)(intptr_t)inst); + std::string log=ctlr->GetDebugLog(); + return env->NewStringUTF(log.c_str()); } - jclass thisClass=env->FindClass(TGVOIP_PACKAGE_PATH "/VoIPController"); - setStateMethod=env->GetMethodID(thisClass, "handleStateChange", "(I)V"); - setSignalBarsMethod=env->GetMethodID(thisClass, "handleSignalBarsChange", "(I)V"); - groupCallKeyReceivedMethod=env->GetMethodID(thisClass, "groupCallKeyReceived", "([B)V"); - groupCallKeySentMethod=env->GetMethodID(thisClass, "groupCallKeySent", "()V"); - callUpgradeRequestReceivedMethod=env->GetMethodID(thisClass, "callUpgradeRequestReceived", "()V"); + void VoIPController_nativeSetAudioOutputGainControlEnabled(JNIEnv* env, jclass clasz, jlong inst, jboolean enabled){ + ((VoIPController*)(intptr_t)inst)->SetAudioOutputGainControlEnabled(enabled); + } - if(!jniUtilitiesClass) - jniUtilitiesClass=(jclass) env->NewGlobalRef(env->FindClass(TGVOIP_PACKAGE_PATH "/JNIUtilities")); + void VoIPController_nativeSetEchoCancellationStrength(JNIEnv* env, jclass cls, jlong inst, jint strength){ + ((VoIPController*)(intptr_t)inst)->SetEchoCancellationStrength(strength); + } - impl_data_android_t* impl=(impl_data_android_t*) malloc(sizeof(impl_data_android_t)); - impl->javaObject=env->NewGlobalRef(thiz); - VoIPController* cntrlr=new VoIPController(); - cntrlr->implData=impl; - VoIPController::Callbacks callbacks; - callbacks.connectionStateChanged=updateConnectionState; - callbacks.signalBarCountChanged=updateSignalBarCount; - callbacks.groupCallKeyReceived=groupCallKeyReceived; - callbacks.groupCallKeySent=groupCallKeySent; - callbacks.upgradeToGroupCallRequested=callUpgradeRequestReceived; - cntrlr->SetCallbacks(callbacks); - return (jlong)(intptr_t)cntrlr; -} + jint VoIPController_nativeGetPeerCapabilities(JNIEnv* env, jclass cls, jlong inst){ + return ((VoIPController*)(intptr_t)inst)->GetPeerCapabilities(); + } -TGVOIP_FUNC(void, VoIPController_nativeStart, jobject thiz, jlong inst){ - ((VoIPController*)(intptr_t)inst)->Start(); -} + void VoIPController_nativeSendGroupCallKey(JNIEnv* env, jclass cls, jlong inst, jbyteArray _key){ + jbyte* key=env->GetByteArrayElements(_key, NULL); + ((VoIPController*)(intptr_t)inst)->SendGroupCallKey((unsigned char *) key); + env->ReleaseByteArrayElements(_key, key, JNI_ABORT); + } -TGVOIP_FUNC(void, VoIPController_nativeConnect, jobject thiz, jlong inst){ - ((VoIPController*)(intptr_t)inst)->Connect(); -} + void VoIPController_nativeRequestCallUpgrade(JNIEnv* env, jclass cls, jlong inst){ + ((VoIPController*)(intptr_t)inst)->RequestCallUpgrade(); + } -TGVOIP_FUNC(void, VoIPController_nativeSetProxy, jobject thiz, jlong inst, jstring _address, jint port, jstring _username, jstring _password){ - const char* address=env->GetStringUTFChars(_address, NULL); - const char* username=_username ? env->GetStringUTFChars(_username, NULL) : NULL; - const char* password=_password ? env->GetStringUTFChars(_password, NULL) : NULL; - ((VoIPController*)(intptr_t)inst)->SetProxy(PROXY_SOCKS5, address, (uint16_t)port, username ? username : "", password ? password : ""); - env->ReleaseStringUTFChars(_address, address); - if(username) - env->ReleaseStringUTFChars(_username, username); - if(password) - env->ReleaseStringUTFChars(_password, password); -} + void VoIPController_nativeSetVideoSource(JNIEnv* env, jobject thiz, jlong inst, jlong source){ + ((VoIPController*)(intptr_t)inst)->SetVideoSource((video::VideoSource*)(intptr_t)source); + } -TGVOIP_FUNC(void, VoIPController_nativeSetEncryptionKey, jobject thiz, jlong inst, jbyteArray key, jboolean isOutgoing){ - jbyte* akey=env->GetByteArrayElements(key, NULL); - ((VoIPController*)(intptr_t)inst)->SetEncryptionKey((char *) akey, isOutgoing); - env->ReleaseByteArrayElements(key, akey, JNI_ABORT); -} + void VoIPController_nativeSetVideoRenderer(JNIEnv* env, jobject thiz, jlong inst, jlong renderer){ + ((VoIPController*)(intptr_t)inst)->SetVideoRenderer((video::VideoRenderer*)(intptr_t)renderer); + } -TGVOIP_FUNC(void, VoIPController_nativeSetRemoteEndpoints, jobject thiz, jlong inst, jobjectArray endpoints, jboolean allowP2p, jboolean tcp, jint connectionMaxLayer){ - size_t len=(size_t) env->GetArrayLength(endpoints); -// voip_endpoint_t* eps=(voip_endpoint_t *) malloc(sizeof(voip_endpoint_t)*len); - std::vector eps; - /*public String ip; - public String ipv6; - public int port; - public byte[] peer_tag;*/ - jclass epClass=env->GetObjectClass(env->GetObjectArrayElement(endpoints, 0)); - jfieldID ipFld=env->GetFieldID(epClass, "ip", "Ljava/lang/String;"); - jfieldID ipv6Fld=env->GetFieldID(epClass, "ipv6", "Ljava/lang/String;"); - jfieldID portFld=env->GetFieldID(epClass, "port", "I"); - jfieldID peerTagFld=env->GetFieldID(epClass, TGVOIP_PEER_TAG_VARIABLE_NAME, "[B"); - jfieldID idFld=env->GetFieldID(epClass, "id", "J"); - int i; - for(i=0;iGetObjectArrayElement(endpoints, i); - jstring ip=(jstring) env->GetObjectField(endpoint, ipFld); - jstring ipv6=(jstring) env->GetObjectField(endpoint, ipv6Fld); - jint port=env->GetIntField(endpoint, portFld); - jlong id=env->GetLongField(endpoint, idFld); - jbyteArray peerTag=(jbyteArray) env->GetObjectField(endpoint, peerTagFld); - const char* ipChars=env->GetStringUTFChars(ip, NULL); + jboolean VoIPController_nativeNeedRate(JNIEnv* env, jclass cls, jlong inst){ + return static_cast(((VoIPController*)(intptr_t)inst)->NeedRate()); + } + + jint VoIPController_getConnectionMaxLayer(JNIEnv* env, jclass cls){ + return VoIPController::GetConnectionMaxLayer(); + } + +#pragma mark - AudioRecordJNI + + void AudioRecordJNI_nativeCallback(JNIEnv* env, jobject thiz, jobject buffer){ + jlong inst=env->GetLongField(thiz, audioRecordInstanceFld); + AudioInputAndroid* in=(AudioInputAndroid*)(intptr_t)inst; + in->HandleCallback(env, buffer); + } + +#pragma mark - AudioTrackJNI + + void AudioTrackJNI_nativeCallback(JNIEnv* env, jobject thiz, jbyteArray buffer){ + jlong inst=env->GetLongField(thiz, audioTrackInstanceFld); + AudioOutputAndroid* in=(AudioOutputAndroid*)(intptr_t)inst; + in->HandleCallback(env, buffer); + } + +#pragma mark - VoIPServerConfig + + void VoIPServerConfig_nativeSetConfig(JNIEnv* env, jclass clasz, jstring jsonString){ + ServerConfig::GetSharedInstance()->Update(jni::JavaStringToStdString(env, jsonString)); + } + +#pragma mark - Resampler + + jint Resampler_convert44to48(JNIEnv* env, jclass cls, jobject from, jobject to){ + return (jint)tgvoip::audio::Resampler::Convert44To48((int16_t *) env->GetDirectBufferAddress(from), (int16_t *) env->GetDirectBufferAddress(to), (size_t) (env->GetDirectBufferCapacity(from)/2), (size_t) (env->GetDirectBufferCapacity(to)/2)); + } + + jint Resampler_convert48to44(JNIEnv* env, jclass cls, jobject from, jobject to){ + return (jint)tgvoip::audio::Resampler::Convert48To44((int16_t *) env->GetDirectBufferAddress(from), (int16_t *) env->GetDirectBufferAddress(to), (size_t) (env->GetDirectBufferCapacity(from)/2), (size_t) (env->GetDirectBufferCapacity(to)/2)); + } + +#pragma mark - VoIPGroupController + +#ifndef TGVOIP_NO_GROUP_CALLS + jlong VoIPGroupController_nativeInit(JNIEnv* env, jobject thiz, jint timeDifference){ + ImplDataAndroid* impl=(ImplDataAndroid*) malloc(sizeof(ImplDataAndroid)); + impl->javaObject=env->NewGlobalRef(thiz); + VoIPGroupController* cntrlr=new VoIPGroupController(timeDifference); + cntrlr->implData=impl; + + VoIPGroupController::Callbacks callbacks; + callbacks.connectionStateChanged=updateConnectionState; + callbacks.updateStreams=updateGroupCallStreams; + callbacks.participantAudioStateChanged=updateParticipantAudioState; + callbacks.signalBarCountChanged=NULL; + cntrlr->SetCallbacks(callbacks); + + return (jlong)(intptr_t)cntrlr; + } + + void VoIPGroupController_nativeSetGroupCallInfo(JNIEnv* env, jclass cls, jlong inst, jbyteArray _encryptionKey, jbyteArray _reflectorGroupTag, jbyteArray _reflectorSelfTag, jbyteArray _reflectorSelfSecret, jbyteArray _reflectorSelfTagHash, jint selfUserID, jstring reflectorAddress, jstring reflectorAddressV6, jint reflectorPort){ + VoIPGroupController* ctlr=((VoIPGroupController*)(intptr_t)inst); + jbyte* encryptionKey=env->GetByteArrayElements(_encryptionKey, NULL); + jbyte* reflectorGroupTag=env->GetByteArrayElements(_reflectorGroupTag, NULL); + jbyte* reflectorSelfTag=env->GetByteArrayElements(_reflectorSelfTag, NULL); + jbyte* reflectorSelfSecret=env->GetByteArrayElements(_reflectorSelfSecret, NULL); + jbyte* reflectorSelfTagHash=env->GetByteArrayElements(_reflectorSelfTagHash, NULL); + + + const char* ipChars=env->GetStringUTFChars(reflectorAddress, NULL); std::string ipLiteral(ipChars); IPv4Address v4addr(ipLiteral); IPv6Address v6addr("::0"); - env->ReleaseStringUTFChars(ip, ipChars); - if(ipv6 && env->GetStringLength(ipv6)){ - const char* ipv6Chars=env->GetStringUTFChars(ipv6, NULL); + env->ReleaseStringUTFChars(reflectorAddress, ipChars); + if(reflectorAddressV6 && env->GetStringLength(reflectorAddressV6)){ + const char* ipv6Chars=env->GetStringUTFChars(reflectorAddressV6, NULL); v6addr=IPv6Address(ipv6Chars); - env->ReleaseStringUTFChars(ipv6, ipv6Chars); + env->ReleaseStringUTFChars(reflectorAddressV6, ipv6Chars); } - unsigned char pTag[16]; - if(peerTag && env->GetArrayLength(peerTag)){ - jbyte* peerTagBytes=env->GetByteArrayElements(peerTag, NULL); - memcpy(pTag, peerTagBytes, 16); - env->ReleaseByteArrayElements(peerTag, peerTagBytes, JNI_ABORT); - } - eps.push_back(Endpoint((int64_t)id, (uint16_t)port, v4addr, v6addr, (char) (tcp ? Endpoint::TYPE_TCP_RELAY : Endpoint::TYPE_UDP_RELAY), pTag)); - } - ((VoIPController*)(intptr_t)inst)->SetRemoteEndpoints(eps, allowP2p, connectionMaxLayer); -} + ctlr->SetGroupCallInfo((unsigned char *) encryptionKey, (unsigned char *) reflectorGroupTag, (unsigned char *) reflectorSelfTag, (unsigned char *) reflectorSelfSecret, (unsigned char*) reflectorSelfTagHash, selfUserID, v4addr, v6addr, (uint16_t)reflectorPort); -TGVOIP_FUNC(void, VoIPController_nativeSetNativeBufferSize, jclass thiz, jint size){ - AudioOutputOpenSLES::nativeBufferSize=(unsigned int) size; - AudioInputOpenSLES::nativeBufferSize=(unsigned int) size; -} - -TGVOIP_FUNC(void, VoIPController_nativeRelease, jobject thiz, jlong inst){ - //env->DeleteGlobalRef(AudioInputAndroid::jniClass); - - VoIPController* ctlr=((VoIPController*)(intptr_t)inst); - impl_data_android_t* impl=(impl_data_android_t*)ctlr->implData; - ctlr->Stop(); - delete ctlr; - env->DeleteGlobalRef(impl->javaObject); - free(impl); -} + env->ReleaseByteArrayElements(_encryptionKey, encryptionKey, JNI_ABORT); + env->ReleaseByteArrayElements(_reflectorGroupTag, reflectorGroupTag, JNI_ABORT); + env->ReleaseByteArrayElements(_reflectorSelfTag, reflectorSelfTag, JNI_ABORT); + env->ReleaseByteArrayElements(_reflectorSelfSecret, reflectorSelfSecret, JNI_ABORT); + env->ReleaseByteArrayElements(_reflectorSelfTagHash, reflectorSelfTagHash, JNI_ABORT); + } + void VoIPGroupController_nativeAddGroupCallParticipant(JNIEnv* env, jclass cls, jlong inst, jint userID, jbyteArray _memberTagHash, jbyteArray _streams){ + VoIPGroupController* ctlr=((VoIPGroupController*)(intptr_t)inst); + jbyte* memberTagHash=env->GetByteArrayElements(_memberTagHash, NULL); + jbyte* streams=_streams ? env->GetByteArrayElements(_streams, NULL) : NULL; -TGVOIP_FUNC(void, AudioRecordJNI_nativeCallback, jobject thiz, jobject buffer){ - if(!audioRecordInstanceFld) - audioRecordInstanceFld=env->GetFieldID(env->GetObjectClass(thiz), "nativeInst", "J"); + ctlr->AddGroupCallParticipant(userID, (unsigned char *) memberTagHash, (unsigned char *) streams, (size_t) env->GetArrayLength(_streams)); - jlong inst=env->GetLongField(thiz, audioRecordInstanceFld); - AudioInputAndroid* in=(AudioInputAndroid*)(intptr_t)inst; - in->HandleCallback(env, buffer); -} + env->ReleaseByteArrayElements(_memberTagHash, memberTagHash, JNI_ABORT); + if(_streams) + env->ReleaseByteArrayElements(_streams, streams, JNI_ABORT); -TGVOIP_FUNC(void, AudioTrackJNI_nativeCallback, jobject thiz, jbyteArray buffer){ - if(!audioTrackInstanceFld) - audioTrackInstanceFld=env->GetFieldID(env->GetObjectClass(thiz), "nativeInst", "J"); + } - jlong inst=env->GetLongField(thiz, audioTrackInstanceFld); - AudioOutputAndroid* in=(AudioOutputAndroid*)(intptr_t)inst; - in->HandleCallback(env, buffer); -} + void VoIPGroupController_nativeRemoveGroupCallParticipant(JNIEnv* env, jclass cls, jlong inst, jint userID){ + VoIPGroupController* ctlr=((VoIPGroupController*)(intptr_t)inst); + ctlr->RemoveGroupCallParticipant(userID); + } -TGVOIP_FUNC(jstring, VoIPController_nativeGetDebugString, jobject thiz, jlong inst){ - std::string str=((VoIPController*)(intptr_t)inst)->GetDebugString(); - return env->NewStringUTF(str.c_str()); -} + jfloat VoIPGroupController_nativeGetParticipantAudioLevel(JNIEnv* env, jclass cls, jlong inst, jint userID){ + return ((VoIPGroupController*)(intptr_t)inst)->GetParticipantAudioLevel(userID); + } -TGVOIP_FUNC(void, VoIPController_nativeSetNetworkType, jobject thiz, jlong inst, jint type){ - ((VoIPController*)(intptr_t)inst)->SetNetworkType(type); -} + void VoIPGroupController_nativeSetParticipantVolume(JNIEnv* env, jclass cls, jlong inst, jint userID, jfloat volume){ + ((VoIPGroupController*)(intptr_t)inst)->SetParticipantVolume(userID, volume); + } -TGVOIP_FUNC(void, VoIPController_nativeSetMicMute, jobject thiz, jlong inst, jboolean mute){ - ((VoIPController*)(intptr_t)inst)->SetMicMute(mute); -} + jbyteArray VoIPGroupController_getInitialStreams(JNIEnv* env, jclass cls){ + unsigned char buf[1024]; + size_t len=VoIPGroupController::GetInitialStreams(buf, sizeof(buf)); + jbyteArray arr=env->NewByteArray(len); + jbyte* arrElems=env->GetByteArrayElements(arr, NULL); + memcpy(arrElems, buf, len); + env->ReleaseByteArrayElements(arr, arrElems, 0); + return arr; + } -TGVOIP_FUNC(void, VoIPController_nativeSetConfig, jobject thiz, jlong inst, jdouble recvTimeout, jdouble initTimeout, jint dataSavingMode, jboolean enableAEC, jboolean enableNS, jboolean enableAGC, jstring logFilePath, jstring statsDumpPath){ - VoIPController::Config cfg; - cfg.initTimeout=initTimeout; - cfg.recvTimeout=recvTimeout; - cfg.dataSaving=dataSavingMode; - cfg.enableAEC=enableAEC; - cfg.enableNS=enableNS; - cfg.enableAGC=enableAGC; - cfg.enableCallUpgrade=false; - if(logFilePath){ - char* path=(char *) env->GetStringUTFChars(logFilePath, NULL); - cfg.logFilePath=std::string(path); - env->ReleaseStringUTFChars(logFilePath, path); - } - if(statsDumpPath){ - char* path=(char *) env->GetStringUTFChars(statsDumpPath, NULL); - cfg.statsDumpFilePath=std::string(path); - env->ReleaseStringUTFChars(logFilePath, path); - } - ((VoIPController*)(intptr_t)inst)->SetConfig(cfg); -} + void VoIPGroupController_nativeSetParticipantStreams(JNIEnv* env, jclass cls, jlong inst, jint userID, jbyteArray _streams){ + jbyte* streams=env->GetByteArrayElements(_streams, NULL); -TGVOIP_FUNC(void, VoIPController_nativeDebugCtl, jobject thiz, jlong inst, jint request, jint param){ - ((VoIPController*)(intptr_t)inst)->DebugCtl(request, param); -} + ((VoIPGroupController*)(intptr_t)inst)->SetParticipantStreams(userID, (unsigned char *) streams, (size_t) env->GetArrayLength(_streams)); -TGVOIP_FUNC(jstring, VoIPController_nativeGetVersion, jclass clasz){ - return env->NewStringUTF(VoIPController::GetVersion()); -} + env->ReleaseByteArrayElements(_streams, streams, JNI_ABORT); + } +#endif -TGVOIP_FUNC(jlong, VoIPController_nativeGetPreferredRelayID, jclass clasz, jlong inst){ - return ((VoIPController*)(intptr_t)inst)->GetPreferredRelayID(); -} +#pragma mark - VideoSource -TGVOIP_FUNC(jint, VoIPController_nativeGetLastError, jclass clasz, jlong inst){ - return ((VoIPController*)(intptr_t)inst)->GetLastError(); -} + jlong VideoSource_nativeInit(JNIEnv* env, jobject thiz){ + return (jlong)(intptr_t)new video::VideoSourceAndroid(env->NewGlobalRef(thiz)); + } -TGVOIP_FUNC(void, VoIPController_nativeGetStats, jclass clasz, jlong inst, jobject stats){ - VoIPController::TrafficStats _stats; - ((VoIPController*)(intptr_t)inst)->GetStats(&_stats); - jclass cls=env->GetObjectClass(stats); - env->SetLongField(stats, env->GetFieldID(cls, "bytesSentWifi", "J"), _stats.bytesSentWifi); - env->SetLongField(stats, env->GetFieldID(cls, "bytesSentMobile", "J"), _stats.bytesSentMobile); - env->SetLongField(stats, env->GetFieldID(cls, "bytesRecvdWifi", "J"), _stats.bytesRecvdWifi); - env->SetLongField(stats, env->GetFieldID(cls, "bytesRecvdMobile", "J"), _stats.bytesRecvdMobile); -} + void VideoSource_nativeRelease(JNIEnv* env, jobject thiz, jlong inst){ + delete (video::VideoSource*)(intptr_t)inst; + } -TGVOIP_FUNC(void, VoIPServerConfig_nativeSetConfig, jclass clasz, jobjectArray keys, jobjectArray values){ - std::map config; - int len=env->GetArrayLength(keys); - int i; - for(i=0;iGetObjectArrayElement(keys, i); - jstring jval=(jstring)env->GetObjectArrayElement(values, i); - if(jkey==NULL|| jval==NULL) - continue; - const char* ckey=env->GetStringUTFChars(jkey, NULL); - const char* cval=env->GetStringUTFChars(jval, NULL); - std::string key(ckey); - std::string val(cval); - env->ReleaseStringUTFChars(jkey, ckey); - env->ReleaseStringUTFChars(jval, cval); - config[key]=val; - } - ServerConfig::GetSharedInstance()->Update(config); -} + void VideoSource_nativeSetVideoStreamParameters(JNIEnv* env, jobject thiz, jlong inst, jobjectArray _csd, jint width, jint height){ + std::vector csd; + if(_csd){ + for(int i=0; iGetArrayLength(_csd); i++){ + jobject _buf=env->GetObjectArrayElement(_csd, i); + size_t len=static_cast(env->GetDirectBufferCapacity(_buf)); + Buffer buf(len); + buf.CopyFrom(env->GetDirectBufferAddress(_buf), 0, len); + csd.push_back(std::move(buf)); + } + } + ((video::VideoSourceAndroid*)(intptr_t)inst)->SetStreamParameters(std::move(csd), width, height); + } -TGVOIP_FUNC(jstring, VoIPController_nativeGetDebugLog, jobject thiz, jlong inst){ - VoIPController* ctlr=((VoIPController*)(intptr_t)inst); - std::string log=ctlr->GetDebugLog(); - return env->NewStringUTF(log.c_str()); -} + void VideoSource_nativeSendFrame(JNIEnv* env, jobject thiz, jlong inst, jobject buffer, jint offset, jint length, jint flags){ + size_t bufsize=(size_t)env->GetDirectBufferCapacity(buffer); + Buffer buf(static_cast(length)); + buf.CopyFrom(((char*)env->GetDirectBufferAddress(buffer))+offset, 0, static_cast(length)); + ((video::VideoSourceAndroid*)(intptr_t)inst)->SendFrame(std::move(buf), static_cast(flags)); + } -TGVOIP_FUNC(void, VoIPController_nativeSetAudioOutputGainControlEnabled, jclass clasz, jlong inst, jboolean enabled){ - ((VoIPController*)(intptr_t)inst)->SetAudioOutputGainControlEnabled(enabled); -} +#pragma mark - VideoRenderer -TGVOIP_FUNC(void, VoIPController_nativeSetEchoCancellationStrength, jclass cls, jlong inst, jint strength){ - ((VoIPController*)(intptr_t)inst)->SetEchoCancellationStrength(strength); + jlong VideoRenderer_nativeInit(JNIEnv* env, jobject thiz){ + return (jlong)(intptr_t)new video::VideoRendererAndroid(env->NewGlobalRef(thiz)); + } } -TGVOIP_FUNC(jint, Resampler_convert44to48, jclass cls, jobject from, jobject to){ - return tgvoip::audio::Resampler::Convert44To48((int16_t *) env->GetDirectBufferAddress(from), (int16_t *) env->GetDirectBufferAddress(to), (size_t) (env->GetDirectBufferCapacity(from)/2), (size_t) (env->GetDirectBufferCapacity(to)/2)); -} +extern "C" void tgvoipRegisterNatives(JNIEnv* env){ + jclass controller=env->FindClass(TGVOIP_PACKAGE_PATH "/VoIPController"); + jclass groupController=env->FindClass(TGVOIP_PACKAGE_PATH "/VoIPGroupController"); + if(env->ExceptionCheck()){ + env->ExceptionClear(); // is returning NULL from FindClass not enough? + } + jclass audioRecordJNI=env->FindClass(TGVOIP_PACKAGE_PATH "/AudioRecordJNI"); + jclass audioTrackJNI=env->FindClass(TGVOIP_PACKAGE_PATH "/AudioTrackJNI"); + jclass serverConfig=env->FindClass(TGVOIP_PACKAGE_PATH "/VoIPServerConfig"); + jclass resampler=env->FindClass(TGVOIP_PACKAGE_PATH "/Resampler"); + jclass videoSource=env->FindClass(TGVOIP_PACKAGE_PATH "/VideoSource"); + if(env->ExceptionCheck()){ + env->ExceptionClear(); // is returning NULL from FindClass not enough? + } + jclass videoRenderer=env->FindClass(TGVOIP_PACKAGE_PATH "/VideoRenderer"); + if(env->ExceptionCheck()){ + env->ExceptionClear(); // is returning NULL from FindClass not enough? + } + assert(controller && audioRecordJNI && audioTrackJNI && serverConfig && resampler); -TGVOIP_FUNC(jint, Resampler_convert48to44, jclass cls, jobject from, jobject to){ - return tgvoip::audio::Resampler::Convert48To44((int16_t *) env->GetDirectBufferAddress(from), (int16_t *) env->GetDirectBufferAddress(to), (size_t) (env->GetDirectBufferCapacity(from)/2), (size_t) (env->GetDirectBufferCapacity(to)/2)); -} + audioRecordInstanceFld=env->GetFieldID(audioRecordJNI, "nativeInst", "J"); + audioTrackInstanceFld=env->GetFieldID(audioTrackJNI, "nativeInst", "J"); -#ifndef TGVOIP_NO_GROUP_CALLS -TGVOIP_FUNC(jlong, VoIPGroupController_nativeInit, jobject thiz, jint timeDifference){ env->GetJavaVM(&sharedJVM); if(!AudioInputAndroid::jniClass){ jclass cls=env->FindClass(TGVOIP_PACKAGE_PATH "/AudioRecordJNI"); @@ -476,6 +560,7 @@ TGVOIP_FUNC(jlong, VoIPGroupController_nativeInit, jobject thiz, jint timeDiffer AudioInputAndroid::releaseMethod=env->GetMethodID(cls, "release", "()V"); AudioInputAndroid::startMethod=env->GetMethodID(cls, "start", "()Z"); AudioInputAndroid::stopMethod=env->GetMethodID(cls, "stop", "()V"); + AudioInputAndroid::getEnabledEffectsMaskMethod=env->GetMethodID(cls, "getEnabledEffectsMask", "()I"); cls=env->FindClass(TGVOIP_PACKAGE_PATH "/AudioTrackJNI"); AudioOutputAndroid::jniClass=(jclass) env->NewGlobalRef(cls); @@ -483,110 +568,117 @@ TGVOIP_FUNC(jlong, VoIPGroupController_nativeInit, jobject thiz, jint timeDiffer AudioOutputAndroid::releaseMethod=env->GetMethodID(cls, "release", "()V"); AudioOutputAndroid::startMethod=env->GetMethodID(cls, "start", "()V"); AudioOutputAndroid::stopMethod=env->GetMethodID(cls, "stop", "()V"); - } - - setStateMethod=env->GetMethodID(env->GetObjectClass(thiz), "handleStateChange", "(I)V"); - setParticipantAudioEnabledMethod=env->GetMethodID(env->GetObjectClass(thiz), "setParticipantAudioEnabled", "(IZ)V"); - setSelfStreamsMethod=env->GetMethodID(env->GetObjectClass(thiz), "setSelfStreams", "([B)V"); - - impl_data_android_t* impl=(impl_data_android_t*) malloc(sizeof(impl_data_android_t)); - impl->javaObject=env->NewGlobalRef(thiz); - VoIPGroupController* cntrlr=new VoIPGroupController(timeDifference); - cntrlr->implData=impl; - - VoIPGroupController::Callbacks callbacks; - callbacks.connectionStateChanged=updateConnectionState; - callbacks.updateStreams=updateGroupCallStreams; - callbacks.participantAudioStateChanged=updateParticipantAudioState; - callbacks.signalBarCountChanged=NULL; - cntrlr->SetCallbacks(callbacks); - - return (jlong)(intptr_t)cntrlr; -} - -TGVOIP_FUNC(void, VoIPGroupController_nativeSetGroupCallInfo, jclass cls, jlong inst, jbyteArray _encryptionKey, jbyteArray _reflectorGroupTag, jbyteArray _reflectorSelfTag, jbyteArray _reflectorSelfSecret, jbyteArray _reflectorSelfTagHash, jint selfUserID, jstring reflectorAddress, jstring reflectorAddressV6, jint reflectorPort){ - VoIPGroupController* ctlr=((VoIPGroupController*)(intptr_t)inst); - jbyte* encryptionKey=env->GetByteArrayElements(_encryptionKey, NULL); - jbyte* reflectorGroupTag=env->GetByteArrayElements(_reflectorGroupTag, NULL); - jbyte* reflectorSelfTag=env->GetByteArrayElements(_reflectorSelfTag, NULL); - jbyte* reflectorSelfSecret=env->GetByteArrayElements(_reflectorSelfSecret, NULL); - jbyte* reflectorSelfTagHash=env->GetByteArrayElements(_reflectorSelfTagHash, NULL); - - - const char* ipChars=env->GetStringUTFChars(reflectorAddress, NULL); - std::string ipLiteral(ipChars); - IPv4Address v4addr(ipLiteral); - IPv6Address v6addr("::0"); - env->ReleaseStringUTFChars(reflectorAddress, ipChars); - if(reflectorAddressV6 && env->GetStringLength(reflectorAddressV6)){ - const char* ipv6Chars=env->GetStringUTFChars(reflectorAddressV6, NULL); - v6addr=IPv6Address(ipv6Chars); - env->ReleaseStringUTFChars(reflectorAddressV6, ipv6Chars); - } - ctlr->SetGroupCallInfo((unsigned char *) encryptionKey, (unsigned char *) reflectorGroupTag, (unsigned char *) reflectorSelfTag, (unsigned char *) reflectorSelfSecret, (unsigned char*) reflectorSelfTagHash, selfUserID, v4addr, v6addr, (uint16_t)reflectorPort); - - env->ReleaseByteArrayElements(_encryptionKey, encryptionKey, JNI_ABORT); - env->ReleaseByteArrayElements(_reflectorGroupTag, reflectorGroupTag, JNI_ABORT); - env->ReleaseByteArrayElements(_reflectorSelfTag, reflectorSelfTag, JNI_ABORT); - env->ReleaseByteArrayElements(_reflectorSelfSecret, reflectorSelfSecret, JNI_ABORT); - env->ReleaseByteArrayElements(_reflectorSelfTagHash, reflectorSelfTagHash, JNI_ABORT); -} - -TGVOIP_FUNC(void, VoIPGroupController_nativeAddGroupCallParticipant, jclass cls, jlong inst, jint userID, jbyteArray _memberTagHash, jbyteArray _streams){ - VoIPGroupController* ctlr=((VoIPGroupController*)(intptr_t)inst); - jbyte* memberTagHash=env->GetByteArrayElements(_memberTagHash, NULL); - jbyte* streams=_streams ? env->GetByteArrayElements(_streams, NULL) : NULL; - ctlr->AddGroupCallParticipant(userID, (unsigned char *) memberTagHash, (unsigned char *) streams, (size_t) env->GetArrayLength(_streams)); - - env->ReleaseByteArrayElements(_memberTagHash, memberTagHash, JNI_ABORT); - if(_streams) - env->ReleaseByteArrayElements(_streams, streams, JNI_ABORT); - -} - -TGVOIP_FUNC(void, VoIPGroupController_nativeRemoveGroupCallParticipant, jclass cls, jlong inst, jint userID){ - VoIPGroupController* ctlr=((VoIPGroupController*)(intptr_t)inst); - ctlr->RemoveGroupCallParticipant(userID); -} - -TGVOIP_FUNC(jfloat, VoIPGroupController_nativeGetParticipantAudioLevel, jclass cls, jlong inst, jint userID){ - return ((VoIPGroupController*)(intptr_t)inst)->GetParticipantAudioLevel(userID); -} - -TGVOIP_FUNC(void, VoIPGroupController_nativeSetParticipantVolume, jclass cls, jlong inst, jint userID, jfloat volume){ - ((VoIPGroupController*)(intptr_t)inst)->SetParticipantVolume(userID, volume); -} - -TGVOIP_FUNC(jbyteArray, VoIPGroupController_getInitialStreams, jclass cls){ - unsigned char buf[1024]; - size_t len=VoIPGroupController::GetInitialStreams(buf, sizeof(buf)); - jbyteArray arr=env->NewByteArray(len); - jbyte* arrElems=env->GetByteArrayElements(arr, NULL); - memcpy(arrElems, buf, len); - env->ReleaseByteArrayElements(arr, arrElems, 0); - return arr; -} + if(videoRenderer){ + video::VideoRendererAndroid::decodeAndDisplayMethod=env->GetMethodID(videoRenderer, "decodeAndDisplay", "(Ljava/nio/ByteBuffer;IJ)V"); + video::VideoRendererAndroid::resetMethod=env->GetMethodID(videoRenderer, "reset", "(Ljava/lang/String;II[[B)V"); + video::VideoRendererAndroid::setStreamEnabledMethod=env->GetMethodID(videoRenderer, "setStreamEnabled", "(Z)V"); + } + } -TGVOIP_FUNC(void, VoIPGroupController_nativeSetParticipantStreams, jclass cls, jlong inst, jint userID, jbyteArray _streams){ - jbyte* streams=env->GetByteArrayElements(_streams, NULL); + setStateMethod=env->GetMethodID(controller, "handleStateChange", "(I)V"); + setSignalBarsMethod=env->GetMethodID(controller, "handleSignalBarsChange", "(I)V"); + groupCallKeyReceivedMethod=env->GetMethodID(controller, "groupCallKeyReceived", "([B)V"); + groupCallKeySentMethod=env->GetMethodID(controller, "groupCallKeySent", "()V"); + callUpgradeRequestReceivedMethod=env->GetMethodID(controller, "callUpgradeRequestReceived", "()V"); - ((VoIPGroupController*)(intptr_t)inst)->SetParticipantStreams(userID, (unsigned char *) streams, (size_t) env->GetArrayLength(_streams)); + if(!jniUtilitiesClass) + jniUtilitiesClass=(jclass) env->NewGlobalRef(env->FindClass(TGVOIP_PACKAGE_PATH "/JNIUtilities")); - env->ReleaseByteArrayElements(_streams, streams, JNI_ABORT); -} + // VoIPController + JNINativeMethod controllerMethods[]={ + {"nativeInit", "(Ljava/lang/String;)J", (void*)&tgvoip::VoIPController_nativeInit}, + {"nativeStart", "(J)V", (void*)&tgvoip::VoIPController_nativeStart}, + {"nativeConnect", "(J)V", (void*)&tgvoip::VoIPController_nativeConnect}, + {"nativeSetProxy", "(JLjava/lang/String;ILjava/lang/String;Ljava/lang/String;)V", (void*)&tgvoip::VoIPController_nativeSetProxy}, + {"nativeSetEncryptionKey", "(J[BZ)V", (void*)&tgvoip::VoIPController_nativeSetEncryptionKey}, + {"nativeSetRemoteEndpoints", "(J[L" TGVOIP_ENDPOINT_CLASS ";ZZI)V", (void*)&tgvoip::VoIPController_nativeSetRemoteEndpoints}, + {"nativeSetNativeBufferSize", "(I)V", (void*)&tgvoip::VoIPController_nativeSetNativeBufferSize}, + {"nativeRelease", "(J)V", (void*)&tgvoip::VoIPController_nativeRelease}, + {"nativeGetDebugString", "(J)Ljava/lang/String;", (void*)&tgvoip::VoIPController_nativeGetDebugString}, + {"nativeSetNetworkType", "(JI)V", (void*)&tgvoip::VoIPController_nativeSetNetworkType}, + {"nativeSetMicMute", "(JZ)V", (void*)&tgvoip::VoIPController_nativeSetMicMute}, + {"nativeSetConfig", "(JDDIZZZLjava/lang/String;Ljava/lang/String;Z)V", (void*)&tgvoip::VoIPController_nativeSetConfig}, + {"nativeDebugCtl", "(JII)V", (void*)&tgvoip::VoIPController_nativeDebugCtl}, + {"nativeGetVersion", "()Ljava/lang/String;", (void*)&tgvoip::VoIPController_nativeGetVersion}, + {"nativeGetPreferredRelayID", "(J)J", (void*)&tgvoip::VoIPController_nativeGetPreferredRelayID}, + {"nativeGetLastError", "(J)I", (void*)&tgvoip::VoIPController_nativeGetLastError}, + {"nativeGetStats", "(JL" TGVOIP_PACKAGE_PATH "/VoIPController$Stats;)V", (void*)&tgvoip::VoIPController_nativeGetStats}, + {"nativeGetDebugLog", "(J)Ljava/lang/String;", (void*)&tgvoip::VoIPController_nativeGetDebugLog}, + {"nativeSetAudioOutputGainControlEnabled", "(JZ)V", (void*)&tgvoip::VoIPController_nativeSetAudioOutputGainControlEnabled}, + {"nativeSetEchoCancellationStrength", "(JI)V", (void*)&tgvoip::VoIPController_nativeSetEchoCancellationStrength}, + {"nativeGetPeerCapabilities", "(J)I", (void*)&tgvoip::VoIPController_nativeGetPeerCapabilities}, + {"nativeSendGroupCallKey", "(J[B)V", (void*)&tgvoip::VoIPController_nativeSendGroupCallKey}, + {"nativeRequestCallUpgrade", "(J)V", (void*)&tgvoip::VoIPController_nativeRequestCallUpgrade}, + {"nativeNeedRate", "(J)Z", (void*)&tgvoip::VoIPController_nativeNeedRate}, + {"getConnectionMaxLayer", "()I", (void*)&tgvoip::VoIPController_getConnectionMaxLayer}, + //{"nativeSetVideoSource", "(JJ)V", (void*)&tgvoip::VoIPController_nativeSetVideoSource}, + //{"nativeSetVideoRenderer", "(JJ)V", (void*)&tgvoip::VoIPController_nativeSetVideoRenderer} + }; + env->RegisterNatives(controller, controllerMethods, sizeof(controllerMethods)/sizeof(JNINativeMethod)); + + // VoIPGroupController +#ifndef TGVOIP_NO_GROUP_CALLS + if(groupController){ + setStateMethod=env->GetMethodID(groupController, "handleStateChange", "(I)V"); + setParticipantAudioEnabledMethod=env->GetMethodID(groupController, "setParticipantAudioEnabled", "(IZ)V"); + setSelfStreamsMethod=env->GetMethodID(groupController, "setSelfStreams", "([B)V"); + + JNINativeMethod groupControllerMethods[]={ + {"nativeInit", "(I)J", (void*)&tgvoip::VoIPGroupController_nativeInit}, + {"nativeSetGroupCallInfo", "(J[B[B[B[B[BILjava/lang/String;Ljava/lang/String;I)V", (void*)&tgvoip::VoIPGroupController_nativeSetGroupCallInfo}, + {"nativeAddGroupCallParticipant", "(JI[B[B)V", (void*)&tgvoip::VoIPGroupController_nativeAddGroupCallParticipant}, + {"nativeRemoveGroupCallParticipant", "(JI)V", (void*)&tgvoip::VoIPGroupController_nativeRemoveGroupCallParticipant}, + {"nativeGetParticipantAudioLevel", "(JI)F", (void*)&tgvoip::VoIPGroupController_nativeGetParticipantAudioLevel}, + {"nativeSetParticipantVolume", "(JIF)V", (void*)&tgvoip::VoIPGroupController_nativeSetParticipantVolume}, + {"getInitialStreams", "()[B", (void*)&tgvoip::VoIPGroupController_getInitialStreams}, + {"nativeSetParticipantStreams", "(JI[B)V", (void*)&tgvoip::VoIPGroupController_nativeSetParticipantStreams} + }; + env->RegisterNatives(groupController, groupControllerMethods, sizeof(groupControllerMethods)/sizeof(JNINativeMethod)); + } #endif -TGVOIP_FUNC(jint, VoIPController_nativeGetPeerCapabilities, jclass cls, jlong inst){ - return ((VoIPController*)(intptr_t)inst)->GetPeerCapabilities(); -} + // AudioRecordJNI + JNINativeMethod audioRecordMethods[]={ + {"nativeCallback", "(Ljava/nio/ByteBuffer;)V", (void*)&tgvoip::AudioRecordJNI_nativeCallback} + }; + env->RegisterNatives(audioRecordJNI, audioRecordMethods, sizeof(audioRecordMethods)/sizeof(JNINativeMethod)); + + // AudioTrackJNI + JNINativeMethod audioTrackMethods[]={ + {"nativeCallback", "([B)V", (void*)&tgvoip::AudioTrackJNI_nativeCallback} + }; + env->RegisterNatives(audioTrackJNI, audioTrackMethods, sizeof(audioTrackMethods)/sizeof(JNINativeMethod)); + + // VoIPServerConfig + JNINativeMethod serverConfigMethods[]={ + {"nativeSetConfig", "(Ljava/lang/String;)V", (void*)&tgvoip::VoIPServerConfig_nativeSetConfig} + }; + env->RegisterNatives(serverConfig, serverConfigMethods, sizeof(serverConfigMethods)/sizeof(JNINativeMethod)); + + // Resampler + JNINativeMethod resamplerMethods[]={ + {"convert44to48", "(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I", (void*)&tgvoip::Resampler_convert44to48}, + {"convert48to44", "(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I", (void*)&tgvoip::Resampler_convert48to44} + }; + env->RegisterNatives(resampler, resamplerMethods, sizeof(resamplerMethods)/sizeof(JNINativeMethod)); + + if(videoSource){ + // VideoSource + JNINativeMethod videoSourceMethods[]={ + {"nativeInit", "()J", (void *) &tgvoip::VideoSource_nativeInit}, + {"nativeRelease", "(J)V", (void *) &tgvoip::VideoSource_nativeRelease}, + {"nativeSetVideoStreamParameters", "(J[Ljava/nio/ByteBuffer;II)V", (void *) &tgvoip::VideoSource_nativeSetVideoStreamParameters}, + {"nativeSendFrame", "(JLjava/nio/ByteBuffer;III)V", (void *) &tgvoip::VideoSource_nativeSendFrame} + }; + env->RegisterNatives(videoSource, videoSourceMethods, sizeof(videoSourceMethods)/sizeof(JNINativeMethod)); + } -TGVOIP_FUNC(void, VoIPController_nativeSendGroupCallKey, jclass cls, jlong inst, jbyteArray _key){ - jbyte* key=env->GetByteArrayElements(_key, NULL); - ((VoIPController*)(intptr_t)inst)->SendGroupCallKey((unsigned char *) key); - env->ReleaseByteArrayElements(_key, key, JNI_ABORT); + if(videoRenderer){ + // VideoRenderer + JNINativeMethod videoRendererMethods[]={ + {"nativeInit", "()J", (void *) &tgvoip::VideoRenderer_nativeInit} + }; + env->RegisterNatives(videoRenderer, videoRendererMethods, sizeof(videoRendererMethods)/sizeof(JNINativeMethod)); + } } - -TGVOIP_FUNC(void, VoIPController_nativeRequestCallUpgrade, jclass cls, jlong inst){ - ((VoIPController*)(intptr_t)inst)->RequestCallUpgrade(); -} \ No newline at end of file diff --git a/libtgvoip/client/android/tg_voip_jni.h b/libtgvoip/client/android/tg_voip_jni.h new file mode 100644 index 0000000..8c85b69 --- /dev/null +++ b/libtgvoip/client/android/tg_voip_jni.h @@ -0,0 +1,18 @@ +// +// Created by Grishka on 14.08.2018. +// + +#ifndef TELEGRAM_TG_VOIP_JNI_H +#define TELEGRAM_TG_VOIP_JNI_H + +#include + +#ifdef __cplusplus +extern "C"{ +#endif +void tgvoipRegisterNatives(JNIEnv* env); +#ifdef __cplusplus +} +#endif + +#endif //TELEGRAM_TG_VOIP_JNI_H diff --git a/libtgvoip/configure b/libtgvoip/configure index 0a40189..719376e 100755 --- a/libtgvoip/configure +++ b/libtgvoip/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for libtgvoip 2.2.4. +# Generated by GNU Autoconf 2.69 for libtgvoip 2.4.2. # # Report bugs to . # @@ -590,8 +590,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='libtgvoip' PACKAGE_TARNAME='libtgvoip' -PACKAGE_VERSION='2.2.4' -PACKAGE_STRING='libtgvoip 2.2.4' +PACKAGE_VERSION='2.4.2' +PACKAGE_STRING='libtgvoip 2.4.2' PACKAGE_BUGREPORT='https://github.com/grishka/libtgvoip/issues' PACKAGE_URL='' @@ -1360,7 +1360,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures libtgvoip 2.2.4 to adapt to many kinds of systems. +\`configure' configures libtgvoip 2.4.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1430,7 +1430,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libtgvoip 2.2.4:";; + short | recursive ) echo "Configuration of libtgvoip 2.4.2:";; esac cat <<\_ACEOF @@ -1552,7 +1552,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libtgvoip configure 2.2.4 +libtgvoip configure 2.4.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2264,7 +2264,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libtgvoip $as_me 2.2.4, which was +It was created by libtgvoip $as_me 2.4.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3130,7 +3130,7 @@ fi # Define the identity of the package. PACKAGE='libtgvoip' - VERSION='2.2.4' + VERSION='2.4.2' cat >>confdefs.h <<_ACEOF @@ -3270,8 +3270,8 @@ esac -macro_version='2.4.6' -macro_revision='2.4.6' +macro_version='2.4.6.42-b88ce' +macro_revision='2.4.6.42' @@ -5973,13 +5973,29 @@ esac fi : ${AR=ar} -: ${AR_FLAGS=cru} +# Use ARFLAGS variable as AR's operation code to sync the variable naming with +# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have +# higher priority because thats what people were doing historically (setting +# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS +# variable obsoleted/removed. + +test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} +lt_ar_flags=$AR_FLAGS + + + + + + +# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override +# by AR_FLAGS because that was never working and AR_FLAGS is about to die. + @@ -6428,7 +6444,7 @@ for ac_symprfx in "" "_"; do if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. - # Also find C++ and __fastcall symbols from MSVC++, + # Also find C++ and __fastcall symbols from MSVC++ or ICC, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ @@ -7697,8 +7713,8 @@ int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 + echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5 + $AR $AR_FLAGS libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF @@ -8361,8 +8377,8 @@ esac ofile=libtool can_build_shared=yes -# All known linkers require a '.a' archive for static linking (except MSVC, -# which needs '.lib'). +# All known linkers require a '.a' archive for static linking (except MSVC and +# ICC, which need '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld @@ -9285,15 +9301,15 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie case $host_os in cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time + # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. + # Microsoft Visual C++ or Intel C++ Compiler. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) + # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) with_gnu_ld=yes ;; openbsd* | bitrig*) @@ -9457,6 +9473,7 @@ _LT_EOF emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes + file_list_spec='@' ;; interix[3-9]*) @@ -9674,7 +9691,7 @@ _LT_EOF if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else - export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no @@ -9941,12 +9958,12 @@ fi cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. + # Microsoft Visual C++ or Intel C++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in - cl*) - # Native MSVC + cl* | icl*) + # Native MSVC or ICC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes @@ -9987,7 +10004,7 @@ fi fi' ;; *) - # Assume MSVC wrapper + # Assume MSVC and ICC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. @@ -10311,6 +10328,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes + file_list_spec='@' ;; osf3*) @@ -11018,8 +11036,8 @@ cygwin* | mingw* | pw32* | cegcc*) dynamic_linker='Win32 ld.exe' ;; - *,cl*) - # Native MSVC + *,cl* | *,icl*) + # Native MSVC or ICC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' @@ -11075,7 +11093,7 @@ cygwin* | mingw* | pw32* | cegcc*) ;; *) - # Assume MSVC wrapper + # Assume MSVC and ICC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; @@ -12254,30 +12272,41 @@ striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if test -z "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP"; then + if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + case $host_os in + darwin*) + # FIXME - insert some real tests, host_os isn't really good enough striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + ;; + freebsd*) + if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } - ;; - esac + ;; + esac + fi fi @@ -13464,8 +13493,8 @@ fi cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC + ,cl* | no,cl* | ,icl* | no,icl*) + # Native MSVC or ICC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' @@ -13595,6 +13624,7 @@ fi emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_CXX=yes + file_list_spec_CXX='@' ;; dgux*) @@ -15030,7 +15060,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else - export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) @@ -15038,7 +15068,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie ;; cygwin* | mingw* | cegcc*) case $cc_basename in - cl*) + cl* | icl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) @@ -15400,8 +15430,8 @@ cygwin* | mingw* | pw32* | cegcc*) dynamic_linker='Win32 ld.exe' ;; - *,cl*) - # Native MSVC + *,cl* | *,icl*) + # Native MSVC or ICC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' @@ -15457,7 +15487,7 @@ cygwin* | mingw* | pw32* | cegcc*) ;; *) - # Assume MSVC wrapper + # Assume MSVC and ICC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; @@ -19133,7 +19163,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by libtgvoip $as_me 2.2.4, which was +This file was extended by libtgvoip $as_me 2.4.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -19199,7 +19229,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -libtgvoip config.status 2.2.4 +libtgvoip config.status 2.4.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -19370,6 +19400,7 @@ want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' @@ -19552,7 +19583,6 @@ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ -AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ @@ -20561,8 +20591,11 @@ sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR +# Flags to create an archive (by configure). +lt_ar_flags=$lt_ar_flags + # Flags to create an archive. -AR_FLAGS=$lt_AR_FLAGS +AR_FLAGS=\${ARFLAGS-"\$lt_ar_flags"} # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec diff --git a/libtgvoip/configure.ac b/libtgvoip/configure.ac index fa1b367..f5f5dc0 100644 --- a/libtgvoip/configure.ac +++ b/libtgvoip/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) -AC_INIT([libtgvoip], [2.2.4], [https://github.com/grishka/libtgvoip/issues]) +AC_INIT([libtgvoip], [2.4.2], [https://github.com/grishka/libtgvoip/issues]) AC_CONFIG_SRCDIR([config.h.in]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE([subdir-objects]) diff --git a/libtgvoip/json11.cpp b/libtgvoip/json11.cpp new file mode 100755 index 0000000..812e610 --- /dev/null +++ b/libtgvoip/json11.cpp @@ -0,0 +1,795 @@ +/* Copyright (c) 2013 Dropbox, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "json11.hpp" +#include +#include +#include +#include +#include +#include +#include + +namespace json11 { + +static const int max_depth = 200; + +using std::string; +using std::vector; +using std::map; +using std::make_shared; +using std::initializer_list; +using std::move; + +/* Helper for representing null - just a do-nothing struct, plus comparison + * operators so the helpers in JsonValue work. We can't use nullptr_t because + * it may not be orderable. + */ +struct NullStruct { + bool operator==(NullStruct) const { return true; } + bool operator<(NullStruct) const { return false; } +}; + +/* * * * * * * * * * * * * * * * * * * * + * Serialization + */ + +static void dump(NullStruct, string &out) { + out += "null"; +} + +static void dump(double value, string &out) { + if (std::isfinite(value)) { + std::ostringstream stm; + stm.imbue(std::locale("C")); + stm << value; + out += stm.str(); + } else { + out += "null"; + } +} + +static void dump(int value, string &out) { + char buf[32]; + snprintf(buf, sizeof buf, "%d", value); + out += buf; +} + +static void dump(bool value, string &out) { + out += value ? "true" : "false"; +} + +static void dump(const string &value, string &out) { + out += '"'; + for (size_t i = 0; i < value.length(); i++) { + const char ch = value[i]; + if (ch == '\\') { + out += "\\\\"; + } else if (ch == '"') { + out += "\\\""; + } else if (ch == '\b') { + out += "\\b"; + } else if (ch == '\f') { + out += "\\f"; + } else if (ch == '\n') { + out += "\\n"; + } else if (ch == '\r') { + out += "\\r"; + } else if (ch == '\t') { + out += "\\t"; + } else if (static_cast(ch) <= 0x1f) { + char buf[8]; + snprintf(buf, sizeof buf, "\\u%04x", ch); + out += buf; + } else if (static_cast(ch) == 0xe2 && static_cast(value[i+1]) == 0x80 + && static_cast(value[i+2]) == 0xa8) { + out += "\\u2028"; + i += 2; + } else if (static_cast(ch) == 0xe2 && static_cast(value[i+1]) == 0x80 + && static_cast(value[i+2]) == 0xa9) { + out += "\\u2029"; + i += 2; + } else { + out += ch; + } + } + out += '"'; +} + +static void dump(const Json::array &values, string &out) { + bool first = true; + out += "["; + for (const auto &value : values) { + if (!first) + out += ", "; + value.dump(out); + first = false; + } + out += "]"; +} + +static void dump(const Json::object &values, string &out) { + bool first = true; + out += "{"; + for (const auto &kv : values) { + if (!first) + out += ", "; + dump(kv.first, out); + out += ": "; + kv.second.dump(out); + first = false; + } + out += "}"; +} + +void Json::dump(string &out) const { + m_ptr->dump(out); +} + +/* * * * * * * * * * * * * * * * * * * * + * Value wrappers + */ + +template +class Value : public JsonValue { +protected: + + // Constructors + explicit Value(const T &value) : m_value(value) {} + explicit Value(T &&value) : m_value(move(value)) {} + + // Get type tag + Json::Type type() const override { + return tag; + } + + // Comparisons + bool equals(const JsonValue * other) const override { + return m_value == static_cast *>(other)->m_value; + } + bool less(const JsonValue * other) const override { + return m_value < static_cast *>(other)->m_value; + } + + const T m_value; + void dump(string &out) const override { json11::dump(m_value, out); } +}; + +class JsonDouble final : public Value { + double number_value() const override { return m_value; } + int int_value() const override { return static_cast(m_value); } + bool equals(const JsonValue * other) const override { return m_value == other->number_value(); } + bool less(const JsonValue * other) const override { return m_value < other->number_value(); } +public: + explicit JsonDouble(double value) : Value(value) {} +}; + +class JsonInt final : public Value { + double number_value() const override { return m_value; } + int int_value() const override { return m_value; } + bool equals(const JsonValue * other) const override { return m_value == other->number_value(); } + bool less(const JsonValue * other) const override { return m_value < other->number_value(); } +public: + explicit JsonInt(int value) : Value(value) {} +}; + +class JsonBoolean final : public Value { + bool bool_value() const override { return m_value; } +public: + explicit JsonBoolean(bool value) : Value(value) {} +}; + +class JsonString final : public Value { + const string &string_value() const override { return m_value; } +public: + explicit JsonString(const string &value) : Value(value) {} + explicit JsonString(string &&value) : Value(move(value)) {} +}; + +class JsonArray final : public Value { + const Json::array &array_items() const override { return m_value; } + const Json & operator[](size_t i) const override; +public: + explicit JsonArray(const Json::array &value) : Value(value) {} + explicit JsonArray(Json::array &&value) : Value(move(value)) {} +}; + +class JsonObject final : public Value { + const Json::object &object_items() const override { return m_value; } + const Json & operator[](const string &key) const override; +public: + explicit JsonObject(const Json::object &value) : Value(value) {} + explicit JsonObject(Json::object &&value) : Value(move(value)) {} +}; + +class JsonNull final : public Value { +public: + JsonNull() : Value({}) {} +}; + +/* * * * * * * * * * * * * * * * * * * * + * Static globals - static-init-safe + */ +struct Statics { + const std::shared_ptr null = make_shared(); + const std::shared_ptr t = make_shared(true); + const std::shared_ptr f = make_shared(false); + const string empty_string; + const vector empty_vector; + const map empty_map; + Statics() {} +}; + +static const Statics & statics() { + static const Statics s {}; + return s; +} + +static const Json & static_null() { + // This has to be separate, not in Statics, because Json() accesses statics().null. + static const Json json_null; + return json_null; +} + +/* * * * * * * * * * * * * * * * * * * * + * Constructors + */ + +Json::Json() noexcept : m_ptr(statics().null) {} +Json::Json(std::nullptr_t) noexcept : m_ptr(statics().null) {} +Json::Json(double value) : m_ptr(make_shared(value)) {} +Json::Json(int value) : m_ptr(make_shared(value)) {} +Json::Json(bool value) : m_ptr(value ? statics().t : statics().f) {} +Json::Json(const string &value) : m_ptr(make_shared(value)) {} +Json::Json(string &&value) : m_ptr(make_shared(move(value))) {} +Json::Json(const char * value) : m_ptr(make_shared(value)) {} +Json::Json(const Json::array &values) : m_ptr(make_shared(values)) {} +Json::Json(Json::array &&values) : m_ptr(make_shared(move(values))) {} +Json::Json(const Json::object &values) : m_ptr(make_shared(values)) {} +Json::Json(Json::object &&values) : m_ptr(make_shared(move(values))) {} + +/* * * * * * * * * * * * * * * * * * * * + * Accessors + */ + +Json::Type Json::type() const { return m_ptr->type(); } +double Json::number_value() const { return m_ptr->number_value(); } +int Json::int_value() const { return m_ptr->int_value(); } +bool Json::bool_value() const { return m_ptr->bool_value(); } +const string & Json::string_value() const { return m_ptr->string_value(); } +const vector & Json::array_items() const { return m_ptr->array_items(); } +const map & Json::object_items() const { return m_ptr->object_items(); } +const Json & Json::operator[] (size_t i) const { return (*m_ptr)[i]; } +const Json & Json::operator[] (const string &key) const { return (*m_ptr)[key]; } + +double JsonValue::number_value() const { return 0; } +int JsonValue::int_value() const { return 0; } +bool JsonValue::bool_value() const { return false; } +const string & JsonValue::string_value() const { return statics().empty_string; } +const vector & JsonValue::array_items() const { return statics().empty_vector; } +const map & JsonValue::object_items() const { return statics().empty_map; } +const Json & JsonValue::operator[] (size_t) const { return static_null(); } +const Json & JsonValue::operator[] (const string &) const { return static_null(); } + +const Json & JsonObject::operator[] (const string &key) const { + auto iter = m_value.find(key); + return (iter == m_value.end()) ? static_null() : iter->second; +} +const Json & JsonArray::operator[] (size_t i) const { + if (i >= m_value.size()) return static_null(); + else return m_value[i]; +} + +/* * * * * * * * * * * * * * * * * * * * + * Comparison + */ + +bool Json::operator== (const Json &other) const { + if (m_ptr == other.m_ptr) + return true; + if (m_ptr->type() != other.m_ptr->type()) + return false; + + return m_ptr->equals(other.m_ptr.get()); +} + +bool Json::operator< (const Json &other) const { + if (m_ptr == other.m_ptr) + return false; + if (m_ptr->type() != other.m_ptr->type()) + return m_ptr->type() < other.m_ptr->type(); + + return m_ptr->less(other.m_ptr.get()); +} + +/* * * * * * * * * * * * * * * * * * * * + * Parsing + */ + +/* esc(c) + * + * Format char c suitable for printing in an error message. + */ +static inline string esc(char c) { + char buf[12]; + if (static_cast(c) >= 0x20 && static_cast(c) <= 0x7f) { + snprintf(buf, sizeof buf, "'%c' (%d)", c, c); + } else { + snprintf(buf, sizeof buf, "(%d)", c); + } + return string(buf); +} + +static inline bool in_range(long x, long lower, long upper) { + return (x >= lower && x <= upper); +} + +namespace { +/* JsonParser + * + * Object that tracks all state of an in-progress parse. + */ +struct JsonParser final { + + /* State + */ + const string &str; + size_t i; + string &err; + bool failed; + const JsonParse strategy; + + /* fail(msg, err_ret = Json()) + * + * Mark this parse as failed. + */ + Json fail(string &&msg) { + return fail(move(msg), Json()); + } + + template + T fail(string &&msg, const T err_ret) { + if (!failed) + err = std::move(msg); + failed = true; + return err_ret; + } + + /* consume_whitespace() + * + * Advance until the current character is non-whitespace. + */ + void consume_whitespace() { + while (str[i] == ' ' || str[i] == '\r' || str[i] == '\n' || str[i] == '\t') + i++; + } + + /* consume_comment() + * + * Advance comments (c-style inline and multiline). + */ + bool consume_comment() { + bool comment_found = false; + if (str[i] == '/') { + i++; + if (i == str.size()) + return fail("unexpected end of input after start of comment", false); + if (str[i] == '/') { // inline comment + i++; + // advance until next line, or end of input + while (i < str.size() && str[i] != '\n') { + i++; + } + comment_found = true; + } + else if (str[i] == '*') { // multiline comment + i++; + if (i > str.size()-2) + return fail("unexpected end of input inside multi-line comment", false); + // advance until closing tokens + while (!(str[i] == '*' && str[i+1] == '/')) { + i++; + if (i > str.size()-2) + return fail( + "unexpected end of input inside multi-line comment", false); + } + i += 2; + comment_found = true; + } + else + return fail("malformed comment", false); + } + return comment_found; + } + + /* consume_garbage() + * + * Advance until the current character is non-whitespace and non-comment. + */ + void consume_garbage() { + consume_whitespace(); + if(strategy == JsonParse::COMMENTS) { + bool comment_found = false; + do { + comment_found = consume_comment(); + if (failed) return; + consume_whitespace(); + } + while(comment_found); + } + } + + /* get_next_token() + * + * Return the next non-whitespace character. If the end of the input is reached, + * flag an error and return 0. + */ + char get_next_token() { + consume_garbage(); + if (failed) return (char)0; + if (i == str.size()) + return fail("unexpected end of input", (char)0); + + return str[i++]; + } + + /* encode_utf8(pt, out) + * + * Encode pt as UTF-8 and add it to out. + */ + void encode_utf8(long pt, string & out) { + if (pt < 0) + return; + + if (pt < 0x80) { + out += static_cast(pt); + } else if (pt < 0x800) { + out += static_cast((pt >> 6) | 0xC0); + out += static_cast((pt & 0x3F) | 0x80); + } else if (pt < 0x10000) { + out += static_cast((pt >> 12) | 0xE0); + out += static_cast(((pt >> 6) & 0x3F) | 0x80); + out += static_cast((pt & 0x3F) | 0x80); + } else { + out += static_cast((pt >> 18) | 0xF0); + out += static_cast(((pt >> 12) & 0x3F) | 0x80); + out += static_cast(((pt >> 6) & 0x3F) | 0x80); + out += static_cast((pt & 0x3F) | 0x80); + } + } + + /* parse_string() + * + * Parse a string, starting at the current position. + */ + string parse_string() { + string out; + long last_escaped_codepoint = -1; + while (true) { + if (i == str.size()) + return fail("unexpected end of input in string", ""); + + char ch = str[i++]; + + if (ch == '"') { + encode_utf8(last_escaped_codepoint, out); + return out; + } + + if (in_range(ch, 0, 0x1f)) + return fail("unescaped " + esc(ch) + " in string", ""); + + // The usual case: non-escaped characters + if (ch != '\\') { + encode_utf8(last_escaped_codepoint, out); + last_escaped_codepoint = -1; + out += ch; + continue; + } + + // Handle escapes + if (i == str.size()) + return fail("unexpected end of input in string", ""); + + ch = str[i++]; + + if (ch == 'u') { + // Extract 4-byte escape sequence + string esc = str.substr(i, 4); + // Explicitly check length of the substring. The following loop + // relies on std::string returning the terminating NUL when + // accessing str[length]. Checking here reduces brittleness. + if (esc.length() < 4) { + return fail("bad \\u escape: " + esc, ""); + } + for (size_t j = 0; j < 4; j++) { + if (!in_range(esc[j], 'a', 'f') && !in_range(esc[j], 'A', 'F') + && !in_range(esc[j], '0', '9')) + return fail("bad \\u escape: " + esc, ""); + } + + long codepoint = strtol(esc.data(), nullptr, 16); + + // JSON specifies that characters outside the BMP shall be encoded as a pair + // of 4-hex-digit \u escapes encoding their surrogate pair components. Check + // whether we're in the middle of such a beast: the previous codepoint was an + // escaped lead (high) surrogate, and this is a trail (low) surrogate. + if (in_range(last_escaped_codepoint, 0xD800, 0xDBFF) + && in_range(codepoint, 0xDC00, 0xDFFF)) { + // Reassemble the two surrogate pairs into one astral-plane character, per + // the UTF-16 algorithm. + encode_utf8((((last_escaped_codepoint - 0xD800) << 10) + | (codepoint - 0xDC00)) + 0x10000, out); + last_escaped_codepoint = -1; + } else { + encode_utf8(last_escaped_codepoint, out); + last_escaped_codepoint = codepoint; + } + + i += 4; + continue; + } + + encode_utf8(last_escaped_codepoint, out); + last_escaped_codepoint = -1; + + if (ch == 'b') { + out += '\b'; + } else if (ch == 'f') { + out += '\f'; + } else if (ch == 'n') { + out += '\n'; + } else if (ch == 'r') { + out += '\r'; + } else if (ch == 't') { + out += '\t'; + } else if (ch == '"' || ch == '\\' || ch == '/') { + out += ch; + } else { + return fail("invalid escape character " + esc(ch), ""); + } + } + } + + /* parse_number() + * + * Parse a double. + */ + Json parse_number() { + size_t start_pos = i; + + if (str[i] == '-') + i++; + + // Integer part + if (str[i] == '0') { + i++; + if (in_range(str[i], '0', '9')) + return fail("leading 0s not permitted in numbers"); + } else if (in_range(str[i], '1', '9')) { + i++; + while (in_range(str[i], '0', '9')) + i++; + } else { + return fail("invalid " + esc(str[i]) + " in number"); + } + + if (str[i] != '.' && str[i] != 'e' && str[i] != 'E' + && (i - start_pos) <= static_cast(std::numeric_limits::digits10)) { + return std::atoi(str.c_str() + start_pos); + } + + // Decimal part + if (str[i] == '.') { + i++; + if (!in_range(str[i], '0', '9')) + return fail("at least one digit required in fractional part"); + + while (in_range(str[i], '0', '9')) + i++; + } + + // Exponent part + if (str[i] == 'e' || str[i] == 'E') { + i++; + + if (str[i] == '+' || str[i] == '-') + i++; + + if (!in_range(str[i], '0', '9')) + return fail("at least one digit required in exponent"); + + while (in_range(str[i], '0', '9')) + i++; + } + + std::istringstream stm(std::string(str.begin()+start_pos, str.end())); + stm.imbue(std::locale("C")); + double result; + stm >> result; + return result; + } + + /* expect(str, res) + * + * Expect that 'str' starts at the character that was just read. If it does, advance + * the input and return res. If not, flag an error. + */ + Json expect(const string &expected, Json res) { + assert(i != 0); + i--; + if (str.compare(i, expected.length(), expected) == 0) { + i += expected.length(); + return res; + } else { + return fail("parse error: expected " + expected + ", got " + str.substr(i, expected.length())); + } + } + + /* parse_json() + * + * Parse a JSON object. + */ + Json parse_json(int depth) { + if (depth > max_depth) { + return fail("exceeded maximum nesting depth"); + } + + char ch = get_next_token(); + if (failed) + return Json(); + + if (ch == '-' || (ch >= '0' && ch <= '9')) { + i--; + return parse_number(); + } + + if (ch == 't') + return expect("true", true); + + if (ch == 'f') + return expect("false", false); + + if (ch == 'n') + return expect("null", Json()); + + if (ch == '"') + return parse_string(); + + if (ch == '{') { + map data; + ch = get_next_token(); + if (ch == '}') + return data; + + while (1) { + if (ch != '"') + return fail("expected '\"' in object, got " + esc(ch)); + + string key = parse_string(); + if (failed) + return Json(); + + ch = get_next_token(); + if (ch != ':') + return fail("expected ':' in object, got " + esc(ch)); + + data[std::move(key)] = parse_json(depth + 1); + if (failed) + return Json(); + + ch = get_next_token(); + if (ch == '}') + break; + if (ch != ',') + return fail("expected ',' in object, got " + esc(ch)); + + ch = get_next_token(); + } + return data; + } + + if (ch == '[') { + vector data; + ch = get_next_token(); + if (ch == ']') + return data; + + while (1) { + i--; + data.push_back(parse_json(depth + 1)); + if (failed) + return Json(); + + ch = get_next_token(); + if (ch == ']') + break; + if (ch != ',') + return fail("expected ',' in list, got " + esc(ch)); + + ch = get_next_token(); + (void)ch; + } + return data; + } + + return fail("expected value, got " + esc(ch)); + } +}; +}//namespace { + +Json Json::parse(const string &in, string &err, JsonParse strategy) { + JsonParser parser { in, 0, err, false, strategy }; + Json result = parser.parse_json(0); + + // Check for any trailing garbage + parser.consume_garbage(); + if (parser.failed) + return Json(); + if (parser.i != in.size()) + return parser.fail("unexpected trailing " + esc(in[parser.i])); + + return result; +} + +// Documented in json11.hpp +vector Json::parse_multi(const string &in, + std::string::size_type &parser_stop_pos, + string &err, + JsonParse strategy) { + JsonParser parser { in, 0, err, false, strategy }; + parser_stop_pos = 0; + vector json_vec; + while (parser.i != in.size() && !parser.failed) { + json_vec.push_back(parser.parse_json(0)); + if (parser.failed) + break; + + // Check for another object + parser.consume_garbage(); + if (parser.failed) + break; + parser_stop_pos = parser.i; + } + return json_vec; +} + +/* * * * * * * * * * * * * * * * * * * * + * Shape-checking + */ + +bool Json::has_shape(const shape & types, string & err) const { + if (!is_object()) { + err = "expected JSON object, got " + dump(); + return false; + } + + for (auto & item : types) { + if ((*this)[item.first].type() != item.second) { + err = "bad type for " + item.first + " in " + dump(); + return false; + } + } + + return true; +} + +} // namespace json11 diff --git a/libtgvoip/json11.hpp b/libtgvoip/json11.hpp new file mode 100755 index 0000000..0c47d05 --- /dev/null +++ b/libtgvoip/json11.hpp @@ -0,0 +1,232 @@ +/* json11 + * + * json11 is a tiny JSON library for C++11, providing JSON parsing and serialization. + * + * The core object provided by the library is json11::Json. A Json object represents any JSON + * value: null, bool, number (int or double), string (std::string), array (std::vector), or + * object (std::map). + * + * Json objects act like values: they can be assigned, copied, moved, compared for equality or + * order, etc. There are also helper methods Json::dump, to serialize a Json to a string, and + * Json::parse (static) to parse a std::string as a Json object. + * + * Internally, the various types of Json object are represented by the JsonValue class + * hierarchy. + * + * A note on numbers - JSON specifies the syntax of number formatting but not its semantics, + * so some JSON implementations distinguish between integers and floating-point numbers, while + * some don't. In json11, we choose the latter. Because some JSON implementations (namely + * Javascript itself) treat all numbers as the same type, distinguishing the two leads + * to JSON that will be *silently* changed by a round-trip through those implementations. + * Dangerous! To avoid that risk, json11 stores all numbers as double internally, but also + * provides integer helpers. + * + * Fortunately, double-precision IEEE754 ('double') can precisely store any integer in the + * range +/-2^53, which includes every 'int' on most systems. (Timestamps often use int64 + * or long long to avoid the Y2038K problem; a double storing microseconds since some epoch + * will be exact for +/- 275 years.) + */ + +/* Copyright (c) 2013 Dropbox, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#pragma once + +#include +#include +#include +#include +#include + +#ifdef _MSC_VER + #if _MSC_VER <= 1800 // VS 2013 + #ifndef noexcept + #define noexcept throw() + #endif + + #ifndef snprintf + #define snprintf _snprintf_s + #endif + #endif +#endif + +namespace json11 { + +enum JsonParse { + STANDARD, COMMENTS +}; + +class JsonValue; + +class Json final { +public: + // Types + enum Type { + NUL, NUMBER, BOOL, STRING, ARRAY, OBJECT + }; + + // Array and object typedefs + typedef std::vector array; + typedef std::map object; + + // Constructors for the various types of JSON value. + Json() noexcept; // NUL + Json(std::nullptr_t) noexcept; // NUL + Json(double value); // NUMBER + Json(int value); // NUMBER + Json(bool value); // BOOL + Json(const std::string &value); // STRING + Json(std::string &&value); // STRING + Json(const char * value); // STRING + Json(const array &values); // ARRAY + Json(array &&values); // ARRAY + Json(const object &values); // OBJECT + Json(object &&values); // OBJECT + + // Implicit constructor: anything with a to_json() function. + template + Json(const T & t) : Json(t.to_json()) {} + + // Implicit constructor: map-like objects (std::map, std::unordered_map, etc) + template ().begin()->first)>::value + && std::is_constructible().begin()->second)>::value, + int>::type = 0> + Json(const M & m) : Json(object(m.begin(), m.end())) {} + + // Implicit constructor: vector-like objects (std::list, std::vector, std::set, etc) + template ().begin())>::value, + int>::type = 0> + Json(const V & v) : Json(array(v.begin(), v.end())) {} + + // This prevents Json(some_pointer) from accidentally producing a bool. Use + // Json(bool(some_pointer)) if that behavior is desired. + Json(void *) = delete; + + // Accessors + Type type() const; + + bool is_null() const { return type() == NUL; } + bool is_number() const { return type() == NUMBER; } + bool is_bool() const { return type() == BOOL; } + bool is_string() const { return type() == STRING; } + bool is_array() const { return type() == ARRAY; } + bool is_object() const { return type() == OBJECT; } + + // Return the enclosed value if this is a number, 0 otherwise. Note that json11 does not + // distinguish between integer and non-integer numbers - number_value() and int_value() + // can both be applied to a NUMBER-typed object. + double number_value() const; + int int_value() const; + + // Return the enclosed value if this is a boolean, false otherwise. + bool bool_value() const; + // Return the enclosed string if this is a string, "" otherwise. + const std::string &string_value() const; + // Return the enclosed std::vector if this is an array, or an empty vector otherwise. + const array &array_items() const; + // Return the enclosed std::map if this is an object, or an empty map otherwise. + const object &object_items() const; + + // Return a reference to arr[i] if this is an array, Json() otherwise. + const Json & operator[](size_t i) const; + // Return a reference to obj[key] if this is an object, Json() otherwise. + const Json & operator[](const std::string &key) const; + + // Serialize. + void dump(std::string &out) const; + std::string dump() const { + std::string out; + dump(out); + return out; + } + + // Parse. If parse fails, return Json() and assign an error message to err. + static Json parse(const std::string & in, + std::string & err, + JsonParse strategy = JsonParse::STANDARD); + static Json parse(const char * in, + std::string & err, + JsonParse strategy = JsonParse::STANDARD) { + if (in) { + return parse(std::string(in), err, strategy); + } else { + err = "null input"; + return nullptr; + } + } + // Parse multiple objects, concatenated or separated by whitespace + static std::vector parse_multi( + const std::string & in, + std::string::size_type & parser_stop_pos, + std::string & err, + JsonParse strategy = JsonParse::STANDARD); + + static inline std::vector parse_multi( + const std::string & in, + std::string & err, + JsonParse strategy = JsonParse::STANDARD) { + std::string::size_type parser_stop_pos; + return parse_multi(in, parser_stop_pos, err, strategy); + } + + bool operator== (const Json &rhs) const; + bool operator< (const Json &rhs) const; + bool operator!= (const Json &rhs) const { return !(*this == rhs); } + bool operator<= (const Json &rhs) const { return !(rhs < *this); } + bool operator> (const Json &rhs) const { return (rhs < *this); } + bool operator>= (const Json &rhs) const { return !(*this < rhs); } + + /* has_shape(types, err) + * + * Return true if this is a JSON object and, for each item in types, has a field of + * the given type. If not, return false and set err to a descriptive message. + */ + typedef std::initializer_list> shape; + bool has_shape(const shape & types, std::string & err) const; + +private: + std::shared_ptr m_ptr; +}; + +// Internal class hierarchy - JsonValue objects are not exposed to users of this API. +class JsonValue { +protected: + friend class Json; + friend class JsonInt; + friend class JsonDouble; + virtual Json::Type type() const = 0; + virtual bool equals(const JsonValue * other) const = 0; + virtual bool less(const JsonValue * other) const = 0; + virtual void dump(std::string &out) const = 0; + virtual double number_value() const; + virtual int int_value() const; + virtual bool bool_value() const; + virtual const std::string &string_value() const; + virtual const Json::array &array_items() const; + virtual const Json &operator[](size_t i) const; + virtual const Json::object &object_items() const; + virtual const Json &operator[](const std::string &key) const; + virtual ~JsonValue() {} +}; + +} // namespace json11 diff --git a/libtgvoip/libtgvoip.UWP.vcxproj b/libtgvoip/libtgvoip.UWP.vcxproj index aa4c104..98c44e7 100644 --- a/libtgvoip/libtgvoip.UWP.vcxproj +++ b/libtgvoip/libtgvoip.UWP.vcxproj @@ -34,7 +34,7 @@ 14.0 true Windows Store - 10.0.15063.0 + 10.0.17134.0 10.0.10240.0 10.0 libtgvoip @@ -76,27 +76,27 @@ - + - + - + - + - + - + @@ -229,17 +229,17 @@ + - - - + + @@ -247,7 +247,12 @@ + + + + + @@ -312,17 +317,17 @@ + - - - + + @@ -330,8 +335,13 @@ + + + + + @@ -502,7 +512,12 @@ - + + {904ac506-51a0-474e-9f55-ec3febbcccd9} + + + + diff --git a/libtgvoip/libtgvoip.UWP.vcxproj.filters b/libtgvoip/libtgvoip.UWP.vcxproj.filters index 18a0832..32b2683 100644 --- a/libtgvoip/libtgvoip.UWP.vcxproj.filters +++ b/libtgvoip/libtgvoip.UWP.vcxproj.filters @@ -14,14 +14,15 @@ {3b15701a-65dd-4d52-92d4-a7b64a73b293} + + {e4d2de92-03ad-43d9-8861-d69f64610ba5} + - - - + @@ -273,14 +274,27 @@ windows + + + + + audio + + + windows + + + video + + + video + - - - + @@ -488,5 +502,20 @@ windows + + + + audio + + + + windows + + + video + + + video + \ No newline at end of file diff --git a/libtgvoip/libtgvoip.WP81.vcxproj b/libtgvoip/libtgvoip.WP81.vcxproj index 4c4993e..ab0ba47 100644 --- a/libtgvoip/libtgvoip.WP81.vcxproj +++ b/libtgvoip/libtgvoip.WP81.vcxproj @@ -110,12 +110,13 @@ NotUsing - _WINRT_DLL;TGVOIP_WP_SILVERLIGHT;_CRT_SECURE_NO_WARNINGS;NOMINMAX;WEBRTC_APM_DEBUG_DUMP=0;TGVOIP_USE_CUSTOM_CRYPTO;%(PreprocessorDefinitions) + _WINRT_DLL;TGVOIP_WP_SILVERLIGHT;_CRT_SECURE_NO_WARNINGS;NOMINMAX;WEBRTC_APM_DEBUG_DUMP=0;TGVOIP_USE_CUSTOM_CRYPTO;noexcept=;_ALLOW_KEYWORD_MACROS;%(PreprocessorDefinitions) pch.h $(IntDir)pch.pch /bigobj %(AdditionalOptions) true webrtc_dsp;../TelegramClient/TelegramClient.Opus/opus/include;%(AdditionalIncludeDirectories) + 4068;%(DisableSpecificWarnings) Console @@ -126,7 +127,7 @@ NotUsing - _WINRT_DLL;TGVOIP_WP_SILVERLIGHT;NDEBUG;_CRT_SECURE_NO_WARNINGS;NOMINMAX;WEBRTC_APM_DEBUG_DUMP=0;TGVOIP_USE_CUSTOM_CRYPTO;%(PreprocessorDefinitions) + _WINRT_DLL;TGVOIP_WP_SILVERLIGHT;NDEBUG;_CRT_SECURE_NO_WARNINGS;NOMINMAX;WEBRTC_APM_DEBUG_DUMP=0;TGVOIP_USE_CUSTOM_CRYPTO;noexcept=;_ALLOW_KEYWORD_MACROS;%(PreprocessorDefinitions) pch.h $(IntDir)pch.pch /bigobj %(AdditionalOptions) @@ -142,17 +143,17 @@ + - - - + + @@ -160,6 +161,7 @@ + @@ -225,17 +227,17 @@ + - - - + + @@ -243,6 +245,7 @@ + diff --git a/libtgvoip/libtgvoip.WP81.vcxproj.filters b/libtgvoip/libtgvoip.WP81.vcxproj.filters old mode 100644 new mode 100755 index c35dfba..11034a4 --- a/libtgvoip/libtgvoip.WP81.vcxproj.filters +++ b/libtgvoip/libtgvoip.WP81.vcxproj.filters @@ -19,9 +19,6 @@ - - - @@ -273,14 +270,12 @@ windows + - - - @@ -488,5 +483,6 @@ windows + \ No newline at end of file diff --git a/libtgvoip/libtgvoip.gyp b/libtgvoip/libtgvoip.gyp index 0cf04ea..8c62b56 100644 --- a/libtgvoip/libtgvoip.gyp +++ b/libtgvoip/libtgvoip.gyp @@ -9,6 +9,7 @@ 'defines': [ 'WEBRTC_APM_DEBUG_DUMP=0', 'TGVOIP_USE_DESKTOP_DSP', + 'WEBRTC_NS_FLOAT', ], 'variables': { 'tgvoip_src_loc': '.', @@ -65,6 +66,12 @@ '<(tgvoip_src_loc)/MessageThread.h', '<(tgvoip_src_loc)/audio/AudioIO.cpp', '<(tgvoip_src_loc)/audio/AudioIO.h', + '<(tgvoip_src_loc)/video/VideoSource.cpp', + '<(tgvoip_src_loc)/video/VideoSource.h', + '<(tgvoip_src_loc)/video/VideoRenderer.cpp', + '<(tgvoip_src_loc)/video/VideoRenderer.h', + '<(tgvoip_src_loc)/json11.cpp', + '<(tgvoip_src_loc)/json11.hpp', # Windows '<(tgvoip_src_loc)/os/windows/NetworkSocketWinsock.cpp', @@ -77,6 +84,8 @@ '<(tgvoip_src_loc)/os/windows/AudioOutputWASAPI.h', '<(tgvoip_src_loc)/os/windows/AudioInputWASAPI.cpp', '<(tgvoip_src_loc)/os/windows/AudioInputWASAPI.h', + '<(tgvoip_src_loc)/os/windows/WindowsSpecific.cpp', + '<(tgvoip_src_loc)/os/windows/WindowsSpecific.h', # macOS '<(tgvoip_src_loc)/os/darwin/AudioInputAudioUnit.cpp', @@ -108,140 +117,609 @@ '<(tgvoip_src_loc)/os/posix/NetworkSocketPosix.cpp', '<(tgvoip_src_loc)/os/posix/NetworkSocketPosix.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/base/array_view.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/base/atomicops.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/base/basictypes.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/base/checks.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/base/checks.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/base/constructormagic.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/base/safe_compare.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/base/safe_conversions.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/base/safe_conversions_impl.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/base/sanitizer.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/base/stringutils.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/base/stringutils.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/base/type_traits.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/audio_util.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/channel_buffer.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/channel_buffer.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/fft4g.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/fft4g.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/include/audio_util.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/ring_buffer.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/ring_buffer.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/auto_corr_to_refl_coef.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/auto_correlation.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/complex_bit_reverse.c', -# 'webrtc_dsp/webrtc/common_audio/signal_processing/complex_bit_reverse_arm.S', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/complex_fft.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/complex_fft_tables.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/copy_set_operations.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/cross_correlation.c', -# '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/cross_correlation_neon.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/division_operations.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/dot_product_with_scale.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/downsample_fast.c', -# '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/downsample_fast_neon.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/energy.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/filter_ar.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/filter_ar_fast_q12.c', -# 'webrtc_dsp/webrtc/common_audio/signal_processing/filter_ar_fast_q12_armv7.S', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/filter_ma_fast_q12.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/get_hanning_window.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/get_scaling_square.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/ilbc_specific_functions.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/include/real_fft.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/include/signal_processing_library.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/include/spl_inl.h', -# '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/include/spl_inl_armv7.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/include/spl_inl_mips.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/levinson_durbin.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/lpc_to_refl_coef.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/min_max_operations.c', -# '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/min_max_operations_neon.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/randomization_functions.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/real_fft.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/refl_coef_to_lpc.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/resample.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/resample_48khz.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2_internal.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/resample_by_2_internal.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/resample_fractional.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/spl_init.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/spl_inl.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt_floor.c', - #'webrtc_dsp/webrtc/common_audio/signal_processing/spl_sqrt_floor_arm.S', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/splitting_filter_impl.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/sqrt_of_one_minus_x_squared.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/signal_processing/vector_scaling_operations.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/sparse_fir_filter.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/sparse_fir_filter.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/wav_file.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/wav_file.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/wav_header.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/common_audio/wav_header.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aec/aec_common.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core.h', -# '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_neon.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_optimized_methods.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_sse2.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aec/aec_resampler.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aec/aec_resampler.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aec/echo_cancellation.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aec/echo_cancellation.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core_c.cc', -# '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core_neon.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_defines.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aecm/echo_control_mobile.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/aecm/echo_control_mobile.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/analog_agc.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/analog_agc.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/digital_agc.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/digital_agc.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/gain_control.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/logging/apm_data_dumper.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/logging/apm_data_dumper.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/ns/defines.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression_x.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression_x.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/ns/ns_core.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/ns/ns_core.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core_c.c', -# '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core_neon.c', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_defines.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/ns/windows_private.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/splitting_filter.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/splitting_filter.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/three_band_filter_bank.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/three_band_filter_bank.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/utility/block_mean_calculator.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/utility/block_mean_calculator.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_internal.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_wrapper.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft.h', -# '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_neon.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_tables_common.h', -# '<(tgvoip_src_loc)/webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_tables_neon_sse2.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/system_wrappers/include/asm_defines.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/system_wrappers/include/compile_assert_c.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/system_wrappers/include/cpu_features_wrapper.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/system_wrappers/include/metrics.h', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/system_wrappers/source/cpu_features.cc', - '<(tgvoip_src_loc)/webrtc_dsp/webrtc/typedefs.h', + # WebRTC APM + '<(tgvoip_src_loc)/webrtc_dsp/system_wrappers/include/field_trial.h', + '<(tgvoip_src_loc)/webrtc_dsp/system_wrappers/include/cpu_features_wrapper.h', + '<(tgvoip_src_loc)/webrtc_dsp/system_wrappers/include/asm_defines.h', + '<(tgvoip_src_loc)/webrtc_dsp/system_wrappers/include/metrics.h', + '<(tgvoip_src_loc)/webrtc_dsp/system_wrappers/include/compile_assert_c.h', + '<(tgvoip_src_loc)/webrtc_dsp/system_wrappers/source/field_trial.cc', + '<(tgvoip_src_loc)/webrtc_dsp/system_wrappers/source/metrics.cc', + '<(tgvoip_src_loc)/webrtc_dsp/system_wrappers/source/cpu_features.cc', + '<(tgvoip_src_loc)/webrtc_dsp/typedefs.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/strings/internal/memutil.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/strings/internal/memutil.cc', + '<(tgvoip_src_loc)/webrtc_dsp/absl/strings/string_view.cc', + '<(tgvoip_src_loc)/webrtc_dsp/absl/strings/ascii.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/strings/ascii.cc', + '<(tgvoip_src_loc)/webrtc_dsp/absl/strings/string_view.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/types/optional.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/types/bad_optional_access.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/types/bad_optional_access.cc', + '<(tgvoip_src_loc)/webrtc_dsp/absl/types/optional.cc', + '<(tgvoip_src_loc)/webrtc_dsp/absl/memory/memory.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/meta/type_traits.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/algorithm/algorithm.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/container/inlined_vector.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/base/policy_checks.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/base/port.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/base/config.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/base/internal/raw_logging.cc', + '<(tgvoip_src_loc)/webrtc_dsp/absl/base/internal/throw_delegate.cc', + '<(tgvoip_src_loc)/webrtc_dsp/absl/base/internal/invoke.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/base/internal/inline_variable.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/base/internal/atomic_hook.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/base/internal/identity.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/base/internal/raw_logging.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/base/internal/throw_delegate.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/base/attributes.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/base/macros.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/base/optimization.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/base/log_severity.h', + '<(tgvoip_src_loc)/webrtc_dsp/absl/utility/utility.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/string_to_number.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/constructormagic.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/race_checker.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/strings/string_builder.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/strings/string_builder.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/event_tracer.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/stringencode.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/memory/aligned_malloc.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/memory/aligned_malloc.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/timeutils.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/event.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/ignore_wundef.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/stringutils.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/arraysize.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/platform_file.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/swap_queue.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/string_to_number.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/trace_event.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/checks.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/deprecation.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/thread_checker_impl.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/sanitizer.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/scoped_ref_ptr.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/logging.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/timeutils.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/atomicops.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/stringencode.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/stringutils.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/checks.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/numerics/safe_minmax.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/numerics/safe_conversions.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/numerics/safe_conversions_impl.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/numerics/safe_compare.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/system/unused.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/system/inline.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/system/ignore_warnings.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/system/asm_defines.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/system/rtc_export.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/system/arch.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/platform_thread.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/platform_thread.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/platform_thread_types.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/protobuf_utils.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/thread_annotations.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/gtest_prod_util.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/function_view.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/criticalsection.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/criticalsection.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/platform_thread_types.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/refcount.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/event.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/thread_checker_impl.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/event_tracer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/compile_assert_c.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/logging_webrtc.cc', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/type_traits.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/platform_file.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/refcounter.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/logging_mac.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/thread_checker.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/race_checker.h', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/refcountedobject.h', + '<(tgvoip_src_loc)/webrtc_dsp/third_party/rnnoise/src/rnn_vad_weights.cc', + '<(tgvoip_src_loc)/webrtc_dsp/third_party/rnnoise/src/rnn_activations.h', + '<(tgvoip_src_loc)/webrtc_dsp/third_party/rnnoise/src/kiss_fft.h', + '<(tgvoip_src_loc)/webrtc_dsp/third_party/rnnoise/src/kiss_fft.cc', + '<(tgvoip_src_loc)/webrtc_dsp/third_party/rnnoise/src/rnn_vad_weights.h', + '<(tgvoip_src_loc)/webrtc_dsp/api/audio/audio_frame.cc', + '<(tgvoip_src_loc)/webrtc_dsp/api/audio/echo_canceller3_config.h', + '<(tgvoip_src_loc)/webrtc_dsp/api/audio/echo_control.h', + '<(tgvoip_src_loc)/webrtc_dsp/api/audio/audio_frame.h', + '<(tgvoip_src_loc)/webrtc_dsp/api/audio/echo_canceller3_config.cc', + '<(tgvoip_src_loc)/webrtc_dsp/api/audio/echo_canceller3_factory.h', + '<(tgvoip_src_loc)/webrtc_dsp/api/audio/echo_canceller3_factory.cc', + '<(tgvoip_src_loc)/webrtc_dsp/api/array_view.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/third_party/fft/fft.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/third_party/fft/fft.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/bandwidth_info.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/include/isac.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_estimator.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines_logist.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/os_specific_inline.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filterbanks.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/entropy_coding.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac_vad.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/settings.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/transform.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/crc.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_filter.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filter_functions.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/decode.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lattice.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/intialize.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_tables.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac_float_type.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_analysis.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines_hist.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/codec.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/entropy_coding.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac_vad.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/structs.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/filter_functions.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_filter.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/arith_routines.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/crc.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_analysis.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/decode_bwe.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/isac.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_coding/codecs/isac/main/source/lpc_tables.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/rms_level.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/echo_detector/moving_max.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/echo_detector/circular_buffer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/echo_detector/normalized_covariance_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/echo_detector/normalized_covariance_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/echo_detector/moving_max.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/echo_detector/circular_buffer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/echo_detector/mean_variance_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/echo_detector/mean_variance_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/gain_control_for_experimental_agc.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/splitting_filter.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/gain_control_impl.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/rms_level.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/ns/ns_core.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/ns/nsx_core.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/ns/noise_suppression_x.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/ns/nsx_core_c.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/ns/defines.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/ns/noise_suppression.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/ns/ns_core.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/ns/nsx_core.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/ns/windows_private.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/ns/noise_suppression_x.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/ns/noise_suppression.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/ns/nsx_defines.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/residual_echo_detector.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/audio_processing_impl.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/audio_buffer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/typing_detection.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/render_queue_item_verifier.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/include/audio_generator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/include/config.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/include/audio_frame_view.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/include/mock_audio_processing.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/include/gain_control.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/include/audio_generator_factory.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/include/audio_processing_statistics.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/include/audio_generator_factory.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/include/aec_dump.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/include/aec_dump.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/include/audio_processing_statistics.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/include/audio_processing.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/include/audio_processing.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/include/config.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/interpolated_gain_curve.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/biquad_filter.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/interpolated_gain_curve.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/agc2_common.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/agc2_testing_common.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/gain_applier.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/signal_classifier.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/adaptive_agc.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/limiter.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/saturation_protector.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/vector_float_frame.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features_internal.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/sequence_buffer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/rnn.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/rnn.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/test_utils.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_info.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/lp_residual.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/ring_buffer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search_internal.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/symmetric_matrix_buffer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/features_extraction.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/common.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features_internal.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/fft_util.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/spectral_features.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search_internal.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/pitch_search.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/features_extraction.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/fft_util.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/rnn_vad/lp_residual.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/fixed_gain_controller.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/vector_float_frame.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/down_sampler.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/noise_level_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/agc2_testing_common.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/fixed_digital_level_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/fixed_gain_controller.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/saturation_protector.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/vad_with_level.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/limiter_db_gain_curve.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/agc2_common.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/adaptive_digital_gain_applier.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/vad_with_level.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/limiter_db_gain_curve.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/fixed_digital_level_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/adaptive_agc.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/gain_applier.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/down_sampler.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/noise_level_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/signal_classifier.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/noise_spectrum_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/compute_interpolated_gain_curve.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/compute_interpolated_gain_curve.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/biquad_filter.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/noise_spectrum_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/limiter.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc2/adaptive_mode_level_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/transient/moving_moments.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/transient/transient_detector.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/transient/wpd_tree.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/transient/transient_suppressor.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/transient/daubechies_8_wavelet_coeffs.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/transient/common.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/transient/wpd_node.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/transient/moving_moments.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/transient/wpd_tree.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/transient/wpd_node.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/transient/transient_suppressor.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/transient/transient_detector.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/transient/dyadic_decimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/low_cut_filter.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/noise_suppression_impl.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/level_estimator_impl.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/three_band_filter_bank.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec/echo_cancellation.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec/aec_resampler.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec/aec_resampler.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec/echo_cancellation.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec/aec_core.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec/aec_core.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec/aec_core_optimized_methods.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec/aec_core_sse2.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec/aec_common.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/voice_detection_impl.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/voice_detection_impl.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/echo_cancellation_impl.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/gain_control_for_experimental_agc.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc/agc.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc/loudness_histogram.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc/agc_manager_direct.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc/legacy/analog_agc.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc/legacy/gain_control.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc/legacy/digital_agc.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc/legacy/analog_agc.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc/legacy/digital_agc.c', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc/utility.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc/mock_agc.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc/loudness_histogram.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc/gain_map_internal.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc/utility.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc/agc_manager_direct.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/agc/agc.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/common.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/audio_processing_impl.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/audio_buffer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/echo_control_mobile_impl.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/splitting_filter.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/low_cut_filter.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/audio_generator/file_audio_generator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/audio_generator/file_audio_generator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/gain_controller2.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/three_band_filter_bank.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/residual_echo_detector.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/echo_cancellation_impl.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/noise_suppression_impl.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/level_estimator_impl.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/gain_controller2.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aecm/aecm_core.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aecm/aecm_defines.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aecm/aecm_core.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aecm/aecm_core_c.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aecm/echo_control_mobile.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aecm/echo_control_mobile.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/render_reverb_model.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/downsampled_render_buffer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/subtractor_output_analyzer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/reverb_model_fallback.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/residual_echo_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/shadow_filter_update_gain.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/echo_remover_metrics.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/matched_filter_lag_aggregator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer2.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/aec_state.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/suppression_filter.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/echo_path_variability.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/frame_blocker.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/subtractor.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/block_delay_buffer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/adaptive_fir_filter.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/cascaded_biquad_filter.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/matched_filter.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/subtractor_output.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/render_signal_analyzer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/aec3_fft.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/aec3_fft.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/echo_remover_metrics.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/fullband_erle_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/suppression_filter.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/block_processor.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/filter_analyzer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/subtractor.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/echo_path_delay_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/subband_erle_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/render_delay_controller_metrics.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/block_processor_metrics.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/vector_buffer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/erl_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/aec_state.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/adaptive_fir_filter.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/fft_data.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/render_delay_controller.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/skew_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/render_delay_controller_metrics.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/comfort_noise_generator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/echo_path_delay_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/erl_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/echo_remover.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/block_framer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/erle_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/reverb_model.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/cascaded_biquad_filter.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/matrix_buffer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/render_buffer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/reverb_model_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/subtractor_output.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/stationarity_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/render_signal_analyzer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/echo_path_variability.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/moving_average.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/render_reverb_model.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/subtractor_output_analyzer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/suppression_gain.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/echo_audibility.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/block_processor_metrics.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/render_delay_controller.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/suppression_gain.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/moving_average.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/erle_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/subband_erle_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/reverb_model_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/aec3_common.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/residual_echo_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/block_processor.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/fullband_erle_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/matched_filter.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/stationarity_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/echo_canceller3.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/skew_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/reverb_decay_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/render_delay_controller2.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/render_buffer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/suppression_gain_limiter.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/main_filter_update_gain.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/echo_remover.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/reverb_model_fallback.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/downsampled_render_buffer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/vector_buffer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/matrix_buffer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/reverb_frequency_response.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/echo_audibility.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/fft_buffer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/block_processor2.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/echo_canceller3.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/block_delay_buffer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/aec3_common.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/fft_buffer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/vector_math.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/decimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/frame_blocker.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/block_framer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/suppression_gain_limiter.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/delay_estimate.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/comfort_noise_generator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/reverb_model.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/main_filter_update_gain.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/matched_filter_lag_aggregator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/shadow_filter_update_gain.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/filter_analyzer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/reverb_decay_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/reverb_frequency_response.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/decimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec3/render_delay_buffer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/echo_control_mobile_impl.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/gain_control_impl.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/typing_detection.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/logging/apm_data_dumper.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/logging/apm_data_dumper.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/voice_activity_detector.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/standalone_vad.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/vad_audio_proc_internal.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/pitch_internal.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/vad_circular_buffer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/vad_circular_buffer.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/pitch_based_vad.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/vad_audio_proc.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/pole_zero_filter.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/pole_zero_filter.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/pitch_based_vad.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/gmm.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/common.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/vad_audio_proc.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/voice_gmm_tables.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/noise_gmm_tables.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/pitch_internal.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/gmm.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/standalone_vad.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/vad/voice_activity_detector.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/utility/delay_estimator_internal.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/utility/ooura_fft.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/utility/ooura_fft.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/utility/delay_estimator_wrapper.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/utility/ooura_fft_sse2.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/utility/delay_estimator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/utility/block_mean_calculator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/utility/block_mean_calculator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/utility/delay_estimator.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/utility/ooura_fft_tables_common.h', + '<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/utility/delay_estimator_wrapper.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/mocks/mock_smoothing_filter.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/wav_file.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/window_generator.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/channel_buffer.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/fir_filter_factory.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/sparse_fir_filter.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/fir_filter_sse.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/window_generator.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/ring_buffer.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/fir_filter.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/include/audio_util.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/wav_header.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/real_fourier_ooura.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/audio_util.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/real_fourier_ooura.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/fir_filter_sse.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/smoothing_filter.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/resampler/push_sinc_resampler.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/resampler/sinc_resampler.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/resampler/resampler.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/resampler/sinc_resampler_sse.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/resampler/include/push_resampler.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/resampler/include/resampler.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/resampler/push_sinc_resampler.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/resampler/push_resampler.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/resampler/sinusoidal_linear_chirp_source.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/resampler/sinc_resampler.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/resampler/sinusoidal_linear_chirp_source.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/fir_filter_factory.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/audio_converter.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/wav_file.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/third_party/fft4g/fft4g.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/third_party/fft4g/fft4g.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/audio_converter.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/real_fourier.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/channel_buffer.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/real_fourier.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/sparse_fir_filter.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/smoothing_filter.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/fir_filter_c.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/ring_buffer.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/fir_filter_c.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/complex_fft_tables.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/complex_fft.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/filter_ma_fast_q12.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/levinson_durbin.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/dot_product_with_scale.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/auto_corr_to_refl_coef.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/resample_by_2_internal.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/energy.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/sqrt_of_one_minus_x_squared.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/downsample_fast.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/splitting_filter1.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/filter_ar_fast_q12.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/spl_init.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/lpc_to_refl_coef.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/cross_correlation.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/include/signal_processing_library.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/include/real_fft.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/include/spl_inl.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/division_operations.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/auto_correlation.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/get_scaling_square.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/dot_product_with_scale.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/resample_by_2_internal.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/resample.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/min_max_operations.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/refl_coef_to_lpc.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/filter_ar.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/vector_scaling_operations.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/resample_fractional.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/real_fft.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/ilbc_specific_functions.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/complex_bit_reverse.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/randomization_functions.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/copy_set_operations.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/resample_by_2.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/get_hanning_window.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/resample_48khz.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/spl_inl.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/spl_sqrt.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/wav_header.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/vad/vad_sp.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/vad/vad.cc', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/vad/webrtc_vad.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/vad/vad_core.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/vad/include/vad.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/vad/include/webrtc_vad.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/vad/vad_gmm.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/vad/vad_filterbank.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/vad/vad_core.c', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/vad/vad_sp.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/vad/vad_filterbank.h', + '<(tgvoip_src_loc)/webrtc_dsp/common_audio/vad/vad_gmm.c', + + # ARM/NEON sources + # TODO check if there's a good way to make these compile with ARM ports of TDesktop + #'<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/ns/nsx_core_neon.c', + #'<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aec/aec_core_neon.cc', + #'<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/aecm/aecm_core_neon.cc', + #'<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/utility/ooura_fft_tables_neon_sse2.h', + #'<(tgvoip_src_loc)/webrtc_dsp/modules/audio_processing/utility/ooura_fft_neon.cc', + #'<(tgvoip_src_loc)/webrtc_dsp/common_audio/fir_filter_neon.cc', + #'<(tgvoip_src_loc)/webrtc_dsp/common_audio/resampler/sinc_resampler_neon.cc', + #'<(tgvoip_src_loc)/webrtc_dsp/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor_arm.S', + #'<(tgvoip_src_loc)/webrtc_dsp/common_audio/fir_filter_neon.h', + #'<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/downsample_fast_neon.c', + #'<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/complex_bit_reverse_arm.S', + #'<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/include/spl_inl_armv7.h', + #'<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/min_max_operations_neon.c', + #'<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/cross_correlation_neon.c', + #'<(tgvoip_src_loc)/webrtc_dsp/common_audio/signal_processing/filter_ar_fast_q12_armv7.S', + ], 'libraries': [], @@ -270,13 +748,18 @@ [ '"<(OS)" == "mac"', { 'xcode_settings': { - 'CLANG_CXX_LANGUAGE_STANDARD': 'c++1z', + 'CLANG_CXX_LANGUAGE_STANDARD': 'c++11', + 'ALWAYS_SEARCH_USER_PATHS': 'NO', }, 'defines': [ 'WEBRTC_POSIX', 'WEBRTC_MAC', 'TARGET_OS_OSX', ], + 'sources': [ + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/logging_mac.mm', + '<(tgvoip_src_loc)/webrtc_dsp/rtc_base/logging_mac.h', + ], 'conditions': [ [ '"<(official_build_target)" == "mac32"', { 'xcode_settings': { @@ -305,7 +788,8 @@ 'defines': [ 'NOMINMAX', '_USING_V110_SDK71_', - 'TGVOIP_WINXP_COMPAT' + 'TGVOIP_WINXP_COMPAT', + 'WEBRTC_WIN', ], 'libraries': [ 'winmm', @@ -385,6 +869,7 @@ '"<(OS)" == "linux"', { 'defines': [ 'WEBRTC_POSIX', + 'WEBRTC_LINUX', ], 'conditions': [ [ '""; }; 69791A561EE8272A00BB85FB /* Resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Resampler.h; sourceTree = ""; }; + 697E961921A4EA0700E03846 /* typedefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typedefs.h; sourceTree = ""; }; + 697E988C21A4ED6800E03846 /* field_trial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = field_trial.h; sourceTree = ""; }; + 697E988D21A4ED6800E03846 /* cpu_features_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu_features_wrapper.h; sourceTree = ""; }; + 697E988E21A4ED6800E03846 /* asm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asm_defines.h; sourceTree = ""; }; + 697E988F21A4ED6800E03846 /* metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = metrics.h; sourceTree = ""; }; + 697E989021A4ED6800E03846 /* compile_assert_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compile_assert_c.h; sourceTree = ""; }; + 697E989221A4ED6800E03846 /* field_trial.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = field_trial.cc; sourceTree = ""; }; + 697E989321A4ED6800E03846 /* metrics.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = metrics.cc; sourceTree = ""; }; + 697E989421A4ED6800E03846 /* cpu_features.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpu_features.cc; sourceTree = ""; }; + 697E989721A4ED6800E03846 /* mock_smoothing_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mock_smoothing_filter.h; sourceTree = ""; }; + 697E989821A4ED6800E03846 /* wav_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wav_file.h; sourceTree = ""; }; + 697E989921A4ED6800E03846 /* window_generator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = window_generator.cc; sourceTree = ""; }; + 697E989A21A4ED6800E03846 /* channel_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = channel_buffer.cc; sourceTree = ""; }; + 697E989B21A4ED6800E03846 /* fir_filter_factory.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fir_filter_factory.cc; sourceTree = ""; }; + 697E989C21A4ED6800E03846 /* sparse_fir_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sparse_fir_filter.h; sourceTree = ""; }; + 697E989D21A4ED6800E03846 /* fir_filter_sse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fir_filter_sse.h; sourceTree = ""; }; + 697E989E21A4ED6800E03846 /* window_generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = window_generator.h; sourceTree = ""; }; + 697E989F21A4ED6800E03846 /* ring_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ring_buffer.h; sourceTree = ""; }; + 697E98A021A4ED6800E03846 /* fir_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fir_filter.h; sourceTree = ""; }; + 697E98A221A4ED6800E03846 /* audio_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_util.h; sourceTree = ""; }; + 697E98A321A4ED6800E03846 /* wav_header.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wav_header.cc; sourceTree = ""; }; + 697E98A421A4ED6800E03846 /* real_fourier_ooura.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = real_fourier_ooura.cc; sourceTree = ""; }; + 697E98A521A4ED6800E03846 /* fir_filter_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fir_filter_neon.cc; sourceTree = ""; }; + 697E98A621A4ED6800E03846 /* audio_util.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_util.cc; sourceTree = ""; }; + 697E98A721A4ED6800E03846 /* real_fourier_ooura.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = real_fourier_ooura.h; sourceTree = ""; }; + 697E98A821A4ED6800E03846 /* fir_filter_sse.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fir_filter_sse.cc; sourceTree = ""; }; + 697E98A921A4ED6800E03846 /* smoothing_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smoothing_filter.h; sourceTree = ""; }; + 697E98AB21A4ED6800E03846 /* sinc_resampler_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sinc_resampler_neon.cc; sourceTree = ""; }; + 697E98AC21A4ED6800E03846 /* push_sinc_resampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = push_sinc_resampler.cc; sourceTree = ""; }; + 697E98AD21A4ED6800E03846 /* sinc_resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sinc_resampler.h; sourceTree = ""; }; + 697E98AE21A4ED6800E03846 /* resampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = resampler.cc; sourceTree = ""; }; + 697E98AF21A4ED6800E03846 /* sinc_resampler_sse.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sinc_resampler_sse.cc; sourceTree = ""; }; + 697E98B121A4ED6800E03846 /* push_resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = push_resampler.h; sourceTree = ""; }; + 697E98B221A4ED6800E03846 /* resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resampler.h; sourceTree = ""; }; + 697E98B321A4ED6800E03846 /* push_sinc_resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = push_sinc_resampler.h; sourceTree = ""; }; + 697E98B421A4ED6800E03846 /* push_resampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = push_resampler.cc; sourceTree = ""; }; + 697E98B521A4ED6800E03846 /* sinusoidal_linear_chirp_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sinusoidal_linear_chirp_source.h; sourceTree = ""; }; + 697E98B621A4ED6800E03846 /* sinc_resampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sinc_resampler.cc; sourceTree = ""; }; + 697E98B721A4ED6800E03846 /* sinusoidal_linear_chirp_source.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sinusoidal_linear_chirp_source.cc; sourceTree = ""; }; + 697E98B821A4ED6800E03846 /* fir_filter_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fir_filter_factory.h; sourceTree = ""; }; + 697E98B921A4ED6800E03846 /* audio_converter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_converter.h; sourceTree = ""; }; + 697E98BA21A4ED6800E03846 /* wav_file.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wav_file.cc; sourceTree = ""; }; + 697E98BD21A4ED6800E03846 /* spl_sqrt_floor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_sqrt_floor.c; sourceTree = ""; }; + 697E98BE21A4ED6800E03846 /* spl_sqrt_floor_arm.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = spl_sqrt_floor_arm.S; sourceTree = ""; }; + 697E98BF21A4ED6800E03846 /* spl_sqrt_floor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_sqrt_floor.h; sourceTree = ""; }; + 697E98C121A4ED6800E03846 /* fft4g.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fft4g.c; sourceTree = ""; }; + 697E98C221A4ED6800E03846 /* fft4g.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft4g.h; sourceTree = ""; }; + 697E98C321A4ED6800E03846 /* audio_converter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_converter.cc; sourceTree = ""; }; + 697E98C421A4ED6800E03846 /* real_fourier.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = real_fourier.cc; sourceTree = ""; }; + 697E98C521A4ED6800E03846 /* channel_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = channel_buffer.h; sourceTree = ""; }; + 697E98C621A4ED6800E03846 /* real_fourier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = real_fourier.h; sourceTree = ""; }; + 697E98C721A4ED6800E03846 /* sparse_fir_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sparse_fir_filter.cc; sourceTree = ""; }; + 697E98C821A4ED6800E03846 /* fir_filter_neon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fir_filter_neon.h; sourceTree = ""; }; + 697E98C921A4ED6800E03846 /* smoothing_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = smoothing_filter.cc; sourceTree = ""; }; + 697E98CA21A4ED6800E03846 /* fir_filter_c.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fir_filter_c.cc; sourceTree = ""; }; + 697E98CB21A4ED6800E03846 /* ring_buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ring_buffer.c; sourceTree = ""; }; + 697E98CC21A4ED6800E03846 /* fir_filter_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fir_filter_c.h; sourceTree = ""; }; + 697E98CE21A4ED6800E03846 /* complex_fft_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = complex_fft_tables.h; sourceTree = ""; }; + 697E98CF21A4ED6800E03846 /* complex_fft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = complex_fft.c; sourceTree = ""; }; + 697E98D021A4ED6800E03846 /* filter_ma_fast_q12.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ma_fast_q12.c; sourceTree = ""; }; + 697E98D121A4ED6800E03846 /* splitting_filter1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = splitting_filter1.c; sourceTree = ""; }; + 697E98D221A4ED6800E03846 /* levinson_durbin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = levinson_durbin.c; sourceTree = ""; }; + 697E98D321A4ED6800E03846 /* downsample_fast_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = downsample_fast_neon.c; sourceTree = ""; }; + 697E98D421A4ED6800E03846 /* dot_product_with_scale.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dot_product_with_scale.cc; sourceTree = ""; }; + 697E98D521A4ED6800E03846 /* auto_corr_to_refl_coef.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = auto_corr_to_refl_coef.c; sourceTree = ""; }; + 697E98D621A4ED6800E03846 /* resample_by_2_internal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_by_2_internal.c; sourceTree = ""; }; + 697E98D721A4ED6800E03846 /* complex_bit_reverse_arm.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = complex_bit_reverse_arm.S; sourceTree = ""; }; + 697E98D821A4ED6800E03846 /* energy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = energy.c; sourceTree = ""; }; + 697E98D921A4ED6800E03846 /* sqrt_of_one_minus_x_squared.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sqrt_of_one_minus_x_squared.c; sourceTree = ""; }; + 697E98DA21A4ED6800E03846 /* downsample_fast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = downsample_fast.c; sourceTree = ""; }; + 697E98DB21A4ED6800E03846 /* filter_ar_fast_q12.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ar_fast_q12.c; sourceTree = ""; }; + 697E98DC21A4ED6800E03846 /* spl_init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_init.c; sourceTree = ""; }; + 697E98DD21A4ED6800E03846 /* lpc_to_refl_coef.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_to_refl_coef.c; sourceTree = ""; }; + 697E98DE21A4ED6800E03846 /* cross_correlation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cross_correlation.c; sourceTree = ""; }; + 697E98E021A4ED6800E03846 /* signal_processing_library.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = signal_processing_library.h; sourceTree = ""; }; + 697E98E121A4ED6800E03846 /* real_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = real_fft.h; sourceTree = ""; }; + 697E98E221A4ED6800E03846 /* spl_inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl.h; sourceTree = ""; }; + 697E98E321A4ED6800E03846 /* spl_inl_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl_armv7.h; sourceTree = ""; }; + 697E98E421A4ED6800E03846 /* division_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = division_operations.c; sourceTree = ""; }; + 697E98E521A4ED6800E03846 /* auto_correlation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = auto_correlation.c; sourceTree = ""; }; + 697E98E621A4ED6800E03846 /* get_scaling_square.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = get_scaling_square.c; sourceTree = ""; }; + 697E98E721A4ED6800E03846 /* min_max_operations_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = min_max_operations_neon.c; sourceTree = ""; }; + 697E98E821A4ED6800E03846 /* dot_product_with_scale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dot_product_with_scale.h; sourceTree = ""; }; + 697E98E921A4ED6800E03846 /* resample_by_2_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resample_by_2_internal.h; sourceTree = ""; }; + 697E98EA21A4ED6800E03846 /* resample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample.c; sourceTree = ""; }; + 697E98EB21A4ED6800E03846 /* cross_correlation_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cross_correlation_neon.c; sourceTree = ""; }; + 697E98EC21A4ED6800E03846 /* min_max_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = min_max_operations.c; sourceTree = ""; }; + 697E98ED21A4ED6800E03846 /* refl_coef_to_lpc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = refl_coef_to_lpc.c; sourceTree = ""; }; + 697E98EE21A4ED6800E03846 /* filter_ar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ar.c; sourceTree = ""; }; + 697E98EF21A4ED6800E03846 /* vector_scaling_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vector_scaling_operations.c; sourceTree = ""; }; + 697E98F021A4ED6800E03846 /* resample_fractional.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_fractional.c; sourceTree = ""; }; + 697E98F121A4ED6800E03846 /* real_fft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = real_fft.c; sourceTree = ""; }; + 697E98F221A4ED6800E03846 /* ilbc_specific_functions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ilbc_specific_functions.c; sourceTree = ""; }; + 697E98F321A4ED6800E03846 /* complex_bit_reverse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = complex_bit_reverse.c; sourceTree = ""; }; + 697E98F421A4ED6800E03846 /* randomization_functions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = randomization_functions.c; sourceTree = ""; }; + 697E98F521A4ED6800E03846 /* filter_ar_fast_q12_armv7.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = filter_ar_fast_q12_armv7.S; sourceTree = ""; }; + 697E98F621A4ED6800E03846 /* copy_set_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = copy_set_operations.c; sourceTree = ""; }; + 697E98F721A4ED6800E03846 /* resample_by_2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_by_2.c; sourceTree = ""; }; + 697E98F821A4ED6800E03846 /* get_hanning_window.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = get_hanning_window.c; sourceTree = ""; }; + 697E98F921A4ED6800E03846 /* resample_48khz.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_48khz.c; sourceTree = ""; }; + 697E98FA21A4ED6800E03846 /* spl_inl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_inl.c; sourceTree = ""; }; + 697E98FB21A4ED6800E03846 /* spl_sqrt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_sqrt.c; sourceTree = ""; }; + 697E98FC21A4ED6800E03846 /* wav_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wav_header.h; sourceTree = ""; }; + 697E98FE21A4ED6800E03846 /* vad_sp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vad_sp.c; sourceTree = ""; }; + 697E98FF21A4ED6800E03846 /* vad.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vad.cc; sourceTree = ""; }; + 697E990021A4ED6800E03846 /* webrtc_vad.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = webrtc_vad.c; sourceTree = ""; }; + 697E990121A4ED6800E03846 /* vad_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_core.h; sourceTree = ""; }; + 697E990321A4ED6800E03846 /* vad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad.h; sourceTree = ""; }; + 697E990421A4ED6800E03846 /* webrtc_vad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = webrtc_vad.h; sourceTree = ""; }; + 697E990521A4ED6800E03846 /* vad_gmm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_gmm.h; sourceTree = ""; }; + 697E990621A4ED6800E03846 /* vad_filterbank.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vad_filterbank.c; sourceTree = ""; }; + 697E990721A4ED6800E03846 /* vad_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vad_core.c; sourceTree = ""; }; + 697E990821A4ED6800E03846 /* vad_sp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_sp.h; sourceTree = ""; }; + 697E990921A4ED6800E03846 /* vad_filterbank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_filterbank.h; sourceTree = ""; }; + 697E990A21A4ED6800E03846 /* vad_gmm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vad_gmm.c; sourceTree = ""; }; + 697E990E21A4ED6800E03846 /* memutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memutil.h; sourceTree = ""; }; + 697E990F21A4ED6800E03846 /* memutil.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memutil.cc; sourceTree = ""; }; + 697E991021A4ED6800E03846 /* string_view.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = string_view.cc; sourceTree = ""; }; + 697E991121A4ED6800E03846 /* ascii.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ascii.h; sourceTree = ""; }; + 697E991221A4ED6800E03846 /* ascii.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ascii.cc; sourceTree = ""; }; + 697E991321A4ED6800E03846 /* string_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_view.h; sourceTree = ""; }; + 697E991521A4ED6800E03846 /* optional.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = optional.h; sourceTree = ""; }; + 697E991621A4ED6800E03846 /* bad_optional_access.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bad_optional_access.h; sourceTree = ""; }; + 697E991721A4ED6800E03846 /* bad_optional_access.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bad_optional_access.cc; sourceTree = ""; }; + 697E991821A4ED6800E03846 /* optional.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = optional.cc; sourceTree = ""; }; + 697E991A21A4ED6800E03846 /* memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memory.h; sourceTree = ""; }; + 697E991C21A4ED6800E03846 /* type_traits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type_traits.h; sourceTree = ""; }; + 697E991E21A4ED6800E03846 /* algorithm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = algorithm.h; sourceTree = ""; }; + 697E992021A4ED6800E03846 /* inlined_vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inlined_vector.h; sourceTree = ""; }; + 697E992221A4ED6800E03846 /* policy_checks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = policy_checks.h; sourceTree = ""; }; + 697E992321A4ED6800E03846 /* port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = port.h; sourceTree = ""; }; + 697E992421A4ED6800E03846 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; + 697E992621A4ED6800E03846 /* raw_logging.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = raw_logging.cc; sourceTree = ""; }; + 697E992721A4ED6800E03846 /* throw_delegate.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = throw_delegate.cc; sourceTree = ""; }; + 697E992821A4ED6800E03846 /* invoke.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = invoke.h; sourceTree = ""; }; + 697E992921A4ED6800E03846 /* inline_variable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_variable.h; sourceTree = ""; }; + 697E992A21A4ED6800E03846 /* atomic_hook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = atomic_hook.h; sourceTree = ""; }; + 697E992B21A4ED6800E03846 /* identity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = identity.h; sourceTree = ""; }; + 697E992C21A4ED6800E03846 /* raw_logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = raw_logging.h; sourceTree = ""; }; + 697E992D21A4ED6800E03846 /* throw_delegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = throw_delegate.h; sourceTree = ""; }; + 697E992E21A4ED6800E03846 /* attributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = attributes.h; sourceTree = ""; }; + 697E992F21A4ED6800E03846 /* macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macros.h; sourceTree = ""; }; + 697E993021A4ED6800E03846 /* optimization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = optimization.h; sourceTree = ""; }; + 697E993121A4ED6800E03846 /* log_severity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log_severity.h; sourceTree = ""; }; + 697E993321A4ED6800E03846 /* utility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utility.h; sourceTree = ""; }; + 697E993621A4ED6900E03846 /* audio_frame.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_frame.cc; sourceTree = ""; }; + 697E993721A4ED6900E03846 /* echo_canceller3_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_canceller3_config.h; sourceTree = ""; }; + 697E993821A4ED6900E03846 /* echo_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_control.h; sourceTree = ""; }; + 697E993921A4ED6900E03846 /* audio_frame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_frame.h; sourceTree = ""; }; + 697E993A21A4ED6900E03846 /* echo_canceller3_config.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_canceller3_config.cc; sourceTree = ""; }; + 697E993B21A4ED6900E03846 /* echo_canceller3_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_canceller3_factory.h; sourceTree = ""; }; + 697E993C21A4ED6900E03846 /* echo_canceller3_factory.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_canceller3_factory.cc; sourceTree = ""; }; + 697E993D21A4ED6900E03846 /* array_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = array_view.h; sourceTree = ""; }; + 697E993F21A4ED6900E03846 /* string_to_number.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_to_number.h; sourceTree = ""; }; + 697E994021A4ED6900E03846 /* constructormagic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constructormagic.h; sourceTree = ""; }; + 697E994121A4ED6900E03846 /* race_checker.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = race_checker.cc; sourceTree = ""; }; + 697E994321A4ED6900E03846 /* string_builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_builder.h; sourceTree = ""; }; + 697E994421A4ED6900E03846 /* string_builder.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = string_builder.cc; sourceTree = ""; }; + 697E994521A4ED6900E03846 /* event_tracer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = event_tracer.h; sourceTree = ""; }; + 697E994621A4ED6900E03846 /* stringencode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringencode.h; sourceTree = ""; }; + 697E994821A4ED6900E03846 /* aligned_malloc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aligned_malloc.cc; sourceTree = ""; }; + 697E994921A4ED6900E03846 /* aligned_malloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aligned_malloc.h; sourceTree = ""; }; + 697E994A21A4ED6900E03846 /* timeutils.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = timeutils.cc; sourceTree = ""; }; + 697E994B21A4ED6900E03846 /* event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = event.h; sourceTree = ""; }; + 697E994D21A4ED6900E03846 /* ignore_wundef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ignore_wundef.h; sourceTree = ""; }; + 697E994E21A4ED6900E03846 /* stringutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringutils.h; sourceTree = ""; }; + 697E994F21A4ED6900E03846 /* arraysize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arraysize.h; sourceTree = ""; }; + 697E995021A4ED6900E03846 /* platform_file.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = platform_file.cc; sourceTree = ""; }; + 697E995121A4ED6900E03846 /* swap_queue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = swap_queue.h; sourceTree = ""; }; + 697E995221A4ED6900E03846 /* string_to_number.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = string_to_number.cc; sourceTree = ""; }; + 697E995321A4ED6900E03846 /* trace_event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = trace_event.h; sourceTree = ""; }; + 697E995421A4ED6900E03846 /* checks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = checks.h; sourceTree = ""; }; + 697E995521A4ED6900E03846 /* deprecation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = deprecation.h; sourceTree = ""; }; + 697E995621A4ED6900E03846 /* thread_checker_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = thread_checker_impl.cc; sourceTree = ""; }; + 697E995721A4ED6900E03846 /* sanitizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sanitizer.h; sourceTree = ""; }; + 697E995821A4ED6900E03846 /* scoped_ref_ptr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scoped_ref_ptr.h; sourceTree = ""; }; + 697E995921A4ED6900E03846 /* logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logging.h; sourceTree = ""; }; + 697E995A21A4ED6900E03846 /* timeutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timeutils.h; sourceTree = ""; }; + 697E995B21A4ED6900E03846 /* atomicops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = atomicops.h; sourceTree = ""; }; + 697E995C21A4ED6900E03846 /* stringencode.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringencode.cc; sourceTree = ""; }; + 697E995D21A4ED6900E03846 /* stringutils.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringutils.cc; sourceTree = ""; }; + 697E995E21A4ED6900E03846 /* checks.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = checks.cc; sourceTree = ""; }; + 697E996021A4ED6900E03846 /* safe_minmax.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_minmax.h; sourceTree = ""; }; + 697E996121A4ED6900E03846 /* safe_conversions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_conversions.h; sourceTree = ""; }; + 697E996221A4ED6900E03846 /* safe_conversions_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_conversions_impl.h; sourceTree = ""; }; + 697E996321A4ED6900E03846 /* safe_compare.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_compare.h; sourceTree = ""; }; + 697E996521A4ED6900E03846 /* unused.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unused.h; sourceTree = ""; }; + 697E996621A4ED6900E03846 /* inline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline.h; sourceTree = ""; }; + 697E996721A4ED6900E03846 /* ignore_warnings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ignore_warnings.h; sourceTree = ""; }; + 697E996821A4ED6900E03846 /* asm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asm_defines.h; sourceTree = ""; }; + 697E996921A4ED6900E03846 /* rtc_export.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rtc_export.h; sourceTree = ""; }; + 697E996A21A4ED6900E03846 /* arch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arch.h; sourceTree = ""; }; + 697E996B21A4ED6900E03846 /* platform_thread.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = platform_thread.cc; sourceTree = ""; }; + 697E996C21A4ED6900E03846 /* platform_thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_thread.h; sourceTree = ""; }; + 697E996D21A4ED6900E03846 /* logging_webrtc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = logging_webrtc.cc; sourceTree = ""; }; + 697E996E21A4ED6900E03846 /* platform_thread_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_thread_types.h; sourceTree = ""; }; + 697E996F21A4ED6900E03846 /* protobuf_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = protobuf_utils.h; sourceTree = ""; }; + 697E997021A4ED6900E03846 /* thread_annotations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread_annotations.h; sourceTree = ""; }; + 697E997121A4ED6900E03846 /* gtest_prod_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest_prod_util.h; sourceTree = ""; }; + 697E997221A4ED6900E03846 /* function_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function_view.h; sourceTree = ""; }; + 697E997321A4ED6900E03846 /* criticalsection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = criticalsection.h; sourceTree = ""; }; + 697E997421A4ED6900E03846 /* criticalsection.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = criticalsection.cc; sourceTree = ""; }; + 697E997521A4ED6900E03846 /* platform_thread_types.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = platform_thread_types.cc; sourceTree = ""; }; + 697E997621A4ED6900E03846 /* refcount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = refcount.h; sourceTree = ""; }; + 697E997721A4ED6900E03846 /* event.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = event.cc; sourceTree = ""; }; + 697E997821A4ED6900E03846 /* thread_checker_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread_checker_impl.h; sourceTree = ""; }; + 697E997921A4ED6900E03846 /* event_tracer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = event_tracer.cc; sourceTree = ""; }; + 697E997A21A4ED6900E03846 /* compile_assert_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compile_assert_c.h; sourceTree = ""; }; + 697E997B21A4ED6900E03846 /* type_traits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type_traits.h; sourceTree = ""; }; + 697E997C21A4ED6900E03846 /* platform_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_file.h; sourceTree = ""; }; + 697E997D21A4ED6900E03846 /* refcounter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = refcounter.h; sourceTree = ""; }; + 697E997F21A4ED6900E03846 /* thread_checker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread_checker.h; sourceTree = ""; }; + 697E998021A4ED6900E03846 /* race_checker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = race_checker.h; sourceTree = ""; }; + 697E998121A4ED6900E03846 /* refcountedobject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = refcountedobject.h; sourceTree = ""; }; + 697E998521A4ED6900E03846 /* fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft.h; sourceTree = ""; }; + 697E998621A4ED6900E03846 /* fft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fft.c; sourceTree = ""; }; + 697E998A21A4ED6900E03846 /* bandwidth_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bandwidth_info.h; sourceTree = ""; }; + 697E998D21A4ED6900E03846 /* isac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = isac.h; sourceTree = ""; }; + 697E998F21A4ED6900E03846 /* pitch_estimator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pitch_estimator.c; sourceTree = ""; }; + 697E999021A4ED6900E03846 /* lpc_shape_swb16_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_shape_swb16_tables.c; sourceTree = ""; }; + 697E999121A4ED6900E03846 /* pitch_gain_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pitch_gain_tables.c; sourceTree = ""; }; + 697E999221A4ED6900E03846 /* arith_routines_logist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = arith_routines_logist.c; sourceTree = ""; }; + 697E999321A4ED6900E03846 /* os_specific_inline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = os_specific_inline.h; sourceTree = ""; }; + 697E999421A4ED6900E03846 /* filterbanks.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filterbanks.c; sourceTree = ""; }; + 697E999521A4ED6900E03846 /* entropy_coding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = entropy_coding.h; sourceTree = ""; }; + 697E999621A4ED6900E03846 /* isac_vad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = isac_vad.h; sourceTree = ""; }; + 697E999721A4ED6900E03846 /* settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = settings.h; sourceTree = ""; }; + 697E999821A4ED6900E03846 /* transform.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = transform.c; sourceTree = ""; }; + 697E999921A4ED6900E03846 /* lpc_shape_swb12_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lpc_shape_swb12_tables.h; sourceTree = ""; }; + 697E999A21A4ED6900E03846 /* arith_routines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arith_routines.h; sourceTree = ""; }; + 697E999B21A4ED6900E03846 /* crc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crc.h; sourceTree = ""; }; + 697E999C21A4ED6900E03846 /* pitch_filter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pitch_filter.c; sourceTree = ""; }; + 697E999D21A4ED6900E03846 /* encode_lpc_swb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = encode_lpc_swb.c; sourceTree = ""; }; + 697E999E21A4ED6900E03846 /* filter_functions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_functions.c; sourceTree = ""; }; + 697E999F21A4ED6900E03846 /* decode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = decode.c; sourceTree = ""; }; + 697E99A021A4ED6900E03846 /* lattice.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lattice.c; sourceTree = ""; }; + 697E99A121A4ED6900E03846 /* intialize.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = intialize.c; sourceTree = ""; }; + 697E99A221A4ED6900E03846 /* lpc_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_tables.c; sourceTree = ""; }; + 697E99A321A4ED6900E03846 /* lpc_gain_swb_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_gain_swb_tables.c; sourceTree = ""; }; + 697E99A421A4ED6900E03846 /* bandwidth_estimator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bandwidth_estimator.c; sourceTree = ""; }; + 697E99A521A4ED6900E03846 /* isac_float_type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = isac_float_type.h; sourceTree = ""; }; + 697E99A621A4ED6900E03846 /* pitch_lag_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_lag_tables.h; sourceTree = ""; }; + 697E99A721A4ED6900E03846 /* encode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = encode.c; sourceTree = ""; }; + 697E99A821A4ED6900E03846 /* lpc_analysis.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_analysis.c; sourceTree = ""; }; + 697E99A921A4ED6900E03846 /* spectrum_ar_model_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spectrum_ar_model_tables.h; sourceTree = ""; }; + 697E99AA21A4ED6900E03846 /* arith_routines_hist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = arith_routines_hist.c; sourceTree = ""; }; + 697E99AB21A4ED6900E03846 /* codec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = codec.h; sourceTree = ""; }; + 697E99AC21A4ED6900E03846 /* pitch_gain_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_gain_tables.h; sourceTree = ""; }; + 697E99AD21A4ED6900E03846 /* lpc_shape_swb16_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lpc_shape_swb16_tables.h; sourceTree = ""; }; + 697E99AE21A4ED6900E03846 /* pitch_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_estimator.h; sourceTree = ""; }; + 697E99AF21A4ED6900E03846 /* entropy_coding.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = entropy_coding.c; sourceTree = ""; }; + 697E99B021A4ED6900E03846 /* isac_vad.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = isac_vad.c; sourceTree = ""; }; + 697E99B121A4ED6900E03846 /* structs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = structs.h; sourceTree = ""; }; + 697E99B221A4ED6900E03846 /* filter_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filter_functions.h; sourceTree = ""; }; + 697E99B321A4ED6900E03846 /* encode_lpc_swb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = encode_lpc_swb.h; sourceTree = ""; }; + 697E99B421A4ED6900E03846 /* pitch_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_filter.h; sourceTree = ""; }; + 697E99B521A4ED6900E03846 /* arith_routines.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = arith_routines.c; sourceTree = ""; }; + 697E99B621A4ED6900E03846 /* crc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = crc.c; sourceTree = ""; }; + 697E99B721A4ED6900E03846 /* lpc_shape_swb12_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_shape_swb12_tables.c; sourceTree = ""; }; + 697E99B821A4ED6900E03846 /* lpc_analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lpc_analysis.h; sourceTree = ""; }; + 697E99B921A4ED6900E03846 /* decode_bwe.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = decode_bwe.c; sourceTree = ""; }; + 697E99BA21A4ED6900E03846 /* spectrum_ar_model_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spectrum_ar_model_tables.c; sourceTree = ""; }; + 697E99BB21A4ED6900E03846 /* bandwidth_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bandwidth_estimator.h; sourceTree = ""; }; + 697E99BC21A4ED6900E03846 /* pitch_lag_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pitch_lag_tables.c; sourceTree = ""; }; + 697E99BD21A4ED6900E03846 /* isac.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = isac.c; sourceTree = ""; }; + 697E99BE21A4ED6900E03846 /* lpc_gain_swb_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lpc_gain_swb_tables.h; sourceTree = ""; }; + 697E99BF21A4ED6900E03846 /* lpc_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lpc_tables.h; sourceTree = ""; }; + 697E99C121A4ED6900E03846 /* rms_level.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rms_level.cc; sourceTree = ""; }; + 697E99C321A4ED6900E03846 /* moving_max.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = moving_max.h; sourceTree = ""; }; + 697E99C421A4ED6900E03846 /* circular_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = circular_buffer.h; sourceTree = ""; }; + 697E99C521A4ED6900E03846 /* normalized_covariance_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = normalized_covariance_estimator.h; sourceTree = ""; }; + 697E99C621A4ED6900E03846 /* normalized_covariance_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = normalized_covariance_estimator.cc; sourceTree = ""; }; + 697E99C721A4ED6900E03846 /* moving_max.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moving_max.cc; sourceTree = ""; }; + 697E99C821A4ED6900E03846 /* circular_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = circular_buffer.cc; sourceTree = ""; }; + 697E99C921A4ED6900E03846 /* mean_variance_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mean_variance_estimator.cc; sourceTree = ""; }; + 697E99CA21A4ED6900E03846 /* mean_variance_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mean_variance_estimator.h; sourceTree = ""; }; + 697E99CB21A4ED6900E03846 /* gain_control_for_experimental_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_control_for_experimental_agc.h; sourceTree = ""; }; + 697E99CC21A4ED6900E03846 /* splitting_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = splitting_filter.cc; sourceTree = ""; }; + 697E99CD21A4ED6900E03846 /* gain_control_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gain_control_impl.cc; sourceTree = ""; }; + 697E99CE21A4ED6900E03846 /* rms_level.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rms_level.h; sourceTree = ""; }; + 697E99D421A4ED6900E03846 /* ns_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ns_core.h; sourceTree = ""; }; + 697E99D521A4ED6900E03846 /* nsx_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core.c; sourceTree = ""; }; + 697E99D621A4ED6900E03846 /* noise_suppression_x.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = noise_suppression_x.c; sourceTree = ""; }; + 697E99D721A4ED6900E03846 /* nsx_core_c.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core_c.c; sourceTree = ""; }; + 697E99D821A4ED6900E03846 /* defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = defines.h; sourceTree = ""; }; + 697E99D921A4ED6900E03846 /* noise_suppression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_suppression.h; sourceTree = ""; }; + 697E99DA21A4ED6900E03846 /* ns_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ns_core.c; sourceTree = ""; }; + 697E99DB21A4ED6900E03846 /* nsx_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsx_core.h; sourceTree = ""; }; + 697E99DC21A4ED6900E03846 /* windows_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = windows_private.h; sourceTree = ""; }; + 697E99DD21A4ED6900E03846 /* noise_suppression_x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_suppression_x.h; sourceTree = ""; }; + 697E99DE21A4ED6900E03846 /* nsx_core_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core_neon.c; sourceTree = ""; }; + 697E99DF21A4ED6900E03846 /* noise_suppression.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = noise_suppression.c; sourceTree = ""; }; + 697E99E021A4ED6900E03846 /* nsx_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsx_defines.h; sourceTree = ""; }; + 697E99E121A4ED6900E03846 /* residual_echo_detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = residual_echo_detector.h; sourceTree = ""; }; + 697E99E221A4ED6900E03846 /* audio_processing_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_processing_impl.h; sourceTree = ""; }; + 697E99E321A4ED6900E03846 /* audio_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_buffer.cc; sourceTree = ""; }; + 697E99E421A4ED6900E03846 /* typing_detection.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = typing_detection.cc; sourceTree = ""; }; + 697E99E521A4ED6900E03846 /* render_queue_item_verifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_queue_item_verifier.h; sourceTree = ""; }; + 697E99E821A4ED6900E03846 /* audio_generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_generator.h; sourceTree = ""; }; + 697E99E921A4ED6900E03846 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; + 697E99EA21A4ED6900E03846 /* audio_frame_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_frame_view.h; sourceTree = ""; }; + 697E99EB21A4ED6900E03846 /* mock_audio_processing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mock_audio_processing.h; sourceTree = ""; }; + 697E99EC21A4ED6900E03846 /* gain_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_control.h; sourceTree = ""; }; + 697E99ED21A4ED6900E03846 /* audio_generator_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_generator_factory.h; sourceTree = ""; }; + 697E99EE21A4ED6900E03846 /* audio_processing_statistics.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_processing_statistics.cc; sourceTree = ""; }; + 697E99EF21A4ED6900E03846 /* audio_generator_factory.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_generator_factory.cc; sourceTree = ""; }; + 697E99F021A4ED6900E03846 /* aec_dump.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_dump.cc; sourceTree = ""; }; + 697E99F121A4ED6900E03846 /* aec_dump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_dump.h; sourceTree = ""; }; + 697E99F221A4ED6900E03846 /* audio_processing_statistics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_processing_statistics.h; sourceTree = ""; }; + 697E99F321A4ED6900E03846 /* audio_processing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_processing.h; sourceTree = ""; }; + 697E99F421A4ED6900E03846 /* audio_processing.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_processing.cc; sourceTree = ""; }; + 697E99F521A4ED6900E03846 /* config.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = config.cc; sourceTree = ""; }; + 697E99F721A4ED6900E03846 /* interpolated_gain_curve.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interpolated_gain_curve.h; sourceTree = ""; }; + 697E99F821A4ED6900E03846 /* biquad_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = biquad_filter.h; sourceTree = ""; }; + 697E99F921A4ED6900E03846 /* interpolated_gain_curve.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = interpolated_gain_curve.cc; sourceTree = ""; }; + 697E99FA21A4ED6900E03846 /* agc2_common.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agc2_common.cc; sourceTree = ""; }; + 697E99FB21A4ED6900E03846 /* agc2_testing_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agc2_testing_common.h; sourceTree = ""; }; + 697E99FC21A4ED6900E03846 /* adaptive_mode_level_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adaptive_mode_level_estimator.h; sourceTree = ""; }; + 697E99FD21A4ED6900E03846 /* gain_applier.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gain_applier.cc; sourceTree = ""; }; + 697E99FE21A4ED6900E03846 /* signal_classifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = signal_classifier.h; sourceTree = ""; }; + 697E99FF21A4ED6900E03846 /* adaptive_agc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = adaptive_agc.cc; sourceTree = ""; }; + 697E9A0021A4ED6900E03846 /* adaptive_digital_gain_applier.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = adaptive_digital_gain_applier.cc; sourceTree = ""; }; + 697E9A0121A4ED6900E03846 /* limiter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = limiter.cc; sourceTree = ""; }; + 697E9A0221A4ED6900E03846 /* saturation_protector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = saturation_protector.cc; sourceTree = ""; }; + 697E9A0321A4ED6900E03846 /* vector_float_frame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vector_float_frame.h; sourceTree = ""; }; + 697E9A0521A4ED6900E03846 /* spectral_features_internal.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spectral_features_internal.cc; sourceTree = ""; }; + 697E9A0621A4ED6900E03846 /* sequence_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sequence_buffer.h; sourceTree = ""; }; + 697E9A0721A4ED6900E03846 /* rnn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rnn.h; sourceTree = ""; }; + 697E9A0821A4ED6900E03846 /* rnn.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rnn.cc; sourceTree = ""; }; + 697E9A0921A4ED6900E03846 /* test_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = test_utils.h; sourceTree = ""; }; + 697E9A0A21A4ED6900E03846 /* pitch_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_info.h; sourceTree = ""; }; + 697E9A0B21A4ED6900E03846 /* lp_residual.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lp_residual.h; sourceTree = ""; }; + 697E9A0C21A4ED6900E03846 /* ring_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ring_buffer.h; sourceTree = ""; }; + 697E9A0D21A4ED6900E03846 /* pitch_search_internal.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pitch_search_internal.cc; sourceTree = ""; }; + 697E9A0E21A4ED6900E03846 /* symmetric_matrix_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = symmetric_matrix_buffer.h; sourceTree = ""; }; + 697E9A0F21A4ED6900E03846 /* spectral_features.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spectral_features.h; sourceTree = ""; }; + 697E9A1021A4ED6900E03846 /* features_extraction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = features_extraction.h; sourceTree = ""; }; + 697E9A1121A4ED6900E03846 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; + 697E9A1221A4ED6900E03846 /* spectral_features_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spectral_features_internal.h; sourceTree = ""; }; + 697E9A1321A4ED6900E03846 /* fft_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft_util.h; sourceTree = ""; }; + 697E9A1421A4ED6900E03846 /* spectral_features.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spectral_features.cc; sourceTree = ""; }; + 697E9A1521A4ED6900E03846 /* pitch_search_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_search_internal.h; sourceTree = ""; }; + 697E9A1621A4ED6900E03846 /* pitch_search.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pitch_search.cc; sourceTree = ""; }; + 697E9A1721A4ED6900E03846 /* pitch_search.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_search.h; sourceTree = ""; }; + 697E9A1821A4ED6900E03846 /* features_extraction.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = features_extraction.cc; sourceTree = ""; }; + 697E9A1921A4ED6900E03846 /* fft_util.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fft_util.cc; sourceTree = ""; }; + 697E9A1A21A4ED6900E03846 /* lp_residual.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lp_residual.cc; sourceTree = ""; }; + 697E9A1B21A4ED6900E03846 /* fixed_gain_controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fixed_gain_controller.h; sourceTree = ""; }; + 697E9A1C21A4ED6900E03846 /* adaptive_mode_level_estimator_agc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = adaptive_mode_level_estimator_agc.cc; sourceTree = ""; }; + 697E9A1D21A4ED6900E03846 /* vector_float_frame.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vector_float_frame.cc; sourceTree = ""; }; + 697E9A1E21A4ED6900E03846 /* down_sampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = down_sampler.h; sourceTree = ""; }; + 697E9A1F21A4ED6900E03846 /* noise_level_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = noise_level_estimator.cc; sourceTree = ""; }; + 697E9A2021A4ED6900E03846 /* agc2_testing_common.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agc2_testing_common.cc; sourceTree = ""; }; + 697E9A2121A4ED6900E03846 /* fixed_digital_level_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fixed_digital_level_estimator.cc; sourceTree = ""; }; + 697E9A2221A4ED6900E03846 /* fixed_gain_controller.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fixed_gain_controller.cc; sourceTree = ""; }; + 697E9A2321A4ED6900E03846 /* saturation_protector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = saturation_protector.h; sourceTree = ""; }; + 697E9A2421A4ED6900E03846 /* vad_with_level.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vad_with_level.cc; sourceTree = ""; }; + 697E9A2521A4ED6900E03846 /* limiter_db_gain_curve.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = limiter_db_gain_curve.cc; sourceTree = ""; }; + 697E9A2621A4ED6900E03846 /* agc2_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agc2_common.h; sourceTree = ""; }; + 697E9A2721A4ED6900E03846 /* adaptive_mode_level_estimator_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adaptive_mode_level_estimator_agc.h; sourceTree = ""; }; + 697E9A2821A4ED6900E03846 /* adaptive_digital_gain_applier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adaptive_digital_gain_applier.h; sourceTree = ""; }; + 697E9A2921A4ED6900E03846 /* vad_with_level.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_with_level.h; sourceTree = ""; }; + 697E9A2A21A4ED6900E03846 /* limiter_db_gain_curve.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = limiter_db_gain_curve.h; sourceTree = ""; }; + 697E9A2B21A4ED6900E03846 /* fixed_digital_level_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fixed_digital_level_estimator.h; sourceTree = ""; }; + 697E9A2C21A4ED6900E03846 /* adaptive_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adaptive_agc.h; sourceTree = ""; }; + 697E9A2D21A4ED6900E03846 /* gain_applier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_applier.h; sourceTree = ""; }; + 697E9A2E21A4ED6900E03846 /* down_sampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = down_sampler.cc; sourceTree = ""; }; + 697E9A2F21A4ED6900E03846 /* noise_level_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_level_estimator.h; sourceTree = ""; }; + 697E9A3021A4ED6900E03846 /* signal_classifier.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = signal_classifier.cc; sourceTree = ""; }; + 697E9A3121A4ED6900E03846 /* noise_spectrum_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = noise_spectrum_estimator.cc; sourceTree = ""; }; + 697E9A3221A4ED6900E03846 /* compute_interpolated_gain_curve.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compute_interpolated_gain_curve.cc; sourceTree = ""; }; + 697E9A3321A4ED6900E03846 /* compute_interpolated_gain_curve.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compute_interpolated_gain_curve.h; sourceTree = ""; }; + 697E9A3421A4ED6900E03846 /* biquad_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = biquad_filter.cc; sourceTree = ""; }; + 697E9A3521A4ED6900E03846 /* noise_spectrum_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_spectrum_estimator.h; sourceTree = ""; }; + 697E9A3621A4ED6900E03846 /* limiter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = limiter.h; sourceTree = ""; }; + 697E9A3721A4ED6900E03846 /* adaptive_mode_level_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = adaptive_mode_level_estimator.cc; sourceTree = ""; }; + 697E9A3921A4ED6900E03846 /* moving_moments.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moving_moments.cc; sourceTree = ""; }; + 697E9A3A21A4ED6900E03846 /* transient_detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transient_detector.h; sourceTree = ""; }; + 697E9A3B21A4ED6900E03846 /* wpd_tree.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wpd_tree.cc; sourceTree = ""; }; + 697E9A3C21A4ED6900E03846 /* transient_suppressor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transient_suppressor.h; sourceTree = ""; }; + 697E9A3D21A4ED6900E03846 /* daubechies_8_wavelet_coeffs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = daubechies_8_wavelet_coeffs.h; sourceTree = ""; }; + 697E9A3E21A4ED6900E03846 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; + 697E9A3F21A4ED6900E03846 /* wpd_node.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wpd_node.h; sourceTree = ""; }; + 697E9A4021A4ED6900E03846 /* moving_moments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = moving_moments.h; sourceTree = ""; }; + 697E9A4121A4ED6900E03846 /* wpd_tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wpd_tree.h; sourceTree = ""; }; + 697E9A4221A4ED6900E03846 /* wpd_node.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wpd_node.cc; sourceTree = ""; }; + 697E9A4321A4ED6900E03846 /* transient_suppressor.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transient_suppressor.cc; sourceTree = ""; }; + 697E9A4421A4ED6900E03846 /* transient_detector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transient_detector.cc; sourceTree = ""; }; + 697E9A4521A4ED6900E03846 /* dyadic_decimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dyadic_decimator.h; sourceTree = ""; }; + 697E9A4621A4ED6900E03846 /* low_cut_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = low_cut_filter.cc; sourceTree = ""; }; + 697E9A4721A4ED6900E03846 /* noise_suppression_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_suppression_impl.h; sourceTree = ""; }; + 697E9A4821A4ED6900E03846 /* level_estimator_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = level_estimator_impl.cc; sourceTree = ""; }; + 697E9A4921A4ED6900E03846 /* three_band_filter_bank.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = three_band_filter_bank.cc; sourceTree = ""; }; + 697E9A4B21A4ED6900E03846 /* echo_cancellation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_cancellation.cc; sourceTree = ""; }; + 697E9A4C21A4ED6900E03846 /* aec_resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_resampler.h; sourceTree = ""; }; + 697E9A4D21A4ED6900E03846 /* aec_resampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_resampler.cc; sourceTree = ""; }; + 697E9A4E21A4ED6900E03846 /* echo_cancellation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_cancellation.h; sourceTree = ""; }; + 697E9A4F21A4ED6900E03846 /* aec_core.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core.cc; sourceTree = ""; }; + 697E9A5021A4ED6900E03846 /* aec_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_core.h; sourceTree = ""; }; + 697E9A5121A4ED6900E03846 /* aec_core_optimized_methods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_core_optimized_methods.h; sourceTree = ""; }; + 697E9A5221A4ED6900E03846 /* aec_core_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core_neon.cc; sourceTree = ""; }; + 697E9A5321A4ED6900E03846 /* aec_core_sse2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core_sse2.cc; sourceTree = ""; }; + 697E9A5421A4ED6900E03846 /* aec_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_common.h; sourceTree = ""; }; + 697E9A5521A4ED6900E03846 /* voice_detection_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = voice_detection_impl.h; sourceTree = ""; }; + 697E9A5621A4ED6900E03846 /* voice_detection_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = voice_detection_impl.cc; sourceTree = ""; }; + 697E9A5721A4ED6900E03846 /* echo_cancellation_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_cancellation_impl.cc; sourceTree = ""; }; + 697E9A5821A4ED6900E03846 /* gain_control_for_experimental_agc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gain_control_for_experimental_agc.cc; sourceTree = ""; }; + 697E9A5A21A4ED6900E03846 /* agc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agc.cc; sourceTree = ""; }; + 697E9A5B21A4ED6900E03846 /* loudness_histogram.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loudness_histogram.cc; sourceTree = ""; }; + 697E9A5C21A4ED6900E03846 /* agc_manager_direct.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agc_manager_direct.cc; sourceTree = ""; }; + 697E9A5E21A4ED6900E03846 /* analog_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = analog_agc.h; sourceTree = ""; }; + 697E9A5F21A4ED6900E03846 /* gain_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_control.h; sourceTree = ""; }; + 697E9A6021A4ED6900E03846 /* digital_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = digital_agc.h; sourceTree = ""; }; + 697E9A6121A4ED6900E03846 /* analog_agc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = analog_agc.c; sourceTree = ""; }; + 697E9A6221A4ED6900E03846 /* digital_agc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = digital_agc.c; sourceTree = ""; }; + 697E9A6321A4ED6900E03846 /* utility.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = utility.cc; sourceTree = ""; }; + 697E9A6421A4ED6900E03846 /* mock_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mock_agc.h; sourceTree = ""; }; + 697E9A6521A4ED6900E03846 /* loudness_histogram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loudness_histogram.h; sourceTree = ""; }; + 697E9A6621A4ED6900E03846 /* gain_map_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_map_internal.h; sourceTree = ""; }; + 697E9A6721A4ED6900E03846 /* utility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utility.h; sourceTree = ""; }; + 697E9A6821A4ED6900E03846 /* agc_manager_direct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agc_manager_direct.h; sourceTree = ""; }; + 697E9A6921A4ED6900E03846 /* agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agc.h; sourceTree = ""; }; + 697E9A6A21A4ED6900E03846 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; + 697E9A6B21A4ED6900E03846 /* audio_processing_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_processing_impl.cc; sourceTree = ""; }; + 697E9A6C21A4ED6900E03846 /* audio_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_buffer.h; sourceTree = ""; }; + 697E9A6D21A4ED6900E03846 /* echo_control_mobile_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_control_mobile_impl.h; sourceTree = ""; }; + 697E9A6E21A4ED6900E03846 /* splitting_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = splitting_filter.h; sourceTree = ""; }; + 697E9A6F21A4ED6900E03846 /* low_cut_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = low_cut_filter.h; sourceTree = ""; }; + 697E9A7121A4ED6A00E03846 /* file_audio_generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file_audio_generator.h; sourceTree = ""; }; + 697E9A7221A4ED6A00E03846 /* file_audio_generator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_audio_generator.cc; sourceTree = ""; }; + 697E9A7321A4ED6A00E03846 /* gain_controller2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gain_controller2.cc; sourceTree = ""; }; + 697E9A7421A4ED6A00E03846 /* three_band_filter_bank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = three_band_filter_bank.h; sourceTree = ""; }; + 697E9A7521A4ED6A00E03846 /* residual_echo_detector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = residual_echo_detector.cc; sourceTree = ""; }; + 697E9A7621A4ED6A00E03846 /* echo_cancellation_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_cancellation_impl.h; sourceTree = ""; }; + 697E9A7721A4ED6A00E03846 /* noise_suppression_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = noise_suppression_impl.cc; sourceTree = ""; }; + 697E9A7821A4ED6A00E03846 /* level_estimator_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = level_estimator_impl.h; sourceTree = ""; }; + 697E9A7921A4ED6A00E03846 /* gain_controller2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_controller2.h; sourceTree = ""; }; + 697E9A7B21A4ED6A00E03846 /* aecm_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aecm_core.h; sourceTree = ""; }; + 697E9A7C21A4ED6A00E03846 /* aecm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aecm_defines.h; sourceTree = ""; }; + 697E9A7D21A4ED6A00E03846 /* aecm_core.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core.cc; sourceTree = ""; }; + 697E9A7E21A4ED6A00E03846 /* aecm_core_c.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core_c.cc; sourceTree = ""; }; + 697E9A7F21A4ED6A00E03846 /* aecm_core_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core_neon.cc; sourceTree = ""; }; + 697E9A8021A4ED6A00E03846 /* echo_control_mobile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_control_mobile.h; sourceTree = ""; }; + 697E9A8121A4ED6A00E03846 /* echo_control_mobile.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_control_mobile.cc; sourceTree = ""; }; + 697E9A8321A4ED6A00E03846 /* render_reverb_model.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_reverb_model.cc; sourceTree = ""; }; + 697E9A8421A4ED6A00E03846 /* downsampled_render_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = downsampled_render_buffer.h; sourceTree = ""; }; + 697E9A8521A4ED6A00E03846 /* subtractor_output_analyzer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = subtractor_output_analyzer.h; sourceTree = ""; }; + 697E9A8621A4ED6A00E03846 /* reverb_model_fallback.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reverb_model_fallback.cc; sourceTree = ""; }; + 697E9A8721A4ED6A00E03846 /* residual_echo_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = residual_echo_estimator.h; sourceTree = ""; }; + 697E9A8821A4ED6A00E03846 /* shadow_filter_update_gain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shadow_filter_update_gain.h; sourceTree = ""; }; + 697E9A8921A4ED6A00E03846 /* echo_remover_metrics.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_remover_metrics.cc; sourceTree = ""; }; + 697E9A8A21A4ED6A00E03846 /* matched_filter_lag_aggregator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = matched_filter_lag_aggregator.cc; sourceTree = ""; }; + 697E9A8B21A4ED6A00E03846 /* render_delay_buffer2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_delay_buffer2.cc; sourceTree = ""; }; + 697E9A8C21A4ED6A00E03846 /* aec_state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_state.h; sourceTree = ""; }; + 697E9A8D21A4ED6A00E03846 /* suppression_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = suppression_filter.h; sourceTree = ""; }; + 697E9A8E21A4ED6A00E03846 /* echo_path_variability.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_path_variability.cc; sourceTree = ""; }; + 697E9A8F21A4ED6A00E03846 /* frame_blocker.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = frame_blocker.cc; sourceTree = ""; }; + 697E9A9021A4ED6A00E03846 /* subtractor.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = subtractor.cc; sourceTree = ""; }; + 697E9A9121A4ED6A00E03846 /* block_delay_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_delay_buffer.h; sourceTree = ""; }; + 697E9A9221A4ED6A00E03846 /* adaptive_fir_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adaptive_fir_filter.h; sourceTree = ""; }; + 697E9A9321A4ED6A00E03846 /* cascaded_biquad_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cascaded_biquad_filter.h; sourceTree = ""; }; + 697E9A9421A4ED6A00E03846 /* matched_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = matched_filter.h; sourceTree = ""; }; + 697E9A9521A4ED6A00E03846 /* subtractor_output.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = subtractor_output.h; sourceTree = ""; }; + 697E9A9621A4ED6A00E03846 /* render_signal_analyzer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_signal_analyzer.h; sourceTree = ""; }; + 697E9A9721A4ED6A00E03846 /* aec3_fft.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec3_fft.cc; sourceTree = ""; }; + 697E9A9821A4ED6A00E03846 /* aec3_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec3_fft.h; sourceTree = ""; }; + 697E9A9921A4ED6A00E03846 /* echo_remover_metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_remover_metrics.h; sourceTree = ""; }; + 697E9A9A21A4ED6A00E03846 /* fullband_erle_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fullband_erle_estimator.cc; sourceTree = ""; }; + 697E9A9B21A4ED6A00E03846 /* suppression_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = suppression_filter.cc; sourceTree = ""; }; + 697E9A9C21A4ED6A00E03846 /* block_processor.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_processor.cc; sourceTree = ""; }; + 697E9A9D21A4ED6A00E03846 /* filter_analyzer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filter_analyzer.h; sourceTree = ""; }; + 697E9A9E21A4ED6A00E03846 /* subtractor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = subtractor.h; sourceTree = ""; }; + 697E9A9F21A4ED6A00E03846 /* echo_path_delay_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_path_delay_estimator.h; sourceTree = ""; }; + 697E9AA021A4ED6A00E03846 /* subband_erle_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = subband_erle_estimator.cc; sourceTree = ""; }; + 697E9AA121A4ED6A00E03846 /* render_delay_controller_metrics.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_delay_controller_metrics.cc; sourceTree = ""; }; + 697E9AA221A4ED6A00E03846 /* render_delay_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_delay_buffer.cc; sourceTree = ""; }; + 697E9AA321A4ED6A00E03846 /* block_processor_metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_processor_metrics.h; sourceTree = ""; }; + 697E9AA421A4ED6A00E03846 /* vector_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vector_buffer.cc; sourceTree = ""; }; + 697E9AA521A4ED6A00E03846 /* erl_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = erl_estimator.cc; sourceTree = ""; }; + 697E9AA621A4ED6A00E03846 /* aec_state.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_state.cc; sourceTree = ""; }; + 697E9AA721A4ED6A00E03846 /* adaptive_fir_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = adaptive_fir_filter.cc; sourceTree = ""; }; + 697E9AA821A4ED6A00E03846 /* fft_data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft_data.h; sourceTree = ""; }; + 697E9AA921A4ED6A00E03846 /* render_delay_controller.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_delay_controller.cc; sourceTree = ""; }; + 697E9AAA21A4ED6A00E03846 /* skew_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = skew_estimator.cc; sourceTree = ""; }; + 697E9AAB21A4ED6A00E03846 /* render_delay_controller_metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_delay_controller_metrics.h; sourceTree = ""; }; + 697E9AAC21A4ED6A00E03846 /* comfort_noise_generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = comfort_noise_generator.h; sourceTree = ""; }; + 697E9AAD21A4ED6A00E03846 /* echo_path_delay_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_path_delay_estimator.cc; sourceTree = ""; }; + 697E9AAE21A4ED6A00E03846 /* erl_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = erl_estimator.h; sourceTree = ""; }; + 697E9AAF21A4ED6A00E03846 /* echo_remover.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_remover.h; sourceTree = ""; }; + 697E9AB021A4ED6A00E03846 /* block_framer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_framer.cc; sourceTree = ""; }; + 697E9AB121A4ED6A00E03846 /* erle_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = erle_estimator.cc; sourceTree = ""; }; + 697E9AB221A4ED6A00E03846 /* reverb_model.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reverb_model.cc; sourceTree = ""; }; + 697E9AB321A4ED6A00E03846 /* cascaded_biquad_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cascaded_biquad_filter.cc; sourceTree = ""; }; + 697E9AB421A4ED6A00E03846 /* matrix_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = matrix_buffer.h; sourceTree = ""; }; + 697E9AB521A4ED6A00E03846 /* render_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_buffer.cc; sourceTree = ""; }; + 697E9AB621A4ED6A00E03846 /* reverb_model_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reverb_model_estimator.h; sourceTree = ""; }; + 697E9AB721A4ED6A00E03846 /* subtractor_output.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = subtractor_output.cc; sourceTree = ""; }; + 697E9AB821A4ED6A00E03846 /* stationarity_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stationarity_estimator.cc; sourceTree = ""; }; + 697E9AB921A4ED6A00E03846 /* render_signal_analyzer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_signal_analyzer.cc; sourceTree = ""; }; + 697E9ABA21A4ED6A00E03846 /* echo_path_variability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_path_variability.h; sourceTree = ""; }; + 697E9ABB21A4ED6A00E03846 /* moving_average.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = moving_average.h; sourceTree = ""; }; + 697E9ABC21A4ED6A00E03846 /* render_reverb_model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_reverb_model.h; sourceTree = ""; }; + 697E9ABD21A4ED6A00E03846 /* subtractor_output_analyzer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = subtractor_output_analyzer.cc; sourceTree = ""; }; + 697E9ABE21A4ED6A00E03846 /* suppression_gain.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = suppression_gain.cc; sourceTree = ""; }; + 697E9ABF21A4ED6A00E03846 /* echo_audibility.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_audibility.cc; sourceTree = ""; }; + 697E9AC021A4ED6A00E03846 /* block_processor_metrics.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_processor_metrics.cc; sourceTree = ""; }; + 697E9AC121A4ED6A00E03846 /* render_delay_controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_delay_controller.h; sourceTree = ""; }; + 697E9AC221A4ED6A00E03846 /* suppression_gain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = suppression_gain.h; sourceTree = ""; }; + 697E9AC321A4ED6A00E03846 /* moving_average.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moving_average.cc; sourceTree = ""; }; + 697E9AC421A4ED6A00E03846 /* erle_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = erle_estimator.h; sourceTree = ""; }; + 697E9AC521A4ED6A00E03846 /* subband_erle_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = subband_erle_estimator.h; sourceTree = ""; }; + 697E9AC621A4ED6A00E03846 /* reverb_model_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reverb_model_estimator.cc; sourceTree = ""; }; + 697E9AC721A4ED6A00E03846 /* aec3_common.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec3_common.cc; sourceTree = ""; }; + 697E9AC821A4ED6A00E03846 /* residual_echo_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = residual_echo_estimator.cc; sourceTree = ""; }; + 697E9AC921A4ED6A00E03846 /* block_processor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_processor.h; sourceTree = ""; }; + 697E9ACA21A4ED6A00E03846 /* fullband_erle_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fullband_erle_estimator.h; sourceTree = ""; }; + 697E9ACB21A4ED6A00E03846 /* matched_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = matched_filter.cc; sourceTree = ""; }; + 697E9ACC21A4ED6A00E03846 /* stationarity_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stationarity_estimator.h; sourceTree = ""; }; + 697E9ACD21A4ED6A00E03846 /* echo_canceller3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_canceller3.h; sourceTree = ""; }; + 697E9ACE21A4ED6A00E03846 /* skew_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = skew_estimator.h; sourceTree = ""; }; + 697E9ACF21A4ED6A00E03846 /* reverb_decay_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reverb_decay_estimator.cc; sourceTree = ""; }; + 697E9AD021A4ED6A00E03846 /* render_delay_controller2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_delay_controller2.cc; sourceTree = ""; }; + 697E9AD121A4ED6A00E03846 /* render_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_buffer.h; sourceTree = ""; }; + 697E9AD221A4ED6A00E03846 /* suppression_gain_limiter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = suppression_gain_limiter.cc; sourceTree = ""; }; + 697E9AD321A4ED6A00E03846 /* main_filter_update_gain.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main_filter_update_gain.cc; sourceTree = ""; }; + 697E9AD421A4ED6A00E03846 /* echo_remover.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_remover.cc; sourceTree = ""; }; + 697E9AD521A4ED6A00E03846 /* reverb_model_fallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reverb_model_fallback.h; sourceTree = ""; }; + 697E9AD621A4ED6A00E03846 /* downsampled_render_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = downsampled_render_buffer.cc; sourceTree = ""; }; + 697E9AD721A4ED6A00E03846 /* vector_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vector_buffer.h; sourceTree = ""; }; + 697E9AD821A4ED6A00E03846 /* matrix_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = matrix_buffer.cc; sourceTree = ""; }; + 697E9AD921A4ED6A00E03846 /* reverb_frequency_response.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reverb_frequency_response.h; sourceTree = ""; }; + 697E9ADA21A4ED6A00E03846 /* echo_audibility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_audibility.h; sourceTree = ""; }; + 697E9ADB21A4ED6A00E03846 /* fft_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft_buffer.h; sourceTree = ""; }; + 697E9ADC21A4ED6A00E03846 /* block_processor2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_processor2.cc; sourceTree = ""; }; + 697E9ADD21A4ED6A00E03846 /* echo_canceller3.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_canceller3.cc; sourceTree = ""; }; + 697E9ADE21A4ED6A00E03846 /* block_delay_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_delay_buffer.cc; sourceTree = ""; }; + 697E9ADF21A4ED6A00E03846 /* aec3_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec3_common.h; sourceTree = ""; }; + 697E9AE021A4ED6A00E03846 /* fft_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fft_buffer.cc; sourceTree = ""; }; + 697E9AE121A4ED6A00E03846 /* vector_math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vector_math.h; sourceTree = ""; }; + 697E9AE221A4ED6A00E03846 /* decimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decimator.h; sourceTree = ""; }; + 697E9AE321A4ED6A00E03846 /* frame_blocker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = frame_blocker.h; sourceTree = ""; }; + 697E9AE421A4ED6A00E03846 /* block_framer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_framer.h; sourceTree = ""; }; + 697E9AE521A4ED6A00E03846 /* suppression_gain_limiter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = suppression_gain_limiter.h; sourceTree = ""; }; + 697E9AE621A4ED6A00E03846 /* delay_estimate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimate.h; sourceTree = ""; }; + 697E9AE721A4ED6A00E03846 /* comfort_noise_generator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = comfort_noise_generator.cc; sourceTree = ""; }; + 697E9AE821A4ED6A00E03846 /* reverb_model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reverb_model.h; sourceTree = ""; }; + 697E9AE921A4ED6A00E03846 /* main_filter_update_gain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = main_filter_update_gain.h; sourceTree = ""; }; + 697E9AEA21A4ED6A00E03846 /* matched_filter_lag_aggregator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = matched_filter_lag_aggregator.h; sourceTree = ""; }; + 697E9AEB21A4ED6A00E03846 /* shadow_filter_update_gain.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shadow_filter_update_gain.cc; sourceTree = ""; }; + 697E9AEC21A4ED6A00E03846 /* filter_analyzer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filter_analyzer.cc; sourceTree = ""; }; + 697E9AED21A4ED6A00E03846 /* reverb_decay_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reverb_decay_estimator.h; sourceTree = ""; }; + 697E9AEE21A4ED6A00E03846 /* reverb_frequency_response.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reverb_frequency_response.cc; sourceTree = ""; }; + 697E9AEF21A4ED6A00E03846 /* decimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = decimator.cc; sourceTree = ""; }; + 697E9AF021A4ED6A00E03846 /* render_delay_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_delay_buffer.h; sourceTree = ""; }; + 697E9AF121A4ED6A00E03846 /* echo_control_mobile_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_control_mobile_impl.cc; sourceTree = ""; }; + 697E9AF221A4ED6A00E03846 /* gain_control_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_control_impl.h; sourceTree = ""; }; + 697E9AF321A4ED6A00E03846 /* typing_detection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typing_detection.h; sourceTree = ""; }; + 697E9AF521A4ED6A00E03846 /* apm_data_dumper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = apm_data_dumper.cc; sourceTree = ""; }; + 697E9AF621A4ED6A00E03846 /* apm_data_dumper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apm_data_dumper.h; sourceTree = ""; }; + 697E9AF821A4ED6A00E03846 /* voice_activity_detector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = voice_activity_detector.cc; sourceTree = ""; }; + 697E9AF921A4ED6A00E03846 /* standalone_vad.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = standalone_vad.cc; sourceTree = ""; }; + 697E9AFA21A4ED6A00E03846 /* vad_audio_proc_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_audio_proc_internal.h; sourceTree = ""; }; + 697E9AFB21A4ED6A00E03846 /* pitch_internal.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pitch_internal.cc; sourceTree = ""; }; + 697E9AFC21A4ED6A00E03846 /* vad_circular_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vad_circular_buffer.cc; sourceTree = ""; }; + 697E9AFD21A4ED6A00E03846 /* vad_circular_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_circular_buffer.h; sourceTree = ""; }; + 697E9AFE21A4ED6A00E03846 /* pitch_based_vad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_based_vad.h; sourceTree = ""; }; + 697E9AFF21A4ED6A00E03846 /* vad_audio_proc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vad_audio_proc.cc; sourceTree = ""; }; + 697E9B0021A4ED6A00E03846 /* pole_zero_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pole_zero_filter.cc; sourceTree = ""; }; + 697E9B0121A4ED6A00E03846 /* pole_zero_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pole_zero_filter.h; sourceTree = ""; }; + 697E9B0221A4ED6A00E03846 /* pitch_based_vad.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pitch_based_vad.cc; sourceTree = ""; }; + 697E9B0321A4ED6A00E03846 /* gmm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gmm.h; sourceTree = ""; }; + 697E9B0421A4ED6A00E03846 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; + 697E9B0521A4ED6A00E03846 /* vad_audio_proc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_audio_proc.h; sourceTree = ""; }; + 697E9B0621A4ED6A00E03846 /* voice_gmm_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = voice_gmm_tables.h; sourceTree = ""; }; + 697E9B0721A4ED6A00E03846 /* noise_gmm_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_gmm_tables.h; sourceTree = ""; }; + 697E9B0821A4ED6A00E03846 /* pitch_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_internal.h; sourceTree = ""; }; + 697E9B0921A4ED6A00E03846 /* gmm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gmm.cc; sourceTree = ""; }; + 697E9B0A21A4ED6A00E03846 /* standalone_vad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = standalone_vad.h; sourceTree = ""; }; + 697E9B0B21A4ED6A00E03846 /* voice_activity_detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = voice_activity_detector.h; sourceTree = ""; }; + 697E9B0D21A4ED6A00E03846 /* ooura_fft_tables_neon_sse2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft_tables_neon_sse2.h; sourceTree = ""; }; + 697E9B0E21A4ED6A00E03846 /* delay_estimator_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator_internal.h; sourceTree = ""; }; + 697E9B0F21A4ED6A00E03846 /* ooura_fft.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft.cc; sourceTree = ""; }; + 697E9B1021A4ED6A00E03846 /* ooura_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft.h; sourceTree = ""; }; + 697E9B1121A4ED6A00E03846 /* delay_estimator_wrapper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = delay_estimator_wrapper.cc; sourceTree = ""; }; + 697E9B1221A4ED6A00E03846 /* ooura_fft_sse2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft_sse2.cc; sourceTree = ""; }; + 697E9B1321A4ED6A00E03846 /* delay_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = delay_estimator.cc; sourceTree = ""; }; + 697E9B1421A4ED6A00E03846 /* block_mean_calculator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_mean_calculator.h; sourceTree = ""; }; + 697E9B1521A4ED6A00E03846 /* ooura_fft_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft_neon.cc; sourceTree = ""; }; + 697E9B1621A4ED6A00E03846 /* block_mean_calculator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_mean_calculator.cc; sourceTree = ""; }; + 697E9B1721A4ED6A00E03846 /* delay_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator.h; sourceTree = ""; }; + 697E9B1821A4ED6A00E03846 /* ooura_fft_tables_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft_tables_common.h; sourceTree = ""; }; + 697E9B1921A4ED6A00E03846 /* delay_estimator_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator_wrapper.h; sourceTree = ""; }; + 697E9B1D21A4ED6A00E03846 /* rnn_vad_weights.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rnn_vad_weights.cc; sourceTree = ""; }; + 697E9B1E21A4ED6A00E03846 /* rnn_activations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rnn_activations.h; sourceTree = ""; }; + 697E9B1F21A4ED6A00E03846 /* kiss_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kiss_fft.h; sourceTree = ""; }; + 697E9B2021A4ED6A00E03846 /* kiss_fft.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = kiss_fft.cc; sourceTree = ""; }; + 697E9B2121A4ED6A00E03846 /* rnn_vad_weights.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rnn_vad_weights.h; sourceTree = ""; }; 69960A021EF85C2900F9D091 /* DarwinSpecific.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DarwinSpecific.h; sourceTree = ""; }; 69960A031EF85C2900F9D091 /* DarwinSpecific.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DarwinSpecific.mm; sourceTree = ""; }; 69986175209526D400B68BEC /* Buffers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Buffers.cpp; sourceTree = ""; }; 69986176209526D400B68BEC /* Buffers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Buffers.h; sourceTree = ""; }; 699861792095292900B68BEC /* PacketReassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PacketReassembler.cpp; sourceTree = ""; }; 6998617A2095292A00B68BEC /* PacketReassembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketReassembler.h; sourceTree = ""; }; - 69A6DD011E95EC7700000E69 /* array_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = array_view.h; sourceTree = ""; }; - 69A6DD021E95EC7700000E69 /* atomicops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = atomicops.h; sourceTree = ""; }; - 69A6DD031E95EC7700000E69 /* basictypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = basictypes.h; sourceTree = ""; }; - 69A6DD041E95EC7700000E69 /* checks.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = checks.cc; sourceTree = ""; }; - 69A6DD051E95EC7700000E69 /* checks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = checks.h; sourceTree = ""; }; - 69A6DD061E95EC7700000E69 /* constructormagic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constructormagic.h; sourceTree = ""; }; - 69A6DD071E95EC7700000E69 /* safe_compare.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_compare.h; sourceTree = ""; }; - 69A6DD081E95EC7700000E69 /* safe_conversions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_conversions.h; sourceTree = ""; }; - 69A6DD091E95EC7700000E69 /* safe_conversions_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_conversions_impl.h; sourceTree = ""; }; - 69A6DD0A1E95EC7700000E69 /* sanitizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sanitizer.h; sourceTree = ""; }; - 69A6DD0B1E95EC7700000E69 /* stringutils.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringutils.cc; sourceTree = ""; }; - 69A6DD0C1E95EC7700000E69 /* stringutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringutils.h; sourceTree = ""; }; - 69A6DD0D1E95EC7700000E69 /* type_traits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type_traits.h; sourceTree = ""; }; - 69A6DD0F1E95EC7700000E69 /* audio_util.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_util.cc; sourceTree = ""; }; - 69A6DD101E95EC7700000E69 /* channel_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = channel_buffer.cc; sourceTree = ""; }; - 69A6DD111E95EC7700000E69 /* channel_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = channel_buffer.h; sourceTree = ""; }; - 69A6DD121E95EC7700000E69 /* fft4g.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fft4g.c; sourceTree = ""; }; - 69A6DD131E95EC7700000E69 /* fft4g.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft4g.h; sourceTree = ""; }; - 69A6DD151E95EC7700000E69 /* audio_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_util.h; sourceTree = ""; }; - 69A6DD161E95EC7700000E69 /* ring_buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ring_buffer.c; sourceTree = ""; }; - 69A6DD171E95EC7700000E69 /* ring_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ring_buffer.h; sourceTree = ""; }; - 69A6DD191E95EC7700000E69 /* auto_corr_to_refl_coef.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = auto_corr_to_refl_coef.c; sourceTree = ""; }; - 69A6DD1A1E95EC7700000E69 /* auto_correlation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = auto_correlation.c; sourceTree = ""; }; - 69A6DD1B1E95EC7700000E69 /* complex_bit_reverse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = complex_bit_reverse.c; sourceTree = ""; }; - 69A6DD1C1E95EC7700000E69 /* complex_bit_reverse_arm.S */ = {isa = PBXFileReference; explicitFileType = sourcecode.asm.llvm; fileEncoding = 4; path = complex_bit_reverse_arm.S; sourceTree = ""; }; - 69A6DD1D1E95EC7700000E69 /* complex_fft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = complex_fft.c; sourceTree = ""; }; - 69A6DD1E1E95EC7700000E69 /* complex_fft_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = complex_fft_tables.h; sourceTree = ""; }; - 69A6DD1F1E95EC7700000E69 /* copy_set_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = copy_set_operations.c; sourceTree = ""; }; - 69A6DD201E95EC7700000E69 /* cross_correlation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cross_correlation.c; sourceTree = ""; }; - 69A6DD211E95EC7700000E69 /* cross_correlation_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cross_correlation_neon.c; sourceTree = ""; }; - 69A6DD221E95EC7700000E69 /* division_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = division_operations.c; sourceTree = ""; }; - 69A6DD231E95EC7700000E69 /* dot_product_with_scale.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dot_product_with_scale.c; sourceTree = ""; }; - 69A6DD241E95EC7700000E69 /* downsample_fast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = downsample_fast.c; sourceTree = ""; }; - 69A6DD251E95EC7700000E69 /* downsample_fast_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = downsample_fast_neon.c; sourceTree = ""; }; - 69A6DD261E95EC7700000E69 /* energy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = energy.c; sourceTree = ""; }; - 69A6DD271E95EC7700000E69 /* filter_ar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ar.c; sourceTree = ""; }; - 69A6DD281E95EC7700000E69 /* filter_ar_fast_q12.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ar_fast_q12.c; sourceTree = ""; }; - 69A6DD291E95EC7700000E69 /* filter_ar_fast_q12_armv7.S */ = {isa = PBXFileReference; explicitFileType = sourcecode.asm.llvm; fileEncoding = 4; path = filter_ar_fast_q12_armv7.S; sourceTree = ""; }; - 69A6DD2A1E95EC7700000E69 /* filter_ma_fast_q12.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ma_fast_q12.c; sourceTree = ""; }; - 69A6DD2B1E95EC7700000E69 /* get_hanning_window.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = get_hanning_window.c; sourceTree = ""; }; - 69A6DD2C1E95EC7700000E69 /* get_scaling_square.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = get_scaling_square.c; sourceTree = ""; }; - 69A6DD2D1E95EC7700000E69 /* ilbc_specific_functions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ilbc_specific_functions.c; sourceTree = ""; }; - 69A6DD2F1E95EC7700000E69 /* real_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = real_fft.h; sourceTree = ""; }; - 69A6DD301E95EC7700000E69 /* signal_processing_library.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = signal_processing_library.h; sourceTree = ""; }; - 69A6DD311E95EC7700000E69 /* spl_inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl.h; sourceTree = ""; }; - 69A6DD321E95EC7700000E69 /* spl_inl_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl_armv7.h; sourceTree = ""; }; - 69A6DD331E95EC7700000E69 /* spl_inl_mips.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl_mips.h; sourceTree = ""; }; - 69A6DD341E95EC7700000E69 /* levinson_durbin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = levinson_durbin.c; sourceTree = ""; }; - 69A6DD351E95EC7700000E69 /* lpc_to_refl_coef.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_to_refl_coef.c; sourceTree = ""; }; - 69A6DD361E95EC7700000E69 /* min_max_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = min_max_operations.c; sourceTree = ""; }; - 69A6DD371E95EC7700000E69 /* min_max_operations_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = min_max_operations_neon.c; sourceTree = ""; }; - 69A6DD381E95EC7700000E69 /* randomization_functions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = randomization_functions.c; sourceTree = ""; }; - 69A6DD391E95EC7700000E69 /* real_fft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = real_fft.c; sourceTree = ""; }; - 69A6DD3B1E95EC7700000E69 /* refl_coef_to_lpc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = refl_coef_to_lpc.c; sourceTree = ""; }; - 69A6DD3C1E95EC7700000E69 /* resample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample.c; sourceTree = ""; }; - 69A6DD3D1E95EC7700000E69 /* resample_48khz.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_48khz.c; sourceTree = ""; }; - 69A6DD3E1E95EC7700000E69 /* resample_by_2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_by_2.c; sourceTree = ""; }; - 69A6DD3F1E95EC7700000E69 /* resample_by_2_internal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_by_2_internal.c; sourceTree = ""; }; - 69A6DD401E95EC7700000E69 /* resample_by_2_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resample_by_2_internal.h; sourceTree = ""; }; - 69A6DD411E95EC7700000E69 /* resample_fractional.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_fractional.c; sourceTree = ""; }; - 69A6DD421E95EC7700000E69 /* spl_init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_init.c; sourceTree = ""; }; - 69A6DD431E95EC7700000E69 /* spl_inl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_inl.c; sourceTree = ""; }; - 69A6DD441E95EC7700000E69 /* spl_sqrt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_sqrt.c; sourceTree = ""; }; - 69A6DD451E95EC7700000E69 /* spl_sqrt_floor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_sqrt_floor.c; sourceTree = ""; }; - 69A6DD461E95EC7700000E69 /* spl_sqrt_floor_arm.S */ = {isa = PBXFileReference; explicitFileType = sourcecode.asm.llvm; fileEncoding = 4; path = spl_sqrt_floor_arm.S; sourceTree = ""; }; - 69A6DD471E95EC7700000E69 /* splitting_filter_impl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = splitting_filter_impl.c; sourceTree = ""; }; - 69A6DD481E95EC7700000E69 /* sqrt_of_one_minus_x_squared.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sqrt_of_one_minus_x_squared.c; sourceTree = ""; }; - 69A6DD491E95EC7700000E69 /* vector_scaling_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vector_scaling_operations.c; sourceTree = ""; }; - 69A6DD4A1E95EC7700000E69 /* sparse_fir_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sparse_fir_filter.cc; sourceTree = ""; }; - 69A6DD4B1E95EC7700000E69 /* sparse_fir_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sparse_fir_filter.h; sourceTree = ""; }; - 69A6DD4F1E95EC7700000E69 /* aec_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_common.h; sourceTree = ""; }; - 69A6DD501E95EC7700000E69 /* aec_core.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core.cc; sourceTree = ""; }; - 69A6DD511E95EC7700000E69 /* aec_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_core.h; sourceTree = ""; }; - 69A6DD521E95EC7700000E69 /* aec_core_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core_neon.cc; sourceTree = ""; }; - 69A6DD531E95EC7700000E69 /* aec_core_optimized_methods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_core_optimized_methods.h; sourceTree = ""; }; - 69A6DD541E95EC7700000E69 /* aec_core_sse2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core_sse2.cc; sourceTree = ""; }; - 69A6DD551E95EC7700000E69 /* aec_resampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_resampler.cc; sourceTree = ""; }; - 69A6DD561E95EC7700000E69 /* aec_resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_resampler.h; sourceTree = ""; }; - 69A6DD571E95EC7700000E69 /* echo_cancellation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_cancellation.cc; sourceTree = ""; }; - 69A6DD581E95EC7700000E69 /* echo_cancellation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_cancellation.h; sourceTree = ""; }; - 69A6DD5A1E95EC7700000E69 /* aecm_core.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core.cc; sourceTree = ""; }; - 69A6DD5B1E95EC7700000E69 /* aecm_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aecm_core.h; sourceTree = ""; }; - 69A6DD5C1E95EC7700000E69 /* aecm_core_c.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core_c.cc; sourceTree = ""; }; - 69A6DD5D1E95EC7700000E69 /* aecm_core_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core_neon.cc; sourceTree = ""; }; - 69A6DD5E1E95EC7700000E69 /* aecm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aecm_defines.h; sourceTree = ""; }; - 69A6DD5F1E95EC7700000E69 /* echo_control_mobile.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_control_mobile.cc; sourceTree = ""; }; - 69A6DD601E95EC7700000E69 /* echo_control_mobile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_control_mobile.h; sourceTree = ""; }; - 69A6DD631E95EC7700000E69 /* analog_agc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = analog_agc.c; sourceTree = ""; }; - 69A6DD641E95EC7700000E69 /* analog_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = analog_agc.h; sourceTree = ""; }; - 69A6DD651E95EC7700000E69 /* digital_agc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = digital_agc.c; sourceTree = ""; }; - 69A6DD661E95EC7700000E69 /* digital_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = digital_agc.h; sourceTree = ""; }; - 69A6DD671E95EC7700000E69 /* gain_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_control.h; sourceTree = ""; }; - 69A6DD691E95EC7700000E69 /* apm_data_dumper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = apm_data_dumper.cc; sourceTree = ""; }; - 69A6DD6A1E95EC7700000E69 /* apm_data_dumper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apm_data_dumper.h; sourceTree = ""; }; - 69A6DD6C1E95EC7700000E69 /* defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = defines.h; sourceTree = ""; }; - 69A6DD6D1E95EC7700000E69 /* noise_suppression.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = noise_suppression.c; sourceTree = ""; }; - 69A6DD6E1E95EC7700000E69 /* noise_suppression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_suppression.h; sourceTree = ""; }; - 69A6DD6F1E95EC7700000E69 /* noise_suppression_x.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = noise_suppression_x.c; sourceTree = ""; }; - 69A6DD701E95EC7700000E69 /* noise_suppression_x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_suppression_x.h; sourceTree = ""; }; - 69A6DD711E95EC7700000E69 /* ns_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ns_core.c; sourceTree = ""; }; - 69A6DD721E95EC7700000E69 /* ns_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ns_core.h; sourceTree = ""; }; - 69A6DD731E95EC7700000E69 /* nsx_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core.c; sourceTree = ""; }; - 69A6DD741E95EC7700000E69 /* nsx_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsx_core.h; sourceTree = ""; }; - 69A6DD751E95EC7700000E69 /* nsx_core_c.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core_c.c; sourceTree = ""; }; - 69A6DD761E95EC7700000E69 /* nsx_core_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core_neon.c; sourceTree = ""; }; - 69A6DD771E95EC7700000E69 /* nsx_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsx_defines.h; sourceTree = ""; }; - 69A6DD781E95EC7700000E69 /* windows_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = windows_private.h; sourceTree = ""; }; - 69A6DD791E95EC7700000E69 /* splitting_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = splitting_filter.cc; sourceTree = ""; }; - 69A6DD7A1E95EC7700000E69 /* splitting_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = splitting_filter.h; sourceTree = ""; }; - 69A6DD7B1E95EC7700000E69 /* three_band_filter_bank.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = three_band_filter_bank.cc; sourceTree = ""; }; - 69A6DD7C1E95EC7700000E69 /* three_band_filter_bank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = three_band_filter_bank.h; sourceTree = ""; }; - 69A6DD7E1E95EC7700000E69 /* block_mean_calculator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_mean_calculator.cc; sourceTree = ""; }; - 69A6DD7F1E95EC7700000E69 /* block_mean_calculator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_mean_calculator.h; sourceTree = ""; }; - 69A6DD801E95EC7700000E69 /* delay_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = delay_estimator.cc; sourceTree = ""; }; - 69A6DD811E95EC7700000E69 /* delay_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator.h; sourceTree = ""; }; - 69A6DD821E95EC7700000E69 /* delay_estimator_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator_internal.h; sourceTree = ""; }; - 69A6DD831E95EC7700000E69 /* delay_estimator_wrapper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = delay_estimator_wrapper.cc; sourceTree = ""; }; - 69A6DD841E95EC7700000E69 /* delay_estimator_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator_wrapper.h; sourceTree = ""; }; - 69A6DD851E95EC7700000E69 /* ooura_fft.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft.cc; sourceTree = ""; }; - 69A6DD861E95EC7700000E69 /* ooura_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft.h; sourceTree = ""; }; - 69A6DD871E95EC7700000E69 /* ooura_fft_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft_neon.cc; sourceTree = ""; }; - 69A6DD881E95EC7700000E69 /* ooura_fft_sse2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft_sse2.cc; sourceTree = ""; }; - 69A6DD891E95EC7700000E69 /* ooura_fft_tables_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft_tables_common.h; sourceTree = ""; }; - 69A6DD8A1E95EC7700000E69 /* ooura_fft_tables_neon_sse2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft_tables_neon_sse2.h; sourceTree = ""; }; - 69A6DD8D1E95EC7700000E69 /* asm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asm_defines.h; sourceTree = ""; }; - 69A6DD8E1E95EC7700000E69 /* compile_assert_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compile_assert_c.h; sourceTree = ""; }; - 69A6DD8F1E95EC7700000E69 /* cpu_features_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu_features_wrapper.h; sourceTree = ""; }; - 69A6DD901E95EC7700000E69 /* metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = metrics.h; sourceTree = ""; }; - 69A6DD921E95EC7700000E69 /* cpu_features.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpu_features.cc; sourceTree = ""; }; - 69A6DD931E95EC7700000E69 /* typedefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typedefs.h; sourceTree = ""; }; - 69A6DE171E95ECF000000E69 /* wav_file.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wav_file.cc; sourceTree = ""; }; - 69A6DE181E95ECF000000E69 /* wav_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wav_file.h; sourceTree = ""; }; - 69A6DE191E95ECF000000E69 /* wav_header.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wav_header.cc; sourceTree = ""; }; - 69A6DE1A1E95ECF000000E69 /* wav_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wav_header.h; sourceTree = ""; }; + 69DD8CFD218CD400001E8140 /* VideoRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoRenderer.h; sourceTree = ""; }; + 69DD8CFE218CD400001E8140 /* VideoRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VideoRenderer.cpp; sourceTree = ""; }; + 69DD8CFF218CD400001E8140 /* VideoSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VideoSource.cpp; sourceTree = ""; }; + 69DD8D00218CD400001E8140 /* VideoSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoSource.h; sourceTree = ""; }; 69E357A720F88954002E163B /* AudioIO.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioIO.cpp; sourceTree = ""; }; 69E357AF20F88954002E163B /* AudioIO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioIO.h; sourceTree = ""; }; + 69E629ED21AF62A900377D0F /* json11.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = json11.cpp; sourceTree = ""; }; 69F842361E67540700C110F7 /* libtgvoip.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libtgvoip.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 69FB0B2420F6860D00827817 /* MessageThread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MessageThread.cpp; sourceTree = ""; }; 69FB0B2C20F6860D00827817 /* MessageThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessageThread.h; sourceTree = ""; }; @@ -480,6 +1069,7 @@ 692AB8A71E6759DD00706ACC /* Info.plist */, 692AB8A81E6759DD00706ACC /* JitterBuffer.cpp */, 692AB8A91E6759DD00706ACC /* JitterBuffer.h */, + 69E629ED21AF62A900377D0F /* json11.cpp */, 6915307A1E6B5BAB004F643F /* logging.cpp */, 692AB8AA1E6759DD00706ACC /* logging.h */, 692AB8AB1E6759DD00706ACC /* MediaStreamItf.cpp */, @@ -500,6 +1090,7 @@ 692AB8C81E6759DD00706ACC /* VoIPController.h */, 692AB8C91E6759DD00706ACC /* VoIPServerConfig.cpp */, 692AB8CA1E6759DD00706ACC /* VoIPServerConfig.h */, + 69DD8CFC218CD400001E8140 /* video */, 69A6DCFE1E95EC7700000E69 /* webrtc_dsp */, ); name = libtgvoip; @@ -572,289 +1163,1147 @@ name = Products; sourceTree = ""; }; - 69A6DCFE1E95EC7700000E69 /* webrtc_dsp */ = { + 697E988A21A4ED6800E03846 /* system_wrappers */ = { isa = PBXGroup; children = ( - 69A6DCFF1E95EC7700000E69 /* webrtc */, + 697E988B21A4ED6800E03846 /* include */, + 697E989121A4ED6800E03846 /* source */, ); - path = webrtc_dsp; + path = system_wrappers; sourceTree = ""; }; - 69A6DCFF1E95EC7700000E69 /* webrtc */ = { + 697E988B21A4ED6800E03846 /* include */ = { isa = PBXGroup; children = ( - 69A6DD001E95EC7700000E69 /* base */, - 69A6DD0E1E95EC7700000E69 /* common_audio */, - 69A6DD4C1E95EC7700000E69 /* modules */, - 69A6DD8B1E95EC7700000E69 /* system_wrappers */, - 69A6DD931E95EC7700000E69 /* typedefs.h */, + 697E988C21A4ED6800E03846 /* field_trial.h */, + 697E988D21A4ED6800E03846 /* cpu_features_wrapper.h */, + 697E988E21A4ED6800E03846 /* asm_defines.h */, + 697E988F21A4ED6800E03846 /* metrics.h */, + 697E989021A4ED6800E03846 /* compile_assert_c.h */, ); - path = webrtc; + path = include; sourceTree = ""; }; - 69A6DD001E95EC7700000E69 /* base */ = { + 697E989121A4ED6800E03846 /* source */ = { isa = PBXGroup; children = ( - 69A6DD011E95EC7700000E69 /* array_view.h */, - 69A6DD021E95EC7700000E69 /* atomicops.h */, - 69A6DD031E95EC7700000E69 /* basictypes.h */, - 69A6DD041E95EC7700000E69 /* checks.cc */, - 69A6DD051E95EC7700000E69 /* checks.h */, - 69A6DD061E95EC7700000E69 /* constructormagic.h */, - 69A6DD071E95EC7700000E69 /* safe_compare.h */, - 69A6DD081E95EC7700000E69 /* safe_conversions.h */, - 69A6DD091E95EC7700000E69 /* safe_conversions_impl.h */, - 69A6DD0A1E95EC7700000E69 /* sanitizer.h */, - 69A6DD0B1E95EC7700000E69 /* stringutils.cc */, - 69A6DD0C1E95EC7700000E69 /* stringutils.h */, - 69A6DD0D1E95EC7700000E69 /* type_traits.h */, + 697E989221A4ED6800E03846 /* field_trial.cc */, + 697E989321A4ED6800E03846 /* metrics.cc */, + 697E989421A4ED6800E03846 /* cpu_features.cc */, ); - path = base; + path = source; sourceTree = ""; }; - 69A6DD0E1E95EC7700000E69 /* common_audio */ = { + 697E989521A4ED6800E03846 /* common_audio */ = { isa = PBXGroup; children = ( - 69A6DD0F1E95EC7700000E69 /* audio_util.cc */, - 69A6DD101E95EC7700000E69 /* channel_buffer.cc */, - 69A6DD111E95EC7700000E69 /* channel_buffer.h */, - 69A6DD121E95EC7700000E69 /* fft4g.c */, - 69A6DD131E95EC7700000E69 /* fft4g.h */, - 69A6DD141E95EC7700000E69 /* include */, - 69A6DD161E95EC7700000E69 /* ring_buffer.c */, - 69A6DD171E95EC7700000E69 /* ring_buffer.h */, - 69A6DD181E95EC7700000E69 /* signal_processing */, - 69A6DD4A1E95EC7700000E69 /* sparse_fir_filter.cc */, - 69A6DD4B1E95EC7700000E69 /* sparse_fir_filter.h */, - 69A6DE171E95ECF000000E69 /* wav_file.cc */, - 69A6DE181E95ECF000000E69 /* wav_file.h */, - 69A6DE191E95ECF000000E69 /* wav_header.cc */, - 69A6DE1A1E95ECF000000E69 /* wav_header.h */, + 697E989621A4ED6800E03846 /* mocks */, + 697E989821A4ED6800E03846 /* wav_file.h */, + 697E989921A4ED6800E03846 /* window_generator.cc */, + 697E989A21A4ED6800E03846 /* channel_buffer.cc */, + 697E989B21A4ED6800E03846 /* fir_filter_factory.cc */, + 697E989C21A4ED6800E03846 /* sparse_fir_filter.h */, + 697E989D21A4ED6800E03846 /* fir_filter_sse.h */, + 697E989E21A4ED6800E03846 /* window_generator.h */, + 697E989F21A4ED6800E03846 /* ring_buffer.h */, + 697E98A021A4ED6800E03846 /* fir_filter.h */, + 697E98A121A4ED6800E03846 /* include */, + 697E98A321A4ED6800E03846 /* wav_header.cc */, + 697E98A421A4ED6800E03846 /* real_fourier_ooura.cc */, + 697E98A521A4ED6800E03846 /* fir_filter_neon.cc */, + 697E98A621A4ED6800E03846 /* audio_util.cc */, + 697E98A721A4ED6800E03846 /* real_fourier_ooura.h */, + 697E98A821A4ED6800E03846 /* fir_filter_sse.cc */, + 697E98A921A4ED6800E03846 /* smoothing_filter.h */, + 697E98AA21A4ED6800E03846 /* resampler */, + 697E98B821A4ED6800E03846 /* fir_filter_factory.h */, + 697E98B921A4ED6800E03846 /* audio_converter.h */, + 697E98BA21A4ED6800E03846 /* wav_file.cc */, + 697E98BB21A4ED6800E03846 /* third_party */, + 697E98C321A4ED6800E03846 /* audio_converter.cc */, + 697E98C421A4ED6800E03846 /* real_fourier.cc */, + 697E98C521A4ED6800E03846 /* channel_buffer.h */, + 697E98C621A4ED6800E03846 /* real_fourier.h */, + 697E98C721A4ED6800E03846 /* sparse_fir_filter.cc */, + 697E98C821A4ED6800E03846 /* fir_filter_neon.h */, + 697E98C921A4ED6800E03846 /* smoothing_filter.cc */, + 697E98CA21A4ED6800E03846 /* fir_filter_c.cc */, + 697E98CB21A4ED6800E03846 /* ring_buffer.c */, + 697E98CC21A4ED6800E03846 /* fir_filter_c.h */, + 697E98CD21A4ED6800E03846 /* signal_processing */, + 697E98FC21A4ED6800E03846 /* wav_header.h */, + 697E98FD21A4ED6800E03846 /* vad */, ); path = common_audio; sourceTree = ""; }; - 69A6DD141E95EC7700000E69 /* include */ = { + 697E989621A4ED6800E03846 /* mocks */ = { + isa = PBXGroup; + children = ( + 697E989721A4ED6800E03846 /* mock_smoothing_filter.h */, + ); + path = mocks; + sourceTree = ""; + }; + 697E98A121A4ED6800E03846 /* include */ = { + isa = PBXGroup; + children = ( + 697E98A221A4ED6800E03846 /* audio_util.h */, + ); + path = include; + sourceTree = ""; + }; + 697E98AA21A4ED6800E03846 /* resampler */ = { isa = PBXGroup; children = ( - 69A6DD151E95EC7700000E69 /* audio_util.h */, + 697E98AB21A4ED6800E03846 /* sinc_resampler_neon.cc */, + 697E98AC21A4ED6800E03846 /* push_sinc_resampler.cc */, + 697E98AD21A4ED6800E03846 /* sinc_resampler.h */, + 697E98AE21A4ED6800E03846 /* resampler.cc */, + 697E98AF21A4ED6800E03846 /* sinc_resampler_sse.cc */, + 697E98B021A4ED6800E03846 /* include */, + 697E98B321A4ED6800E03846 /* push_sinc_resampler.h */, + 697E98B421A4ED6800E03846 /* push_resampler.cc */, + 697E98B521A4ED6800E03846 /* sinusoidal_linear_chirp_source.h */, + 697E98B621A4ED6800E03846 /* sinc_resampler.cc */, + 697E98B721A4ED6800E03846 /* sinusoidal_linear_chirp_source.cc */, + ); + path = resampler; + sourceTree = ""; + }; + 697E98B021A4ED6800E03846 /* include */ = { + isa = PBXGroup; + children = ( + 697E98B121A4ED6800E03846 /* push_resampler.h */, + 697E98B221A4ED6800E03846 /* resampler.h */, ); path = include; sourceTree = ""; }; - 69A6DD181E95EC7700000E69 /* signal_processing */ = { - isa = PBXGroup; - children = ( - 69A6DD191E95EC7700000E69 /* auto_corr_to_refl_coef.c */, - 69A6DD1A1E95EC7700000E69 /* auto_correlation.c */, - 69A6DD1B1E95EC7700000E69 /* complex_bit_reverse.c */, - 69A6DD1C1E95EC7700000E69 /* complex_bit_reverse_arm.S */, - 69A6DD1D1E95EC7700000E69 /* complex_fft.c */, - 69A6DD1E1E95EC7700000E69 /* complex_fft_tables.h */, - 69A6DD1F1E95EC7700000E69 /* copy_set_operations.c */, - 69A6DD201E95EC7700000E69 /* cross_correlation.c */, - 69A6DD211E95EC7700000E69 /* cross_correlation_neon.c */, - 69A6DD221E95EC7700000E69 /* division_operations.c */, - 69A6DD231E95EC7700000E69 /* dot_product_with_scale.c */, - 69A6DD241E95EC7700000E69 /* downsample_fast.c */, - 69A6DD251E95EC7700000E69 /* downsample_fast_neon.c */, - 69A6DD261E95EC7700000E69 /* energy.c */, - 69A6DD271E95EC7700000E69 /* filter_ar.c */, - 69A6DD281E95EC7700000E69 /* filter_ar_fast_q12.c */, - 69A6DD291E95EC7700000E69 /* filter_ar_fast_q12_armv7.S */, - 69A6DD2A1E95EC7700000E69 /* filter_ma_fast_q12.c */, - 69A6DD2B1E95EC7700000E69 /* get_hanning_window.c */, - 69A6DD2C1E95EC7700000E69 /* get_scaling_square.c */, - 69A6DD2D1E95EC7700000E69 /* ilbc_specific_functions.c */, - 69A6DD2E1E95EC7700000E69 /* include */, - 69A6DD341E95EC7700000E69 /* levinson_durbin.c */, - 69A6DD351E95EC7700000E69 /* lpc_to_refl_coef.c */, - 69A6DD361E95EC7700000E69 /* min_max_operations.c */, - 69A6DD371E95EC7700000E69 /* min_max_operations_neon.c */, - 69A6DD381E95EC7700000E69 /* randomization_functions.c */, - 69A6DD391E95EC7700000E69 /* real_fft.c */, - 69A6DD3B1E95EC7700000E69 /* refl_coef_to_lpc.c */, - 69A6DD3C1E95EC7700000E69 /* resample.c */, - 69A6DD3D1E95EC7700000E69 /* resample_48khz.c */, - 69A6DD3E1E95EC7700000E69 /* resample_by_2.c */, - 69A6DD3F1E95EC7700000E69 /* resample_by_2_internal.c */, - 69A6DD401E95EC7700000E69 /* resample_by_2_internal.h */, - 69A6DD411E95EC7700000E69 /* resample_fractional.c */, - 69A6DD421E95EC7700000E69 /* spl_init.c */, - 69A6DD431E95EC7700000E69 /* spl_inl.c */, - 69A6DD441E95EC7700000E69 /* spl_sqrt.c */, - 69A6DD451E95EC7700000E69 /* spl_sqrt_floor.c */, - 69A6DD461E95EC7700000E69 /* spl_sqrt_floor_arm.S */, - 69A6DD471E95EC7700000E69 /* splitting_filter_impl.c */, - 69A6DD481E95EC7700000E69 /* sqrt_of_one_minus_x_squared.c */, - 69A6DD491E95EC7700000E69 /* vector_scaling_operations.c */, + 697E98BB21A4ED6800E03846 /* third_party */ = { + isa = PBXGroup; + children = ( + 697E98BC21A4ED6800E03846 /* spl_sqrt_floor */, + 697E98C021A4ED6800E03846 /* fft4g */, + ); + path = third_party; + sourceTree = ""; + }; + 697E98BC21A4ED6800E03846 /* spl_sqrt_floor */ = { + isa = PBXGroup; + children = ( + 697E98BD21A4ED6800E03846 /* spl_sqrt_floor.c */, + 697E98BE21A4ED6800E03846 /* spl_sqrt_floor_arm.S */, + 697E98BF21A4ED6800E03846 /* spl_sqrt_floor.h */, + ); + path = spl_sqrt_floor; + sourceTree = ""; + }; + 697E98C021A4ED6800E03846 /* fft4g */ = { + isa = PBXGroup; + children = ( + 697E98C121A4ED6800E03846 /* fft4g.c */, + 697E98C221A4ED6800E03846 /* fft4g.h */, + ); + path = fft4g; + sourceTree = ""; + }; + 697E98CD21A4ED6800E03846 /* signal_processing */ = { + isa = PBXGroup; + children = ( + 697E98CE21A4ED6800E03846 /* complex_fft_tables.h */, + 697E98CF21A4ED6800E03846 /* complex_fft.c */, + 697E98D021A4ED6800E03846 /* filter_ma_fast_q12.c */, + 697E98D121A4ED6800E03846 /* splitting_filter1.c */, + 697E98D221A4ED6800E03846 /* levinson_durbin.c */, + 697E98D321A4ED6800E03846 /* downsample_fast_neon.c */, + 697E98D421A4ED6800E03846 /* dot_product_with_scale.cc */, + 697E98D521A4ED6800E03846 /* auto_corr_to_refl_coef.c */, + 697E98D621A4ED6800E03846 /* resample_by_2_internal.c */, + 697E98D721A4ED6800E03846 /* complex_bit_reverse_arm.S */, + 697E98D821A4ED6800E03846 /* energy.c */, + 697E98D921A4ED6800E03846 /* sqrt_of_one_minus_x_squared.c */, + 697E98DA21A4ED6800E03846 /* downsample_fast.c */, + 697E98DB21A4ED6800E03846 /* filter_ar_fast_q12.c */, + 697E98DC21A4ED6800E03846 /* spl_init.c */, + 697E98DD21A4ED6800E03846 /* lpc_to_refl_coef.c */, + 697E98DE21A4ED6800E03846 /* cross_correlation.c */, + 697E98DF21A4ED6800E03846 /* include */, + 697E98E421A4ED6800E03846 /* division_operations.c */, + 697E98E521A4ED6800E03846 /* auto_correlation.c */, + 697E98E621A4ED6800E03846 /* get_scaling_square.c */, + 697E98E721A4ED6800E03846 /* min_max_operations_neon.c */, + 697E98E821A4ED6800E03846 /* dot_product_with_scale.h */, + 697E98E921A4ED6800E03846 /* resample_by_2_internal.h */, + 697E98EA21A4ED6800E03846 /* resample.c */, + 697E98EB21A4ED6800E03846 /* cross_correlation_neon.c */, + 697E98EC21A4ED6800E03846 /* min_max_operations.c */, + 697E98ED21A4ED6800E03846 /* refl_coef_to_lpc.c */, + 697E98EE21A4ED6800E03846 /* filter_ar.c */, + 697E98EF21A4ED6800E03846 /* vector_scaling_operations.c */, + 697E98F021A4ED6800E03846 /* resample_fractional.c */, + 697E98F121A4ED6800E03846 /* real_fft.c */, + 697E98F221A4ED6800E03846 /* ilbc_specific_functions.c */, + 697E98F321A4ED6800E03846 /* complex_bit_reverse.c */, + 697E98F421A4ED6800E03846 /* randomization_functions.c */, + 697E98F521A4ED6800E03846 /* filter_ar_fast_q12_armv7.S */, + 697E98F621A4ED6800E03846 /* copy_set_operations.c */, + 697E98F721A4ED6800E03846 /* resample_by_2.c */, + 697E98F821A4ED6800E03846 /* get_hanning_window.c */, + 697E98F921A4ED6800E03846 /* resample_48khz.c */, + 697E98FA21A4ED6800E03846 /* spl_inl.c */, + 697E98FB21A4ED6800E03846 /* spl_sqrt.c */, ); path = signal_processing; sourceTree = ""; }; - 69A6DD2E1E95EC7700000E69 /* include */ = { + 697E98DF21A4ED6800E03846 /* include */ = { isa = PBXGroup; children = ( - 69A6DD2F1E95EC7700000E69 /* real_fft.h */, - 69A6DD301E95EC7700000E69 /* signal_processing_library.h */, - 69A6DD311E95EC7700000E69 /* spl_inl.h */, - 69A6DD321E95EC7700000E69 /* spl_inl_armv7.h */, - 69A6DD331E95EC7700000E69 /* spl_inl_mips.h */, + 697E98E021A4ED6800E03846 /* signal_processing_library.h */, + 697E98E121A4ED6800E03846 /* real_fft.h */, + 697E98E221A4ED6800E03846 /* spl_inl.h */, + 697E98E321A4ED6800E03846 /* spl_inl_armv7.h */, ); path = include; sourceTree = ""; }; - 69A6DD4C1E95EC7700000E69 /* modules */ = { + 697E98FD21A4ED6800E03846 /* vad */ = { + isa = PBXGroup; + children = ( + 697E98FE21A4ED6800E03846 /* vad_sp.c */, + 697E98FF21A4ED6800E03846 /* vad.cc */, + 697E990021A4ED6800E03846 /* webrtc_vad.c */, + 697E990121A4ED6800E03846 /* vad_core.h */, + 697E990221A4ED6800E03846 /* include */, + 697E990521A4ED6800E03846 /* vad_gmm.h */, + 697E990621A4ED6800E03846 /* vad_filterbank.c */, + 697E990721A4ED6800E03846 /* vad_core.c */, + 697E990821A4ED6800E03846 /* vad_sp.h */, + 697E990921A4ED6800E03846 /* vad_filterbank.h */, + 697E990A21A4ED6800E03846 /* vad_gmm.c */, + ); + path = vad; + sourceTree = ""; + }; + 697E990221A4ED6800E03846 /* include */ = { + isa = PBXGroup; + children = ( + 697E990321A4ED6800E03846 /* vad.h */, + 697E990421A4ED6800E03846 /* webrtc_vad.h */, + ); + path = include; + sourceTree = ""; + }; + 697E990B21A4ED6800E03846 /* absl */ = { + isa = PBXGroup; + children = ( + 697E990C21A4ED6800E03846 /* strings */, + 697E991421A4ED6800E03846 /* types */, + 697E991921A4ED6800E03846 /* memory */, + 697E991B21A4ED6800E03846 /* meta */, + 697E991D21A4ED6800E03846 /* algorithm */, + 697E991F21A4ED6800E03846 /* container */, + 697E992121A4ED6800E03846 /* base */, + 697E993221A4ED6800E03846 /* utility */, + ); + path = absl; + sourceTree = ""; + }; + 697E990C21A4ED6800E03846 /* strings */ = { + isa = PBXGroup; + children = ( + 697E990D21A4ED6800E03846 /* internal */, + 697E991021A4ED6800E03846 /* string_view.cc */, + 697E991121A4ED6800E03846 /* ascii.h */, + 697E991221A4ED6800E03846 /* ascii.cc */, + 697E991321A4ED6800E03846 /* string_view.h */, + ); + path = strings; + sourceTree = ""; + }; + 697E990D21A4ED6800E03846 /* internal */ = { + isa = PBXGroup; + children = ( + 697E990E21A4ED6800E03846 /* memutil.h */, + 697E990F21A4ED6800E03846 /* memutil.cc */, + ); + path = internal; + sourceTree = ""; + }; + 697E991421A4ED6800E03846 /* types */ = { + isa = PBXGroup; + children = ( + 697E991521A4ED6800E03846 /* optional.h */, + 697E991621A4ED6800E03846 /* bad_optional_access.h */, + 697E991721A4ED6800E03846 /* bad_optional_access.cc */, + 697E991821A4ED6800E03846 /* optional.cc */, + ); + path = types; + sourceTree = ""; + }; + 697E991921A4ED6800E03846 /* memory */ = { + isa = PBXGroup; + children = ( + 697E991A21A4ED6800E03846 /* memory.h */, + ); + path = memory; + sourceTree = ""; + }; + 697E991B21A4ED6800E03846 /* meta */ = { + isa = PBXGroup; + children = ( + 697E991C21A4ED6800E03846 /* type_traits.h */, + ); + path = meta; + sourceTree = ""; + }; + 697E991D21A4ED6800E03846 /* algorithm */ = { + isa = PBXGroup; + children = ( + 697E991E21A4ED6800E03846 /* algorithm.h */, + ); + path = algorithm; + sourceTree = ""; + }; + 697E991F21A4ED6800E03846 /* container */ = { + isa = PBXGroup; + children = ( + 697E992021A4ED6800E03846 /* inlined_vector.h */, + ); + path = container; + sourceTree = ""; + }; + 697E992121A4ED6800E03846 /* base */ = { + isa = PBXGroup; + children = ( + 697E992221A4ED6800E03846 /* policy_checks.h */, + 697E992321A4ED6800E03846 /* port.h */, + 697E992421A4ED6800E03846 /* config.h */, + 697E992521A4ED6800E03846 /* internal */, + 697E992E21A4ED6800E03846 /* attributes.h */, + 697E992F21A4ED6800E03846 /* macros.h */, + 697E993021A4ED6800E03846 /* optimization.h */, + 697E993121A4ED6800E03846 /* log_severity.h */, + ); + path = base; + sourceTree = ""; + }; + 697E992521A4ED6800E03846 /* internal */ = { + isa = PBXGroup; + children = ( + 697E992621A4ED6800E03846 /* raw_logging.cc */, + 697E992721A4ED6800E03846 /* throw_delegate.cc */, + 697E992821A4ED6800E03846 /* invoke.h */, + 697E992921A4ED6800E03846 /* inline_variable.h */, + 697E992A21A4ED6800E03846 /* atomic_hook.h */, + 697E992B21A4ED6800E03846 /* identity.h */, + 697E992C21A4ED6800E03846 /* raw_logging.h */, + 697E992D21A4ED6800E03846 /* throw_delegate.h */, + ); + path = internal; + sourceTree = ""; + }; + 697E993221A4ED6800E03846 /* utility */ = { + isa = PBXGroup; + children = ( + 697E993321A4ED6800E03846 /* utility.h */, + ); + path = utility; + sourceTree = ""; + }; + 697E993421A4ED6900E03846 /* api */ = { + isa = PBXGroup; + children = ( + 697E993521A4ED6900E03846 /* audio */, + 697E993D21A4ED6900E03846 /* array_view.h */, + ); + path = api; + sourceTree = ""; + }; + 697E993521A4ED6900E03846 /* audio */ = { + isa = PBXGroup; + children = ( + 697E993621A4ED6900E03846 /* audio_frame.cc */, + 697E993721A4ED6900E03846 /* echo_canceller3_config.h */, + 697E993821A4ED6900E03846 /* echo_control.h */, + 697E993921A4ED6900E03846 /* audio_frame.h */, + 697E993A21A4ED6900E03846 /* echo_canceller3_config.cc */, + 697E993B21A4ED6900E03846 /* echo_canceller3_factory.h */, + 697E993C21A4ED6900E03846 /* echo_canceller3_factory.cc */, + ); + path = audio; + sourceTree = ""; + }; + 697E993E21A4ED6900E03846 /* rtc_base */ = { + isa = PBXGroup; + children = ( + 697E993F21A4ED6900E03846 /* string_to_number.h */, + 697E994021A4ED6900E03846 /* constructormagic.h */, + 697E994121A4ED6900E03846 /* race_checker.cc */, + 697E994221A4ED6900E03846 /* strings */, + 697E994521A4ED6900E03846 /* event_tracer.h */, + 697E994621A4ED6900E03846 /* stringencode.h */, + 697E994721A4ED6900E03846 /* memory */, + 697E994A21A4ED6900E03846 /* timeutils.cc */, + 697E994B21A4ED6900E03846 /* event.h */, + 697E994D21A4ED6900E03846 /* ignore_wundef.h */, + 697E994E21A4ED6900E03846 /* stringutils.h */, + 697E994F21A4ED6900E03846 /* arraysize.h */, + 697E995021A4ED6900E03846 /* platform_file.cc */, + 697E995121A4ED6900E03846 /* swap_queue.h */, + 697E995221A4ED6900E03846 /* string_to_number.cc */, + 697E995321A4ED6900E03846 /* trace_event.h */, + 697E995421A4ED6900E03846 /* checks.h */, + 697E995521A4ED6900E03846 /* deprecation.h */, + 697E995621A4ED6900E03846 /* thread_checker_impl.cc */, + 697E995721A4ED6900E03846 /* sanitizer.h */, + 697E995821A4ED6900E03846 /* scoped_ref_ptr.h */, + 697E995921A4ED6900E03846 /* logging.h */, + 697E995A21A4ED6900E03846 /* timeutils.h */, + 697E995B21A4ED6900E03846 /* atomicops.h */, + 697E995C21A4ED6900E03846 /* stringencode.cc */, + 697E995D21A4ED6900E03846 /* stringutils.cc */, + 697E995E21A4ED6900E03846 /* checks.cc */, + 697E995F21A4ED6900E03846 /* numerics */, + 697E996421A4ED6900E03846 /* system */, + 697E996B21A4ED6900E03846 /* platform_thread.cc */, + 697E996C21A4ED6900E03846 /* platform_thread.h */, + 697E996D21A4ED6900E03846 /* logging_webrtc.cc */, + 697E996E21A4ED6900E03846 /* platform_thread_types.h */, + 697E996F21A4ED6900E03846 /* protobuf_utils.h */, + 697E997021A4ED6900E03846 /* thread_annotations.h */, + 697E997121A4ED6900E03846 /* gtest_prod_util.h */, + 697E997221A4ED6900E03846 /* function_view.h */, + 697E997321A4ED6900E03846 /* criticalsection.h */, + 697E997421A4ED6900E03846 /* criticalsection.cc */, + 697E997521A4ED6900E03846 /* platform_thread_types.cc */, + 697E997621A4ED6900E03846 /* refcount.h */, + 697E997721A4ED6900E03846 /* event.cc */, + 697E997821A4ED6900E03846 /* thread_checker_impl.h */, + 697E997921A4ED6900E03846 /* event_tracer.cc */, + 697E997A21A4ED6900E03846 /* compile_assert_c.h */, + 697E997B21A4ED6900E03846 /* type_traits.h */, + 697E997C21A4ED6900E03846 /* platform_file.h */, + 697E997D21A4ED6900E03846 /* refcounter.h */, + 697E997F21A4ED6900E03846 /* thread_checker.h */, + 697E998021A4ED6900E03846 /* race_checker.h */, + 697E998121A4ED6900E03846 /* refcountedobject.h */, + ); + path = rtc_base; + sourceTree = ""; + }; + 697E994221A4ED6900E03846 /* strings */ = { + isa = PBXGroup; + children = ( + 697E994321A4ED6900E03846 /* string_builder.h */, + 697E994421A4ED6900E03846 /* string_builder.cc */, + ); + path = strings; + sourceTree = ""; + }; + 697E994721A4ED6900E03846 /* memory */ = { + isa = PBXGroup; + children = ( + 697E994821A4ED6900E03846 /* aligned_malloc.cc */, + 697E994921A4ED6900E03846 /* aligned_malloc.h */, + ); + path = memory; + sourceTree = ""; + }; + 697E995F21A4ED6900E03846 /* numerics */ = { isa = PBXGroup; children = ( - 69A6DD4D1E95EC7700000E69 /* audio_processing */, + 697E996021A4ED6900E03846 /* safe_minmax.h */, + 697E996121A4ED6900E03846 /* safe_conversions.h */, + 697E996221A4ED6900E03846 /* safe_conversions_impl.h */, + 697E996321A4ED6900E03846 /* safe_compare.h */, + ); + path = numerics; + sourceTree = ""; + }; + 697E996421A4ED6900E03846 /* system */ = { + isa = PBXGroup; + children = ( + 697E996521A4ED6900E03846 /* unused.h */, + 697E996621A4ED6900E03846 /* inline.h */, + 697E996721A4ED6900E03846 /* ignore_warnings.h */, + 697E996821A4ED6900E03846 /* asm_defines.h */, + 697E996921A4ED6900E03846 /* rtc_export.h */, + 697E996A21A4ED6900E03846 /* arch.h */, + ); + path = system; + sourceTree = ""; + }; + 697E998221A4ED6900E03846 /* modules */ = { + isa = PBXGroup; + children = ( + 697E998321A4ED6900E03846 /* third_party */, + 697E998721A4ED6900E03846 /* audio_coding */, + 697E99C021A4ED6900E03846 /* audio_processing */, ); path = modules; sourceTree = ""; }; - 69A6DD4D1E95EC7700000E69 /* audio_processing */ = { + 697E998321A4ED6900E03846 /* third_party */ = { + isa = PBXGroup; + children = ( + 697E998421A4ED6900E03846 /* fft */, + ); + path = third_party; + sourceTree = ""; + }; + 697E998421A4ED6900E03846 /* fft */ = { + isa = PBXGroup; + children = ( + 697E998521A4ED6900E03846 /* fft.h */, + 697E998621A4ED6900E03846 /* fft.c */, + ); + path = fft; + sourceTree = ""; + }; + 697E998721A4ED6900E03846 /* audio_coding */ = { + isa = PBXGroup; + children = ( + 697E998821A4ED6900E03846 /* codecs */, + ); + path = audio_coding; + sourceTree = ""; + }; + 697E998821A4ED6900E03846 /* codecs */ = { + isa = PBXGroup; + children = ( + 697E998921A4ED6900E03846 /* isac */, + ); + path = codecs; + sourceTree = ""; + }; + 697E998921A4ED6900E03846 /* isac */ = { + isa = PBXGroup; + children = ( + 697E998A21A4ED6900E03846 /* bandwidth_info.h */, + 697E998B21A4ED6900E03846 /* main */, + ); + path = isac; + sourceTree = ""; + }; + 697E998B21A4ED6900E03846 /* main */ = { isa = PBXGroup; children = ( - 69A6DD4E1E95EC7700000E69 /* aec */, - 69A6DD591E95EC7700000E69 /* aecm */, - 69A6DD611E95EC7700000E69 /* agc */, - 69A6DD681E95EC7700000E69 /* logging */, - 69A6DD6B1E95EC7700000E69 /* ns */, - 69A6DD791E95EC7700000E69 /* splitting_filter.cc */, - 69A6DD7A1E95EC7700000E69 /* splitting_filter.h */, - 69A6DD7B1E95EC7700000E69 /* three_band_filter_bank.cc */, - 69A6DD7C1E95EC7700000E69 /* three_band_filter_bank.h */, - 69A6DD7D1E95EC7700000E69 /* utility */, + 697E998C21A4ED6900E03846 /* include */, + 697E998E21A4ED6900E03846 /* source */, + ); + path = main; + sourceTree = ""; + }; + 697E998C21A4ED6900E03846 /* include */ = { + isa = PBXGroup; + children = ( + 697E998D21A4ED6900E03846 /* isac.h */, + ); + path = include; + sourceTree = ""; + }; + 697E998E21A4ED6900E03846 /* source */ = { + isa = PBXGroup; + children = ( + 697E998F21A4ED6900E03846 /* pitch_estimator.c */, + 697E999021A4ED6900E03846 /* lpc_shape_swb16_tables.c */, + 697E999121A4ED6900E03846 /* pitch_gain_tables.c */, + 697E999221A4ED6900E03846 /* arith_routines_logist.c */, + 697E999321A4ED6900E03846 /* os_specific_inline.h */, + 697E999421A4ED6900E03846 /* filterbanks.c */, + 697E999521A4ED6900E03846 /* entropy_coding.h */, + 697E999621A4ED6900E03846 /* isac_vad.h */, + 697E999721A4ED6900E03846 /* settings.h */, + 697E999821A4ED6900E03846 /* transform.c */, + 697E999921A4ED6900E03846 /* lpc_shape_swb12_tables.h */, + 697E999A21A4ED6900E03846 /* arith_routines.h */, + 697E999B21A4ED6900E03846 /* crc.h */, + 697E999C21A4ED6900E03846 /* pitch_filter.c */, + 697E999D21A4ED6900E03846 /* encode_lpc_swb.c */, + 697E999E21A4ED6900E03846 /* filter_functions.c */, + 697E999F21A4ED6900E03846 /* decode.c */, + 697E99A021A4ED6900E03846 /* lattice.c */, + 697E99A121A4ED6900E03846 /* intialize.c */, + 697E99A221A4ED6900E03846 /* lpc_tables.c */, + 697E99A321A4ED6900E03846 /* lpc_gain_swb_tables.c */, + 697E99A421A4ED6900E03846 /* bandwidth_estimator.c */, + 697E99A521A4ED6900E03846 /* isac_float_type.h */, + 697E99A621A4ED6900E03846 /* pitch_lag_tables.h */, + 697E99A721A4ED6900E03846 /* encode.c */, + 697E99A821A4ED6900E03846 /* lpc_analysis.c */, + 697E99A921A4ED6900E03846 /* spectrum_ar_model_tables.h */, + 697E99AA21A4ED6900E03846 /* arith_routines_hist.c */, + 697E99AB21A4ED6900E03846 /* codec.h */, + 697E99AC21A4ED6900E03846 /* pitch_gain_tables.h */, + 697E99AD21A4ED6900E03846 /* lpc_shape_swb16_tables.h */, + 697E99AE21A4ED6900E03846 /* pitch_estimator.h */, + 697E99AF21A4ED6900E03846 /* entropy_coding.c */, + 697E99B021A4ED6900E03846 /* isac_vad.c */, + 697E99B121A4ED6900E03846 /* structs.h */, + 697E99B221A4ED6900E03846 /* filter_functions.h */, + 697E99B321A4ED6900E03846 /* encode_lpc_swb.h */, + 697E99B421A4ED6900E03846 /* pitch_filter.h */, + 697E99B521A4ED6900E03846 /* arith_routines.c */, + 697E99B621A4ED6900E03846 /* crc.c */, + 697E99B721A4ED6900E03846 /* lpc_shape_swb12_tables.c */, + 697E99B821A4ED6900E03846 /* lpc_analysis.h */, + 697E99B921A4ED6900E03846 /* decode_bwe.c */, + 697E99BA21A4ED6900E03846 /* spectrum_ar_model_tables.c */, + 697E99BB21A4ED6900E03846 /* bandwidth_estimator.h */, + 697E99BC21A4ED6900E03846 /* pitch_lag_tables.c */, + 697E99BD21A4ED6900E03846 /* isac.c */, + 697E99BE21A4ED6900E03846 /* lpc_gain_swb_tables.h */, + 697E99BF21A4ED6900E03846 /* lpc_tables.h */, + ); + path = source; + sourceTree = ""; + }; + 697E99C021A4ED6900E03846 /* audio_processing */ = { + isa = PBXGroup; + children = ( + 697E99C121A4ED6900E03846 /* rms_level.cc */, + 697E99C221A4ED6900E03846 /* echo_detector */, + 697E99CB21A4ED6900E03846 /* gain_control_for_experimental_agc.h */, + 697E99CC21A4ED6900E03846 /* splitting_filter.cc */, + 697E99CD21A4ED6900E03846 /* gain_control_impl.cc */, + 697E99CE21A4ED6900E03846 /* rms_level.h */, + 697E99CF21A4ED6900E03846 /* test */, + 697E99D321A4ED6900E03846 /* ns */, + 697E99E121A4ED6900E03846 /* residual_echo_detector.h */, + 697E99E221A4ED6900E03846 /* audio_processing_impl.h */, + 697E99E321A4ED6900E03846 /* audio_buffer.cc */, + 697E99E421A4ED6900E03846 /* typing_detection.cc */, + 697E99E521A4ED6900E03846 /* render_queue_item_verifier.h */, + 697E99E621A4ED6900E03846 /* aec_dump */, + 697E99E721A4ED6900E03846 /* include */, + 697E99F621A4ED6900E03846 /* agc2 */, + 697E9A3821A4ED6900E03846 /* transient */, + 697E9A4621A4ED6900E03846 /* low_cut_filter.cc */, + 697E9A4721A4ED6900E03846 /* noise_suppression_impl.h */, + 697E9A4821A4ED6900E03846 /* level_estimator_impl.cc */, + 697E9A4921A4ED6900E03846 /* three_band_filter_bank.cc */, + 697E9A4A21A4ED6900E03846 /* aec */, + 697E9A5521A4ED6900E03846 /* voice_detection_impl.h */, + 697E9A5621A4ED6900E03846 /* voice_detection_impl.cc */, + 697E9A5721A4ED6900E03846 /* echo_cancellation_impl.cc */, + 697E9A5821A4ED6900E03846 /* gain_control_for_experimental_agc.cc */, + 697E9A5921A4ED6900E03846 /* agc */, + 697E9A6A21A4ED6900E03846 /* common.h */, + 697E9A6B21A4ED6900E03846 /* audio_processing_impl.cc */, + 697E9A6C21A4ED6900E03846 /* audio_buffer.h */, + 697E9A6D21A4ED6900E03846 /* echo_control_mobile_impl.h */, + 697E9A6E21A4ED6900E03846 /* splitting_filter.h */, + 697E9A6F21A4ED6900E03846 /* low_cut_filter.h */, + 697E9A7021A4ED6900E03846 /* audio_generator */, + 697E9A7321A4ED6A00E03846 /* gain_controller2.cc */, + 697E9A7421A4ED6A00E03846 /* three_band_filter_bank.h */, + 697E9A7521A4ED6A00E03846 /* residual_echo_detector.cc */, + 697E9A7621A4ED6A00E03846 /* echo_cancellation_impl.h */, + 697E9A7721A4ED6A00E03846 /* noise_suppression_impl.cc */, + 697E9A7821A4ED6A00E03846 /* level_estimator_impl.h */, + 697E9A7921A4ED6A00E03846 /* gain_controller2.h */, + 697E9A7A21A4ED6A00E03846 /* aecm */, + 697E9A8221A4ED6A00E03846 /* aec3 */, + 697E9AF121A4ED6A00E03846 /* echo_control_mobile_impl.cc */, + 697E9AF221A4ED6A00E03846 /* gain_control_impl.h */, + 697E9AF321A4ED6A00E03846 /* typing_detection.h */, + 697E9AF421A4ED6A00E03846 /* logging */, + 697E9AF721A4ED6A00E03846 /* vad */, + 697E9B0C21A4ED6A00E03846 /* utility */, ); path = audio_processing; sourceTree = ""; }; - 69A6DD4E1E95EC7700000E69 /* aec */ = { + 697E99C221A4ED6900E03846 /* echo_detector */ = { + isa = PBXGroup; + children = ( + 697E99C321A4ED6900E03846 /* moving_max.h */, + 697E99C421A4ED6900E03846 /* circular_buffer.h */, + 697E99C521A4ED6900E03846 /* normalized_covariance_estimator.h */, + 697E99C621A4ED6900E03846 /* normalized_covariance_estimator.cc */, + 697E99C721A4ED6900E03846 /* moving_max.cc */, + 697E99C821A4ED6900E03846 /* circular_buffer.cc */, + 697E99C921A4ED6900E03846 /* mean_variance_estimator.cc */, + 697E99CA21A4ED6900E03846 /* mean_variance_estimator.h */, + ); + path = echo_detector; + sourceTree = ""; + }; + 697E99CF21A4ED6900E03846 /* test */ = { + isa = PBXGroup; + children = ( + 697E99D021A4ED6900E03846 /* android */, + ); + path = test; + sourceTree = ""; + }; + 697E99D021A4ED6900E03846 /* android */ = { + isa = PBXGroup; + children = ( + 697E99D121A4ED6900E03846 /* apmtest */, + ); + path = android; + sourceTree = ""; + }; + 697E99D121A4ED6900E03846 /* apmtest */ = { + isa = PBXGroup; + children = ( + 697E99D221A4ED6900E03846 /* jni */, + ); + path = apmtest; + sourceTree = ""; + }; + 697E99D221A4ED6900E03846 /* jni */ = { + isa = PBXGroup; + children = ( + ); + path = jni; + sourceTree = ""; + }; + 697E99D321A4ED6900E03846 /* ns */ = { + isa = PBXGroup; + children = ( + 697E99D421A4ED6900E03846 /* ns_core.h */, + 697E99D521A4ED6900E03846 /* nsx_core.c */, + 697E99D621A4ED6900E03846 /* noise_suppression_x.c */, + 697E99D721A4ED6900E03846 /* nsx_core_c.c */, + 697E99D821A4ED6900E03846 /* defines.h */, + 697E99D921A4ED6900E03846 /* noise_suppression.h */, + 697E99DA21A4ED6900E03846 /* ns_core.c */, + 697E99DB21A4ED6900E03846 /* nsx_core.h */, + 697E99DC21A4ED6900E03846 /* windows_private.h */, + 697E99DD21A4ED6900E03846 /* noise_suppression_x.h */, + 697E99DE21A4ED6900E03846 /* nsx_core_neon.c */, + 697E99DF21A4ED6900E03846 /* noise_suppression.c */, + 697E99E021A4ED6900E03846 /* nsx_defines.h */, + ); + path = ns; + sourceTree = ""; + }; + 697E99E621A4ED6900E03846 /* aec_dump */ = { + isa = PBXGroup; + children = ( + ); + path = aec_dump; + sourceTree = ""; + }; + 697E99E721A4ED6900E03846 /* include */ = { + isa = PBXGroup; + children = ( + 697E99E821A4ED6900E03846 /* audio_generator.h */, + 697E99E921A4ED6900E03846 /* config.h */, + 697E99EA21A4ED6900E03846 /* audio_frame_view.h */, + 697E99EB21A4ED6900E03846 /* mock_audio_processing.h */, + 697E99EC21A4ED6900E03846 /* gain_control.h */, + 697E99ED21A4ED6900E03846 /* audio_generator_factory.h */, + 697E99EE21A4ED6900E03846 /* audio_processing_statistics.cc */, + 697E99EF21A4ED6900E03846 /* audio_generator_factory.cc */, + 697E99F021A4ED6900E03846 /* aec_dump.cc */, + 697E99F121A4ED6900E03846 /* aec_dump.h */, + 697E99F221A4ED6900E03846 /* audio_processing_statistics.h */, + 697E99F321A4ED6900E03846 /* audio_processing.h */, + 697E99F421A4ED6900E03846 /* audio_processing.cc */, + 697E99F521A4ED6900E03846 /* config.cc */, + ); + path = include; + sourceTree = ""; + }; + 697E99F621A4ED6900E03846 /* agc2 */ = { + isa = PBXGroup; + children = ( + 697E99F721A4ED6900E03846 /* interpolated_gain_curve.h */, + 697E99F821A4ED6900E03846 /* biquad_filter.h */, + 697E99F921A4ED6900E03846 /* interpolated_gain_curve.cc */, + 697E99FA21A4ED6900E03846 /* agc2_common.cc */, + 697E99FB21A4ED6900E03846 /* agc2_testing_common.h */, + 697E99FC21A4ED6900E03846 /* adaptive_mode_level_estimator.h */, + 697E99FD21A4ED6900E03846 /* gain_applier.cc */, + 697E99FE21A4ED6900E03846 /* signal_classifier.h */, + 697E99FF21A4ED6900E03846 /* adaptive_agc.cc */, + 697E9A0021A4ED6900E03846 /* adaptive_digital_gain_applier.cc */, + 697E9A0121A4ED6900E03846 /* limiter.cc */, + 697E9A0221A4ED6900E03846 /* saturation_protector.cc */, + 697E9A0321A4ED6900E03846 /* vector_float_frame.h */, + 697E9A0421A4ED6900E03846 /* rnn_vad */, + 697E9A1B21A4ED6900E03846 /* fixed_gain_controller.h */, + 697E9A1C21A4ED6900E03846 /* adaptive_mode_level_estimator_agc.cc */, + 697E9A1D21A4ED6900E03846 /* vector_float_frame.cc */, + 697E9A1E21A4ED6900E03846 /* down_sampler.h */, + 697E9A1F21A4ED6900E03846 /* noise_level_estimator.cc */, + 697E9A2021A4ED6900E03846 /* agc2_testing_common.cc */, + 697E9A2121A4ED6900E03846 /* fixed_digital_level_estimator.cc */, + 697E9A2221A4ED6900E03846 /* fixed_gain_controller.cc */, + 697E9A2321A4ED6900E03846 /* saturation_protector.h */, + 697E9A2421A4ED6900E03846 /* vad_with_level.cc */, + 697E9A2521A4ED6900E03846 /* limiter_db_gain_curve.cc */, + 697E9A2621A4ED6900E03846 /* agc2_common.h */, + 697E9A2721A4ED6900E03846 /* adaptive_mode_level_estimator_agc.h */, + 697E9A2821A4ED6900E03846 /* adaptive_digital_gain_applier.h */, + 697E9A2921A4ED6900E03846 /* vad_with_level.h */, + 697E9A2A21A4ED6900E03846 /* limiter_db_gain_curve.h */, + 697E9A2B21A4ED6900E03846 /* fixed_digital_level_estimator.h */, + 697E9A2C21A4ED6900E03846 /* adaptive_agc.h */, + 697E9A2D21A4ED6900E03846 /* gain_applier.h */, + 697E9A2E21A4ED6900E03846 /* down_sampler.cc */, + 697E9A2F21A4ED6900E03846 /* noise_level_estimator.h */, + 697E9A3021A4ED6900E03846 /* signal_classifier.cc */, + 697E9A3121A4ED6900E03846 /* noise_spectrum_estimator.cc */, + 697E9A3221A4ED6900E03846 /* compute_interpolated_gain_curve.cc */, + 697E9A3321A4ED6900E03846 /* compute_interpolated_gain_curve.h */, + 697E9A3421A4ED6900E03846 /* biquad_filter.cc */, + 697E9A3521A4ED6900E03846 /* noise_spectrum_estimator.h */, + 697E9A3621A4ED6900E03846 /* limiter.h */, + 697E9A3721A4ED6900E03846 /* adaptive_mode_level_estimator.cc */, + ); + path = agc2; + sourceTree = ""; + }; + 697E9A0421A4ED6900E03846 /* rnn_vad */ = { isa = PBXGroup; children = ( - 69A6DD4F1E95EC7700000E69 /* aec_common.h */, - 69A6DD501E95EC7700000E69 /* aec_core.cc */, - 69A6DD511E95EC7700000E69 /* aec_core.h */, - 69A6DD521E95EC7700000E69 /* aec_core_neon.cc */, - 69A6DD531E95EC7700000E69 /* aec_core_optimized_methods.h */, - 69A6DD541E95EC7700000E69 /* aec_core_sse2.cc */, - 69A6DD551E95EC7700000E69 /* aec_resampler.cc */, - 69A6DD561E95EC7700000E69 /* aec_resampler.h */, - 69A6DD571E95EC7700000E69 /* echo_cancellation.cc */, - 69A6DD581E95EC7700000E69 /* echo_cancellation.h */, + 697E9A0521A4ED6900E03846 /* spectral_features_internal.cc */, + 697E9A0621A4ED6900E03846 /* sequence_buffer.h */, + 697E9A0721A4ED6900E03846 /* rnn.h */, + 697E9A0821A4ED6900E03846 /* rnn.cc */, + 697E9A0921A4ED6900E03846 /* test_utils.h */, + 697E9A0A21A4ED6900E03846 /* pitch_info.h */, + 697E9A0B21A4ED6900E03846 /* lp_residual.h */, + 697E9A0C21A4ED6900E03846 /* ring_buffer.h */, + 697E9A0D21A4ED6900E03846 /* pitch_search_internal.cc */, + 697E9A0E21A4ED6900E03846 /* symmetric_matrix_buffer.h */, + 697E9A0F21A4ED6900E03846 /* spectral_features.h */, + 697E9A1021A4ED6900E03846 /* features_extraction.h */, + 697E9A1121A4ED6900E03846 /* common.h */, + 697E9A1221A4ED6900E03846 /* spectral_features_internal.h */, + 697E9A1321A4ED6900E03846 /* fft_util.h */, + 697E9A1421A4ED6900E03846 /* spectral_features.cc */, + 697E9A1521A4ED6900E03846 /* pitch_search_internal.h */, + 697E9A1621A4ED6900E03846 /* pitch_search.cc */, + 697E9A1721A4ED6900E03846 /* pitch_search.h */, + 697E9A1821A4ED6900E03846 /* features_extraction.cc */, + 697E9A1921A4ED6900E03846 /* fft_util.cc */, + 697E9A1A21A4ED6900E03846 /* lp_residual.cc */, + ); + path = rnn_vad; + sourceTree = ""; + }; + 697E9A3821A4ED6900E03846 /* transient */ = { + isa = PBXGroup; + children = ( + 697E9A3921A4ED6900E03846 /* moving_moments.cc */, + 697E9A3A21A4ED6900E03846 /* transient_detector.h */, + 697E9A3B21A4ED6900E03846 /* wpd_tree.cc */, + 697E9A3C21A4ED6900E03846 /* transient_suppressor.h */, + 697E9A3D21A4ED6900E03846 /* daubechies_8_wavelet_coeffs.h */, + 697E9A3E21A4ED6900E03846 /* common.h */, + 697E9A3F21A4ED6900E03846 /* wpd_node.h */, + 697E9A4021A4ED6900E03846 /* moving_moments.h */, + 697E9A4121A4ED6900E03846 /* wpd_tree.h */, + 697E9A4221A4ED6900E03846 /* wpd_node.cc */, + 697E9A4321A4ED6900E03846 /* transient_suppressor.cc */, + 697E9A4421A4ED6900E03846 /* transient_detector.cc */, + 697E9A4521A4ED6900E03846 /* dyadic_decimator.h */, + ); + path = transient; + sourceTree = ""; + }; + 697E9A4A21A4ED6900E03846 /* aec */ = { + isa = PBXGroup; + children = ( + 697E9A4B21A4ED6900E03846 /* echo_cancellation.cc */, + 697E9A4C21A4ED6900E03846 /* aec_resampler.h */, + 697E9A4D21A4ED6900E03846 /* aec_resampler.cc */, + 697E9A4E21A4ED6900E03846 /* echo_cancellation.h */, + 697E9A4F21A4ED6900E03846 /* aec_core.cc */, + 697E9A5021A4ED6900E03846 /* aec_core.h */, + 697E9A5121A4ED6900E03846 /* aec_core_optimized_methods.h */, + 697E9A5221A4ED6900E03846 /* aec_core_neon.cc */, + 697E9A5321A4ED6900E03846 /* aec_core_sse2.cc */, + 697E9A5421A4ED6900E03846 /* aec_common.h */, ); path = aec; sourceTree = ""; }; - 69A6DD591E95EC7700000E69 /* aecm */ = { + 697E9A5921A4ED6900E03846 /* agc */ = { + isa = PBXGroup; + children = ( + 697E9A5A21A4ED6900E03846 /* agc.cc */, + 697E9A5B21A4ED6900E03846 /* loudness_histogram.cc */, + 697E9A5C21A4ED6900E03846 /* agc_manager_direct.cc */, + 697E9A5D21A4ED6900E03846 /* legacy */, + 697E9A6321A4ED6900E03846 /* utility.cc */, + 697E9A6421A4ED6900E03846 /* mock_agc.h */, + 697E9A6521A4ED6900E03846 /* loudness_histogram.h */, + 697E9A6621A4ED6900E03846 /* gain_map_internal.h */, + 697E9A6721A4ED6900E03846 /* utility.h */, + 697E9A6821A4ED6900E03846 /* agc_manager_direct.h */, + 697E9A6921A4ED6900E03846 /* agc.h */, + ); + path = agc; + sourceTree = ""; + }; + 697E9A5D21A4ED6900E03846 /* legacy */ = { isa = PBXGroup; children = ( - 69A6DD5A1E95EC7700000E69 /* aecm_core.cc */, - 69A6DD5B1E95EC7700000E69 /* aecm_core.h */, - 69A6DD5C1E95EC7700000E69 /* aecm_core_c.cc */, - 69A6DD5D1E95EC7700000E69 /* aecm_core_neon.cc */, - 69A6DD5E1E95EC7700000E69 /* aecm_defines.h */, - 69A6DD5F1E95EC7700000E69 /* echo_control_mobile.cc */, - 69A6DD601E95EC7700000E69 /* echo_control_mobile.h */, + 697E9A5E21A4ED6900E03846 /* analog_agc.h */, + 697E9A5F21A4ED6900E03846 /* gain_control.h */, + 697E9A6021A4ED6900E03846 /* digital_agc.h */, + 697E9A6121A4ED6900E03846 /* analog_agc.c */, + 697E9A6221A4ED6900E03846 /* digital_agc.c */, + ); + path = legacy; + sourceTree = ""; + }; + 697E9A7021A4ED6900E03846 /* audio_generator */ = { + isa = PBXGroup; + children = ( + 697E9A7121A4ED6A00E03846 /* file_audio_generator.h */, + 697E9A7221A4ED6A00E03846 /* file_audio_generator.cc */, + ); + path = audio_generator; + sourceTree = ""; + }; + 697E9A7A21A4ED6A00E03846 /* aecm */ = { + isa = PBXGroup; + children = ( + 697E9A7B21A4ED6A00E03846 /* aecm_core.h */, + 697E9A7C21A4ED6A00E03846 /* aecm_defines.h */, + 697E9A7D21A4ED6A00E03846 /* aecm_core.cc */, + 697E9A7E21A4ED6A00E03846 /* aecm_core_c.cc */, + 697E9A7F21A4ED6A00E03846 /* aecm_core_neon.cc */, + 697E9A8021A4ED6A00E03846 /* echo_control_mobile.h */, + 697E9A8121A4ED6A00E03846 /* echo_control_mobile.cc */, ); path = aecm; sourceTree = ""; }; - 69A6DD611E95EC7700000E69 /* agc */ = { + 697E9A8221A4ED6A00E03846 /* aec3 */ = { isa = PBXGroup; children = ( - 69A6DD621E95EC7700000E69 /* legacy */, + 697E9A8321A4ED6A00E03846 /* render_reverb_model.cc */, + 697E9A8421A4ED6A00E03846 /* downsampled_render_buffer.h */, + 697E9A8521A4ED6A00E03846 /* subtractor_output_analyzer.h */, + 697E9A8621A4ED6A00E03846 /* reverb_model_fallback.cc */, + 697E9A8721A4ED6A00E03846 /* residual_echo_estimator.h */, + 697E9A8821A4ED6A00E03846 /* shadow_filter_update_gain.h */, + 697E9A8921A4ED6A00E03846 /* echo_remover_metrics.cc */, + 697E9A8A21A4ED6A00E03846 /* matched_filter_lag_aggregator.cc */, + 697E9A8B21A4ED6A00E03846 /* render_delay_buffer2.cc */, + 697E9A8C21A4ED6A00E03846 /* aec_state.h */, + 697E9A8D21A4ED6A00E03846 /* suppression_filter.h */, + 697E9A8E21A4ED6A00E03846 /* echo_path_variability.cc */, + 697E9A8F21A4ED6A00E03846 /* frame_blocker.cc */, + 697E9A9021A4ED6A00E03846 /* subtractor.cc */, + 697E9A9121A4ED6A00E03846 /* block_delay_buffer.h */, + 697E9A9221A4ED6A00E03846 /* adaptive_fir_filter.h */, + 697E9A9321A4ED6A00E03846 /* cascaded_biquad_filter.h */, + 697E9A9421A4ED6A00E03846 /* matched_filter.h */, + 697E9A9521A4ED6A00E03846 /* subtractor_output.h */, + 697E9A9621A4ED6A00E03846 /* render_signal_analyzer.h */, + 697E9A9721A4ED6A00E03846 /* aec3_fft.cc */, + 697E9A9821A4ED6A00E03846 /* aec3_fft.h */, + 697E9A9921A4ED6A00E03846 /* echo_remover_metrics.h */, + 697E9A9A21A4ED6A00E03846 /* fullband_erle_estimator.cc */, + 697E9A9B21A4ED6A00E03846 /* suppression_filter.cc */, + 697E9A9C21A4ED6A00E03846 /* block_processor.cc */, + 697E9A9D21A4ED6A00E03846 /* filter_analyzer.h */, + 697E9A9E21A4ED6A00E03846 /* subtractor.h */, + 697E9A9F21A4ED6A00E03846 /* echo_path_delay_estimator.h */, + 697E9AA021A4ED6A00E03846 /* subband_erle_estimator.cc */, + 697E9AA121A4ED6A00E03846 /* render_delay_controller_metrics.cc */, + 697E9AA221A4ED6A00E03846 /* render_delay_buffer.cc */, + 697E9AA321A4ED6A00E03846 /* block_processor_metrics.h */, + 697E9AA421A4ED6A00E03846 /* vector_buffer.cc */, + 697E9AA521A4ED6A00E03846 /* erl_estimator.cc */, + 697E9AA621A4ED6A00E03846 /* aec_state.cc */, + 697E9AA721A4ED6A00E03846 /* adaptive_fir_filter.cc */, + 697E9AA821A4ED6A00E03846 /* fft_data.h */, + 697E9AA921A4ED6A00E03846 /* render_delay_controller.cc */, + 697E9AAA21A4ED6A00E03846 /* skew_estimator.cc */, + 697E9AAB21A4ED6A00E03846 /* render_delay_controller_metrics.h */, + 697E9AAC21A4ED6A00E03846 /* comfort_noise_generator.h */, + 697E9AAD21A4ED6A00E03846 /* echo_path_delay_estimator.cc */, + 697E9AAE21A4ED6A00E03846 /* erl_estimator.h */, + 697E9AAF21A4ED6A00E03846 /* echo_remover.h */, + 697E9AB021A4ED6A00E03846 /* block_framer.cc */, + 697E9AB121A4ED6A00E03846 /* erle_estimator.cc */, + 697E9AB221A4ED6A00E03846 /* reverb_model.cc */, + 697E9AB321A4ED6A00E03846 /* cascaded_biquad_filter.cc */, + 697E9AB421A4ED6A00E03846 /* matrix_buffer.h */, + 697E9AB521A4ED6A00E03846 /* render_buffer.cc */, + 697E9AB621A4ED6A00E03846 /* reverb_model_estimator.h */, + 697E9AB721A4ED6A00E03846 /* subtractor_output.cc */, + 697E9AB821A4ED6A00E03846 /* stationarity_estimator.cc */, + 697E9AB921A4ED6A00E03846 /* render_signal_analyzer.cc */, + 697E9ABA21A4ED6A00E03846 /* echo_path_variability.h */, + 697E9ABB21A4ED6A00E03846 /* moving_average.h */, + 697E9ABC21A4ED6A00E03846 /* render_reverb_model.h */, + 697E9ABD21A4ED6A00E03846 /* subtractor_output_analyzer.cc */, + 697E9ABE21A4ED6A00E03846 /* suppression_gain.cc */, + 697E9ABF21A4ED6A00E03846 /* echo_audibility.cc */, + 697E9AC021A4ED6A00E03846 /* block_processor_metrics.cc */, + 697E9AC121A4ED6A00E03846 /* render_delay_controller.h */, + 697E9AC221A4ED6A00E03846 /* suppression_gain.h */, + 697E9AC321A4ED6A00E03846 /* moving_average.cc */, + 697E9AC421A4ED6A00E03846 /* erle_estimator.h */, + 697E9AC521A4ED6A00E03846 /* subband_erle_estimator.h */, + 697E9AC621A4ED6A00E03846 /* reverb_model_estimator.cc */, + 697E9AC721A4ED6A00E03846 /* aec3_common.cc */, + 697E9AC821A4ED6A00E03846 /* residual_echo_estimator.cc */, + 697E9AC921A4ED6A00E03846 /* block_processor.h */, + 697E9ACA21A4ED6A00E03846 /* fullband_erle_estimator.h */, + 697E9ACB21A4ED6A00E03846 /* matched_filter.cc */, + 697E9ACC21A4ED6A00E03846 /* stationarity_estimator.h */, + 697E9ACD21A4ED6A00E03846 /* echo_canceller3.h */, + 697E9ACE21A4ED6A00E03846 /* skew_estimator.h */, + 697E9ACF21A4ED6A00E03846 /* reverb_decay_estimator.cc */, + 697E9AD021A4ED6A00E03846 /* render_delay_controller2.cc */, + 697E9AD121A4ED6A00E03846 /* render_buffer.h */, + 697E9AD221A4ED6A00E03846 /* suppression_gain_limiter.cc */, + 697E9AD321A4ED6A00E03846 /* main_filter_update_gain.cc */, + 697E9AD421A4ED6A00E03846 /* echo_remover.cc */, + 697E9AD521A4ED6A00E03846 /* reverb_model_fallback.h */, + 697E9AD621A4ED6A00E03846 /* downsampled_render_buffer.cc */, + 697E9AD721A4ED6A00E03846 /* vector_buffer.h */, + 697E9AD821A4ED6A00E03846 /* matrix_buffer.cc */, + 697E9AD921A4ED6A00E03846 /* reverb_frequency_response.h */, + 697E9ADA21A4ED6A00E03846 /* echo_audibility.h */, + 697E9ADB21A4ED6A00E03846 /* fft_buffer.h */, + 697E9ADC21A4ED6A00E03846 /* block_processor2.cc */, + 697E9ADD21A4ED6A00E03846 /* echo_canceller3.cc */, + 697E9ADE21A4ED6A00E03846 /* block_delay_buffer.cc */, + 697E9ADF21A4ED6A00E03846 /* aec3_common.h */, + 697E9AE021A4ED6A00E03846 /* fft_buffer.cc */, + 697E9AE121A4ED6A00E03846 /* vector_math.h */, + 697E9AE221A4ED6A00E03846 /* decimator.h */, + 697E9AE321A4ED6A00E03846 /* frame_blocker.h */, + 697E9AE421A4ED6A00E03846 /* block_framer.h */, + 697E9AE521A4ED6A00E03846 /* suppression_gain_limiter.h */, + 697E9AE621A4ED6A00E03846 /* delay_estimate.h */, + 697E9AE721A4ED6A00E03846 /* comfort_noise_generator.cc */, + 697E9AE821A4ED6A00E03846 /* reverb_model.h */, + 697E9AE921A4ED6A00E03846 /* main_filter_update_gain.h */, + 697E9AEA21A4ED6A00E03846 /* matched_filter_lag_aggregator.h */, + 697E9AEB21A4ED6A00E03846 /* shadow_filter_update_gain.cc */, + 697E9AEC21A4ED6A00E03846 /* filter_analyzer.cc */, + 697E9AED21A4ED6A00E03846 /* reverb_decay_estimator.h */, + 697E9AEE21A4ED6A00E03846 /* reverb_frequency_response.cc */, + 697E9AEF21A4ED6A00E03846 /* decimator.cc */, + 697E9AF021A4ED6A00E03846 /* render_delay_buffer.h */, ); - path = agc; + path = aec3; + sourceTree = ""; + }; + 697E9AF421A4ED6A00E03846 /* logging */ = { + isa = PBXGroup; + children = ( + 697E9AF521A4ED6A00E03846 /* apm_data_dumper.cc */, + 697E9AF621A4ED6A00E03846 /* apm_data_dumper.h */, + ); + path = logging; sourceTree = ""; }; - 69A6DD621E95EC7700000E69 /* legacy */ = { + 697E9AF721A4ED6A00E03846 /* vad */ = { isa = PBXGroup; children = ( - 69A6DD631E95EC7700000E69 /* analog_agc.c */, - 69A6DD641E95EC7700000E69 /* analog_agc.h */, - 69A6DD651E95EC7700000E69 /* digital_agc.c */, - 69A6DD661E95EC7700000E69 /* digital_agc.h */, - 69A6DD671E95EC7700000E69 /* gain_control.h */, + 697E9AF821A4ED6A00E03846 /* voice_activity_detector.cc */, + 697E9AF921A4ED6A00E03846 /* standalone_vad.cc */, + 697E9AFA21A4ED6A00E03846 /* vad_audio_proc_internal.h */, + 697E9AFB21A4ED6A00E03846 /* pitch_internal.cc */, + 697E9AFC21A4ED6A00E03846 /* vad_circular_buffer.cc */, + 697E9AFD21A4ED6A00E03846 /* vad_circular_buffer.h */, + 697E9AFE21A4ED6A00E03846 /* pitch_based_vad.h */, + 697E9AFF21A4ED6A00E03846 /* vad_audio_proc.cc */, + 697E9B0021A4ED6A00E03846 /* pole_zero_filter.cc */, + 697E9B0121A4ED6A00E03846 /* pole_zero_filter.h */, + 697E9B0221A4ED6A00E03846 /* pitch_based_vad.cc */, + 697E9B0321A4ED6A00E03846 /* gmm.h */, + 697E9B0421A4ED6A00E03846 /* common.h */, + 697E9B0521A4ED6A00E03846 /* vad_audio_proc.h */, + 697E9B0621A4ED6A00E03846 /* voice_gmm_tables.h */, + 697E9B0721A4ED6A00E03846 /* noise_gmm_tables.h */, + 697E9B0821A4ED6A00E03846 /* pitch_internal.h */, + 697E9B0921A4ED6A00E03846 /* gmm.cc */, + 697E9B0A21A4ED6A00E03846 /* standalone_vad.h */, + 697E9B0B21A4ED6A00E03846 /* voice_activity_detector.h */, ); - path = legacy; + path = vad; sourceTree = ""; }; - 69A6DD681E95EC7700000E69 /* logging */ = { + 697E9B0C21A4ED6A00E03846 /* utility */ = { isa = PBXGroup; children = ( - 69A6DD691E95EC7700000E69 /* apm_data_dumper.cc */, - 69A6DD6A1E95EC7700000E69 /* apm_data_dumper.h */, + 697E9B0D21A4ED6A00E03846 /* ooura_fft_tables_neon_sse2.h */, + 697E9B0E21A4ED6A00E03846 /* delay_estimator_internal.h */, + 697E9B0F21A4ED6A00E03846 /* ooura_fft.cc */, + 697E9B1021A4ED6A00E03846 /* ooura_fft.h */, + 697E9B1121A4ED6A00E03846 /* delay_estimator_wrapper.cc */, + 697E9B1221A4ED6A00E03846 /* ooura_fft_sse2.cc */, + 697E9B1321A4ED6A00E03846 /* delay_estimator.cc */, + 697E9B1421A4ED6A00E03846 /* block_mean_calculator.h */, + 697E9B1521A4ED6A00E03846 /* ooura_fft_neon.cc */, + 697E9B1621A4ED6A00E03846 /* block_mean_calculator.cc */, + 697E9B1721A4ED6A00E03846 /* delay_estimator.h */, + 697E9B1821A4ED6A00E03846 /* ooura_fft_tables_common.h */, + 697E9B1921A4ED6A00E03846 /* delay_estimator_wrapper.h */, ); - path = logging; + path = utility; sourceTree = ""; }; - 69A6DD6B1E95EC7700000E69 /* ns */ = { + 697E9B1A21A4ED6A00E03846 /* third_party */ = { isa = PBXGroup; children = ( - 69A6DD6C1E95EC7700000E69 /* defines.h */, - 69A6DD6D1E95EC7700000E69 /* noise_suppression.c */, - 69A6DD6E1E95EC7700000E69 /* noise_suppression.h */, - 69A6DD6F1E95EC7700000E69 /* noise_suppression_x.c */, - 69A6DD701E95EC7700000E69 /* noise_suppression_x.h */, - 69A6DD711E95EC7700000E69 /* ns_core.c */, - 69A6DD721E95EC7700000E69 /* ns_core.h */, - 69A6DD731E95EC7700000E69 /* nsx_core.c */, - 69A6DD741E95EC7700000E69 /* nsx_core.h */, - 69A6DD751E95EC7700000E69 /* nsx_core_c.c */, - 69A6DD761E95EC7700000E69 /* nsx_core_neon.c */, - 69A6DD771E95EC7700000E69 /* nsx_defines.h */, - 69A6DD781E95EC7700000E69 /* windows_private.h */, + 697E9B1B21A4ED6A00E03846 /* rnnoise */, ); - path = ns; + path = third_party; sourceTree = ""; }; - 69A6DD7D1E95EC7700000E69 /* utility */ = { + 697E9B1B21A4ED6A00E03846 /* rnnoise */ = { isa = PBXGroup; children = ( - 69A6DD7E1E95EC7700000E69 /* block_mean_calculator.cc */, - 69A6DD7F1E95EC7700000E69 /* block_mean_calculator.h */, - 69A6DD801E95EC7700000E69 /* delay_estimator.cc */, - 69A6DD811E95EC7700000E69 /* delay_estimator.h */, - 69A6DD821E95EC7700000E69 /* delay_estimator_internal.h */, - 69A6DD831E95EC7700000E69 /* delay_estimator_wrapper.cc */, - 69A6DD841E95EC7700000E69 /* delay_estimator_wrapper.h */, - 69A6DD851E95EC7700000E69 /* ooura_fft.cc */, - 69A6DD861E95EC7700000E69 /* ooura_fft.h */, - 69A6DD871E95EC7700000E69 /* ooura_fft_neon.cc */, - 69A6DD881E95EC7700000E69 /* ooura_fft_sse2.cc */, - 69A6DD891E95EC7700000E69 /* ooura_fft_tables_common.h */, - 69A6DD8A1E95EC7700000E69 /* ooura_fft_tables_neon_sse2.h */, + 697E9B1C21A4ED6A00E03846 /* src */, ); - path = utility; + path = rnnoise; sourceTree = ""; }; - 69A6DD8B1E95EC7700000E69 /* system_wrappers */ = { + 697E9B1C21A4ED6A00E03846 /* src */ = { isa = PBXGroup; children = ( - 69A6DD8C1E95EC7700000E69 /* include */, - 69A6DD911E95EC7700000E69 /* source */, + 697E9B1D21A4ED6A00E03846 /* rnn_vad_weights.cc */, + 697E9B1E21A4ED6A00E03846 /* rnn_activations.h */, + 697E9B1F21A4ED6A00E03846 /* kiss_fft.h */, + 697E9B2021A4ED6A00E03846 /* kiss_fft.cc */, + 697E9B2121A4ED6A00E03846 /* rnn_vad_weights.h */, ); - path = system_wrappers; + path = src; sourceTree = ""; }; - 69A6DD8C1E95EC7700000E69 /* include */ = { + 69A6DCFE1E95EC7700000E69 /* webrtc_dsp */ = { isa = PBXGroup; children = ( - 69A6DD8D1E95EC7700000E69 /* asm_defines.h */, - 69A6DD8E1E95EC7700000E69 /* compile_assert_c.h */, - 69A6DD8F1E95EC7700000E69 /* cpu_features_wrapper.h */, - 69A6DD901E95EC7700000E69 /* metrics.h */, + 697E990B21A4ED6800E03846 /* absl */, + 697E993421A4ED6900E03846 /* api */, + 697E989521A4ED6800E03846 /* common_audio */, + 697E998221A4ED6900E03846 /* modules */, + 697E993E21A4ED6900E03846 /* rtc_base */, + 697E988A21A4ED6800E03846 /* system_wrappers */, + 697E9B1A21A4ED6A00E03846 /* third_party */, + 697E961921A4EA0700E03846 /* typedefs.h */, ); - path = include; + path = webrtc_dsp; sourceTree = ""; }; - 69A6DD911E95EC7700000E69 /* source */ = { + 69DD8CFC218CD400001E8140 /* video */ = { isa = PBXGroup; children = ( - 69A6DD921E95EC7700000E69 /* cpu_features.cc */, + 69DD8CFD218CD400001E8140 /* VideoRenderer.h */, + 69DD8CFE218CD400001E8140 /* VideoRenderer.cpp */, + 69DD8CFF218CD400001E8140 /* VideoSource.cpp */, + 69DD8D00218CD400001E8140 /* VideoSource.h */, ); - path = source; + path = video; sourceTree = ""; }; 69F8422C1E67540700C110F7 = { @@ -881,90 +2330,8 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 69986178209526D400B68BEC /* Buffers.h in Headers */, - 692AB9011E6759DD00706ACC /* threading.h in Headers */, - 692AB8EA1E6759DD00706ACC /* MediaStreamItf.h in Headers */, - 692AB8EE1E6759DD00706ACC /* OpusEncoder.h in Headers */, - 69A6DDEB1E95EC7700000E69 /* echo_control_mobile.h in Headers */, - 692AB8CE1E6759DD00706ACC /* AudioOutput.h in Headers */, - 692AB8D91E6759DD00706ACC /* CongestionControl.h in Headers */, - 69A6DDFE1E95EC7700000E69 /* nsx_defines.h in Headers */, - 692AB8CC1E6759DD00706ACC /* AudioInput.h in Headers */, - 69A6DDA51E95EC7700000E69 /* fft4g.h in Headers */, - 69A6DDC01E95EC7700000E69 /* spl_inl.h in Headers */, - 69A6DE0F1E95EC7800000E69 /* ooura_fft_tables_common.h in Headers */, - 69A6DDDA1E95EC7700000E69 /* sparse_fir_filter.h in Headers */, - 69A6DDE61E95EC7700000E69 /* aecm_core.h in Headers */, - 692AB8EC1E6759DD00706ACC /* OpusDecoder.h in Headers */, - 69A6DE1E1E95ECF000000E69 /* wav_header.h in Headers */, - 69A6DD981E95EC7700000E69 /* checks.h in Headers */, - 692AB8E81E6759DD00706ACC /* logging.h in Headers */, - 69A6DDED1E95EC7700000E69 /* analog_agc.h in Headers */, - 69A6DE081E95EC7800000E69 /* delay_estimator_internal.h in Headers */, - 69A6DDE91E95EC7700000E69 /* aecm_defines.h in Headers */, - 69A6DD9C1E95EC7700000E69 /* safe_conversions_impl.h in Headers */, - 69A6DDAE1E95EC7700000E69 /* complex_fft_tables.h in Headers */, - 692AB8FF1E6759DD00706ACC /* TGLogWrapper.h in Headers */, - 69791A4E1EE8262400BB85FB /* NetworkSocketPosix.h in Headers */, 692AB9051E6759DD00706ACC /* VoIPServerConfig.h in Headers */, - 6998617C2095292A00B68BEC /* PacketReassembler.h in Headers */, - 69A6DDF31E95EC7700000E69 /* defines.h in Headers */, - 69A6DD9D1E95EC7700000E69 /* sanitizer.h in Headers */, 692AB9031E6759DD00706ACC /* VoIPController.h in Headers */, - 69A6DDC11E95EC7700000E69 /* spl_inl_armv7.h in Headers */, - 69A6DE031E95EC7800000E69 /* three_band_filter_bank.h in Headers */, - 69A6DDFB1E95EC7700000E69 /* nsx_core.h in Headers */, - D00ACA4F20222F5D0045D427 /* SetupLogging.h in Headers */, - 69A6DDE41E95EC7700000E69 /* echo_cancellation.h in Headers */, - 69A6DDF71E95EC7700000E69 /* noise_suppression_x.h in Headers */, - 69A6DD9B1E95EC7700000E69 /* safe_conversions.h in Headers */, - 69A6DE071E95EC7800000E69 /* delay_estimator.h in Headers */, - 69A6DDFF1E95EC7700000E69 /* windows_private.h in Headers */, - 69A6DD961E95EC7700000E69 /* basictypes.h in Headers */, - 69A6DE161E95EC7800000E69 /* typedefs.h in Headers */, - 69E357B120F88955002E163B /* AudioIO.h in Headers */, - 69A6DDE21E95EC7700000E69 /* aec_resampler.h in Headers */, - 69A6DD9F1E95EC7700000E69 /* stringutils.h in Headers */, - 69A6DDDB1E95EC7700000E69 /* aec_common.h in Headers */, - 69A6DDDD1E95EC7700000E69 /* aec_core.h in Headers */, - 69A6DE051E95EC7800000E69 /* block_mean_calculator.h in Headers */, - 69A6DD951E95EC7700000E69 /* atomicops.h in Headers */, - 69A6DD991E95EC7700000E69 /* constructormagic.h in Headers */, - 69A6DDA01E95EC7700000E69 /* type_traits.h in Headers */, - 69A6DDBE1E95EC7700000E69 /* real_fft.h in Headers */, - 69FB0B2E20F6860E00827817 /* MessageThread.h in Headers */, - 692AB8FC1E6759DD00706ACC /* AudioOutputAudioUnit.h in Headers */, - 69A6DD941E95EC7700000E69 /* array_view.h in Headers */, - 692AB8D01E6759DD00706ACC /* BlockingQueue.h in Headers */, - 69A6DDF91E95EC7700000E69 /* ns_core.h in Headers */, - 69A6DDA31E95EC7700000E69 /* channel_buffer.h in Headers */, - 69A6DE0A1E95EC7800000E69 /* delay_estimator_wrapper.h in Headers */, - 69A6DE141E95EC7800000E69 /* metrics.h in Headers */, - 692AB8FE1E6759DD00706ACC /* AudioUnitIO.h in Headers */, - 69015D951E9D848700AC9763 /* NetworkSocket.h in Headers */, - 69A6DE131E95EC7800000E69 /* cpu_features_wrapper.h in Headers */, - 69A6DDDF1E95EC7700000E69 /* aec_core_optimized_methods.h in Headers */, - 69A6DE101E95EC7800000E69 /* ooura_fft_tables_neon_sse2.h in Headers */, - 69A6DDBF1E95EC7700000E69 /* signal_processing_library.h in Headers */, - 69A6DDCF1E95EC7700000E69 /* resample_by_2_internal.h in Headers */, - 69A6DDA81E95EC7700000E69 /* ring_buffer.h in Headers */, - 69A6DE111E95EC7800000E69 /* asm_defines.h in Headers */, - 69A6DE011E95EC7800000E69 /* splitting_filter.h in Headers */, - 69A6DE0C1E95EC7800000E69 /* ooura_fft.h in Headers */, - 69A6DDA61E95EC7700000E69 /* audio_util.h in Headers */, - 692AB8FA1E6759DD00706ACC /* AudioInputAudioUnit.h in Headers */, - 69A6DD9A1E95EC7700000E69 /* safe_compare.h in Headers */, - 69A6DDEF1E95EC7700000E69 /* digital_agc.h in Headers */, - 69A6DDF21E95EC7700000E69 /* apm_data_dumper.h in Headers */, - 69960A041EF85C2900F9D091 /* DarwinSpecific.h in Headers */, - 69A6DDC21E95EC7700000E69 /* spl_inl_mips.h in Headers */, - 69791A581EE8272A00BB85FB /* Resampler.h in Headers */, - 692AB8DB1E6759DD00706ACC /* EchoCanceller.h in Headers */, - 69A6DE1C1E95ECF000000E69 /* wav_file.h in Headers */, - 69A6DDF51E95EC7700000E69 /* noise_suppression.h in Headers */, - 692AB8E71E6759DD00706ACC /* JitterBuffer.h in Headers */, - 69A6DE121E95EC7800000E69 /* compile_assert_c.h in Headers */, - 69A6DDF01E95EC7700000E69 /* gain_control.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1094,106 +2461,309 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 697E9D1B21A4ED6D00E03846 /* echo_audibility.cc in Sources */, + 697E9B9821A4ED6B00E03846 /* ascii.cc in Sources */, + 697E9B3C21A4ED6B00E03846 /* sinc_resampler_neon.cc in Sources */, + 697E9D0621A4ED6D00E03846 /* skew_estimator.cc in Sources */, + 697E9C5321A4ED6C00E03846 /* audio_processing_statistics.cc in Sources */, + 697E9BFD21A4ED6C00E03846 /* pitch_estimator.c in Sources */, + 697E9C7C21A4ED6C00E03846 /* fft_util.cc in Sources */, + 697E9D1F21A4ED6D00E03846 /* moving_average.cc in Sources */, + 697E9D1C21A4ED6D00E03846 /* block_processor_metrics.cc in Sources */, + 697E9C7721A4ED6C00E03846 /* spectral_features.cc in Sources */, + 697E9B4721A4ED6B00E03846 /* sinusoidal_linear_chirp_source.cc in Sources */, + 697E9D5A21A4ED6E00E03846 /* pole_zero_filter.cc in Sources */, + 697E9D1321A4ED6D00E03846 /* subtractor_output.cc in Sources */, + 697E9B3821A4ED6B00E03846 /* audio_util.cc in Sources */, + 697E9D5C21A4ED6E00E03846 /* pitch_based_vad.cc in Sources */, + 697E9B9021A4ED6B00E03846 /* vad_core.c in Sources */, + 697E9C9D21A4ED6D00E03846 /* wpd_tree.cc in Sources */, + 697E9C2721A4ED6C00E03846 /* decode_bwe.c in Sources */, + 697E9D6C21A4ED6E00E03846 /* delay_estimator.cc in Sources */, + 697E9C1021A4ED6C00E03846 /* lpc_tables.c in Sources */, + 697E9B5B21A4ED6B00E03846 /* complex_fft.c in Sources */, + 697E9B9321A4ED6B00E03846 /* vad_gmm.c in Sources */, + 697E9D4A21A4ED6D00E03846 /* reverb_frequency_response.cc in Sources */, + 697E9C9721A4ED6D00E03846 /* biquad_filter.cc in Sources */, + 697E9B5021A4ED6B00E03846 /* audio_converter.cc in Sources */, + 697E9CFC21A4ED6D00E03846 /* subband_erle_estimator.cc in Sources */, + 697E9B4E21A4ED6B00E03846 /* fft4g.c in Sources */, + 697E9C6821A4ED6C00E03846 /* spectral_features_internal.cc in Sources */, + 697E9CAE21A4ED6D00E03846 /* aec_resampler.cc in Sources */, + 697E9D3C21A4ED6D00E03846 /* fft_buffer.cc in Sources */, + 697E9CD021A4ED6D00E03846 /* file_audio_generator.cc in Sources */, + 697E9CB921A4ED6D00E03846 /* gain_control_for_experimental_agc.cc in Sources */, + 697E9CDA21A4ED6D00E03846 /* aecm_core.cc in Sources */, + 697E9C6121A4ED6C00E03846 /* gain_applier.cc in Sources */, + 697E9C0C21A4ED6C00E03846 /* filter_functions.c in Sources */, + 697E9CBB21A4ED6D00E03846 /* loudness_histogram.cc in Sources */, 6915307B1E6B5BAB004F643F /* logging.cpp in Sources */, - 69A6DDD31E95EC7700000E69 /* spl_sqrt.c in Sources */, - 69A6DDC51E95EC7700000E69 /* min_max_operations.c in Sources */, + 697E9C0D21A4ED6C00E03846 /* decode.c in Sources */, + 697E9B2821A4ED6B00E03846 /* metrics.cc in Sources */, + 697E9CEA21A4ED6D00E03846 /* echo_path_variability.cc in Sources */, + 697E9B7921A4ED6B00E03846 /* filter_ar.c in Sources */, 692AB9041E6759DD00706ACC /* VoIPServerConfig.cpp in Sources */, - 69A6DD971E95EC7700000E69 /* checks.cc in Sources */, - 69A6DDB11E95EC7700000E69 /* cross_correlation_neon.c in Sources */, - 69A6DDF11E95EC7700000E69 /* apm_data_dumper.cc in Sources */, - 69A6DDFA1E95EC7700000E69 /* nsx_core.c in Sources */, - 69A6DDAD1E95EC7700000E69 /* complex_fft.c in Sources */, - 69A6DDA41E95EC7700000E69 /* fft4g.c in Sources */, + 697E9B7D21A4ED6B00E03846 /* ilbc_specific_functions.c in Sources */, + 697E9C7021A4ED6C00E03846 /* pitch_search_internal.cc in Sources */, + 697E9C7D21A4ED6C00E03846 /* lp_residual.cc in Sources */, + 697E9B5621A4ED6B00E03846 /* smoothing_filter.cc in Sources */, 692AB9021E6759DD00706ACC /* VoIPController.cpp in Sources */, - 69A6DDB61E95EC7700000E69 /* energy.c in Sources */, + 697E9C2B21A4ED6C00E03846 /* isac.c in Sources */, + 697E9CDF21A4ED6D00E03846 /* render_reverb_model.cc in Sources */, + 697E9CCA21A4ED6D00E03846 /* audio_processing_impl.cc in Sources */, + 697E9CAC21A4ED6D00E03846 /* echo_cancellation.cc in Sources */, + 697E9CDE21A4ED6D00E03846 /* echo_control_mobile.cc in Sources */, + 697E9C6B21A4ED6C00E03846 /* rnn.cc in Sources */, + 697E9B4021A4ED6B00E03846 /* sinc_resampler_sse.cc in Sources */, + 697E9D0521A4ED6D00E03846 /* render_delay_controller.cc in Sources */, + 697E9D7621A4ED6E00E03846 /* kiss_fft.cc in Sources */, + 697E9B6521A4ED6B00E03846 /* sqrt_of_one_minus_x_squared.c in Sources */, 69960A051EF85C2900F9D091 /* DarwinSpecific.mm in Sources */, - 69A6DDA11E95EC7700000E69 /* audio_util.cc in Sources */, - 69A6DDE31E95EC7700000E69 /* echo_cancellation.cc in Sources */, - 69A6DDD71E95EC7700000E69 /* sqrt_of_one_minus_x_squared.c in Sources */, 69791A4D1EE8262400BB85FB /* NetworkSocketPosix.cpp in Sources */, + 697E9CBC21A4ED6D00E03846 /* agc_manager_direct.cc in Sources */, + 697E9B5821A4ED6B00E03846 /* ring_buffer.c in Sources */, + 697E9C1E21A4ED6C00E03846 /* isac_vad.c in Sources */, + 697E9B6921A4ED6B00E03846 /* lpc_to_refl_coef.c in Sources */, + 697E9CF321A4ED6D00E03846 /* aec3_fft.cc in Sources */, + 697E9B3A21A4ED6B00E03846 /* fir_filter_sse.cc in Sources */, + 697E9CEC21A4ED6D00E03846 /* subtractor.cc in Sources */, + 697E9C2821A4ED6C00E03846 /* spectrum_ar_model_tables.c in Sources */, + 697E9C1821A4ED6C00E03846 /* arith_routines_hist.c in Sources */, + 697E9B2E21A4ED6B00E03846 /* fir_filter_factory.cc in Sources */, + 69DD8D02218CD401001E8140 /* VideoRenderer.cpp in Sources */, + 697E9C8321A4ED6C00E03846 /* agc2_testing_common.cc in Sources */, + 697E9C6621A4ED6C00E03846 /* saturation_protector.cc in Sources */, + 697E9CA521A4ED6D00E03846 /* transient_suppressor.cc in Sources */, + 697E9B6F21A4ED6B00E03846 /* division_operations.c in Sources */, + 697E9CC021A4ED6D00E03846 /* analog_agc.c in Sources */, + 697E9C1D21A4ED6C00E03846 /* entropy_coding.c in Sources */, + 697E9CD521A4ED6D00E03846 /* noise_suppression_impl.cc in Sources */, + 697E9D1A21A4ED6D00E03846 /* suppression_gain.cc in Sources */, + 697E9B7221A4ED6B00E03846 /* min_max_operations_neon.c in Sources */, + 697E9B8921A4ED6B00E03846 /* vad.cc in Sources */, + 697E9BD721A4ED6C00E03846 /* checks.cc in Sources */, + 697E9C7F21A4ED6C00E03846 /* adaptive_mode_level_estimator_agc.cc in Sources */, 692AB8D81E6759DD00706ACC /* CongestionControl.cpp in Sources */, - 69A6DDCD1E95EC7700000E69 /* resample_by_2.c in Sources */, - 69A6DDE51E95EC7700000E69 /* aecm_core.cc in Sources */, - 69A6DDBA1E95EC7700000E69 /* filter_ma_fast_q12.c in Sources */, - 69A6DDE81E95EC7700000E69 /* aecm_core_neon.cc in Sources */, - 69A6DDBB1E95EC7700000E69 /* get_hanning_window.c in Sources */, - 69A6DDB51E95EC7700000E69 /* downsample_fast_neon.c in Sources */, + 697E9BE421A4ED6C00E03846 /* logging_webrtc.cc in Sources */, + 697E9D2F21A4ED6D00E03846 /* main_filter_update_gain.cc in Sources */, + 697E9C0A21A4ED6C00E03846 /* pitch_filter.c in Sources */, + 697E9CDB21A4ED6D00E03846 /* aecm_core_c.cc in Sources */, + 697E9C3421A4ED6C00E03846 /* circular_buffer.cc in Sources */, + 697E9B4B21A4ED6B00E03846 /* spl_sqrt_floor.c in Sources */, + 697E9D5521A4ED6D00E03846 /* pitch_internal.cc in Sources */, + 697E9CF621A4ED6D00E03846 /* fullband_erle_estimator.cc in Sources */, + 697E9C8821A4ED6C00E03846 /* limiter_db_gain_curve.cc in Sources */, + 697E9B4421A4ED6B00E03846 /* push_resampler.cc in Sources */, + 697E9B3D21A4ED6B00E03846 /* push_sinc_resampler.cc in Sources */, + 697E9C5921A4ED6C00E03846 /* audio_processing.cc in Sources */, + 697E9C4B21A4ED6C00E03846 /* typing_detection.cc in Sources */, + 697E9B6121A4ED6B00E03846 /* auto_corr_to_refl_coef.c in Sources */, + 697E9C2521A4ED6C00E03846 /* lpc_shape_swb12_tables.c in Sources */, + 697E9BA521A4ED6B00E03846 /* raw_logging.cc in Sources */, + 697E9D6E21A4ED6E00E03846 /* ooura_fft_neon.cc in Sources */, + 697E9C1521A4ED6C00E03846 /* encode.c in Sources */, + 697E9B5421A4ED6B00E03846 /* sparse_fir_filter.cc in Sources */, + 697E9B5721A4ED6B00E03846 /* fir_filter_c.cc in Sources */, + 697E9D0E21A4ED6D00E03846 /* reverb_model.cc in Sources */, + 697E9C7921A4ED6C00E03846 /* pitch_search.cc in Sources */, + 697E9B5C21A4ED6B00E03846 /* filter_ma_fast_q12.c in Sources */, 69015D941E9D848700AC9763 /* NetworkSocket.cpp in Sources */, - 69A6DDC41E95EC7700000E69 /* lpc_to_refl_coef.c in Sources */, - 69A6DDEC1E95EC7700000E69 /* analog_agc.c in Sources */, - 69A6DDA71E95EC7700000E69 /* ring_buffer.c in Sources */, + 697E9C8021A4ED6C00E03846 /* vector_float_frame.cc in Sources */, + 697E9C3921A4ED6C00E03846 /* gain_control_impl.cc in Sources */, + 697E9B7C21A4ED6B00E03846 /* real_fft.c in Sources */, + 697E9D0F21A4ED6D00E03846 /* cascaded_biquad_filter.cc in Sources */, + 697E9D4821A4ED6D00E03846 /* filter_analyzer.cc in Sources */, + 697E9D5921A4ED6E00E03846 /* vad_audio_proc.cc in Sources */, + 697E9D4321A4ED6D00E03846 /* comfort_noise_generator.cc in Sources */, + 697E9B2721A4ED6B00E03846 /* field_trial.cc in Sources */, + 697E9CFE21A4ED6D00E03846 /* render_delay_buffer.cc in Sources */, + 697E9C5A21A4ED6C00E03846 /* config.cc in Sources */, + 697E9D4721A4ED6D00E03846 /* shadow_filter_update_gain.cc in Sources */, + 697E9CA421A4ED6D00E03846 /* wpd_node.cc in Sources */, + 697E9D1521A4ED6D00E03846 /* render_signal_analyzer.cc in Sources */, + 697E9B5E21A4ED6B00E03846 /* levinson_durbin.c in Sources */, + 697E9D0321A4ED6D00E03846 /* adaptive_fir_filter.cc in Sources */, + 697E9B4A21A4ED6B00E03846 /* wav_file.cc in Sources */, + 697E9CE721A4ED6D00E03846 /* render_delay_buffer2.cc in Sources */, + 697E9C1121A4ED6C00E03846 /* lpc_gain_swb_tables.c in Sources */, + 697E9C3D21A4ED6C00E03846 /* noise_suppression_x.c in Sources */, + 697E9D6F21A4ED6E00E03846 /* block_mean_calculator.cc in Sources */, + 697E9CAB21A4ED6D00E03846 /* three_band_filter_bank.cc in Sources */, 692AB8FB1E6759DD00706ACC /* AudioOutputAudioUnit.cpp in Sources */, + 697E9B7821A4ED6B00E03846 /* refl_coef_to_lpc.c in Sources */, + 697E9B2921A4ED6B00E03846 /* cpu_features.cc in Sources */, + 697E9C1221A4ED6C00E03846 /* bandwidth_estimator.c in Sources */, + 697E9BB821A4ED6B00E03846 /* echo_canceller3_factory.cc in Sources */, + 697E9BF021A4ED6C00E03846 /* event_tracer.cc in Sources */, + 697E9D5021A4ED6D00E03846 /* apm_data_dumper.cc in Sources */, + 697E9B8521A4ED6B00E03846 /* spl_inl.c in Sources */, + 697E9D3A21A4ED6D00E03846 /* block_delay_buffer.cc in Sources */, + 697E9C6321A4ED6C00E03846 /* adaptive_agc.cc in Sources */, + 697E9D4D21A4ED6D00E03846 /* echo_control_mobile_impl.cc in Sources */, + 697E9D0D21A4ED6D00E03846 /* erle_estimator.cc in Sources */, + 697E9B9C21A4ED6B00E03846 /* bad_optional_access.cc in Sources */, + 697E9C4521A4ED6C00E03846 /* nsx_core_neon.c in Sources */, + 697E9B5121A4ED6B00E03846 /* real_fourier.cc in Sources */, + 697E9CB021A4ED6D00E03846 /* aec_core.cc in Sources */, + 697E9B6221A4ED6B00E03846 /* resample_by_2_internal.c in Sources */, + 697E9B6421A4ED6B00E03846 /* energy.c in Sources */, 692AB8EB1E6759DD00706ACC /* OpusDecoder.cpp in Sources */, + 697E9B8821A4ED6B00E03846 /* vad_sp.c in Sources */, + 697E9D2B21A4ED6D00E03846 /* reverb_decay_estimator.cc in Sources */, + 697E9C2321A4ED6C00E03846 /* arith_routines.c in Sources */, 692AB8E61E6759DD00706ACC /* JitterBuffer.cpp in Sources */, - 69A6DE1D1E95ECF000000E69 /* wav_header.cc in Sources */, - 69A6DDBC1E95EC7700000E69 /* get_scaling_square.c in Sources */, - 69A6DDDC1E95EC7700000E69 /* aec_core.cc in Sources */, + 697E9BFA21A4ED6C00E03846 /* fft.c in Sources */, + 697E9B3F21A4ED6B00E03846 /* resampler.cc in Sources */, + 697E9C3821A4ED6C00E03846 /* splitting_filter.cc in Sources */, + 697E9CF721A4ED6D00E03846 /* suppression_filter.cc in Sources */, + 697E9BB221A4ED6B00E03846 /* audio_frame.cc in Sources */, + 697E9C9321A4ED6D00E03846 /* signal_classifier.cc in Sources */, + 697E9C0621A4ED6C00E03846 /* transform.c in Sources */, + 697E9CB721A4ED6D00E03846 /* voice_detection_impl.cc in Sources */, 692AB9001E6759DD00706ACC /* TGLogWrapper.m in Sources */, - 69A6DDC71E95EC7700000E69 /* randomization_functions.c in Sources */, - 69A6DDD51E95EC7700000E69 /* spl_sqrt_floor_arm.S in Sources */, - 69A6DDAF1E95EC7700000E69 /* copy_set_operations.c in Sources */, + 697E9BEE21A4ED6C00E03846 /* event.cc in Sources */, + 697E9D2421A4ED6D00E03846 /* residual_echo_estimator.cc in Sources */, + 697E9CE621A4ED6D00E03846 /* matched_filter_lag_aggregator.cc in Sources */, + 697E9B9D21A4ED6B00E03846 /* optional.cc in Sources */, + 697E9CFD21A4ED6D00E03846 /* render_delay_controller_metrics.cc in Sources */, + 697E9C3521A4ED6C00E03846 /* mean_variance_estimator.cc in Sources */, + 697E9B9521A4ED6B00E03846 /* memutil.cc in Sources */, + 697E9BFE21A4ED6C00E03846 /* lpc_shape_swb16_tables.c in Sources */, + 697E9C6521A4ED6C00E03846 /* limiter.cc in Sources */, + 697E9B7521A4ED6B00E03846 /* resample.c in Sources */, 692AB8F91E6759DD00706ACC /* AudioInputAudioUnit.cpp in Sources */, - 69A6DDFC1E95EC7700000E69 /* nsx_core_c.c in Sources */, - 69A6DDE71E95EC7700000E69 /* aecm_core_c.cc in Sources */, - 69A6DDC61E95EC7700000E69 /* min_max_operations_neon.c in Sources */, - 69A6DDB01E95EC7700000E69 /* cross_correlation.c in Sources */, + 697E9D1921A4ED6D00E03846 /* subtractor_output_analyzer.cc in Sources */, + 697E9BD521A4ED6C00E03846 /* stringencode.cc in Sources */, + 697E9D5321A4ED6D00E03846 /* standalone_vad.cc in Sources */, + 697E9C0B21A4ED6C00E03846 /* encode_lpc_swb.c in Sources */, + 697E9CD121A4ED6D00E03846 /* gain_controller2.cc in Sources */, + 697E9BBC21A4ED6B00E03846 /* race_checker.cc in Sources */, + 697E9D3821A4ED6D00E03846 /* block_processor2.cc in Sources */, + 697E9BEB21A4ED6C00E03846 /* criticalsection.cc in Sources */, 69791A571EE8272A00BB85FB /* Resampler.cpp in Sources */, - 69A6DE0B1E95EC7800000E69 /* ooura_fft.cc in Sources */, - 69A6DDB21E95EC7700000E69 /* division_operations.c in Sources */, - 69A6DDCA1E95EC7700000E69 /* refl_coef_to_lpc.c in Sources */, - 69A6DDD21E95EC7700000E69 /* spl_inl.c in Sources */, - 69A6DDA21E95EC7700000E69 /* channel_buffer.cc in Sources */, - 69A6DDA91E95EC7700000E69 /* auto_corr_to_refl_coef.c in Sources */, - 69A6DDD01E95EC7700000E69 /* resample_fractional.c in Sources */, - 69A6DDCB1E95EC7700000E69 /* resample.c in Sources */, - 69A6DDD61E95EC7700000E69 /* splitting_filter_impl.c in Sources */, - 69A6DDEE1E95EC7700000E69 /* digital_agc.c in Sources */, - 69A6DDDE1E95EC7700000E69 /* aec_core_neon.cc in Sources */, - 69A6DDF81E95EC7700000E69 /* ns_core.c in Sources */, + 697E9B8221A4ED6B00E03846 /* resample_by_2.c in Sources */, + 697E9B3521A4ED6B00E03846 /* wav_header.cc in Sources */, + 697E9D5621A4ED6E00E03846 /* vad_circular_buffer.cc in Sources */, + 697E9CEB21A4ED6D00E03846 /* frame_blocker.cc in Sources */, + 697E9B7A21A4ED6B00E03846 /* vector_scaling_operations.c in Sources */, + 697E9BBE21A4ED6B00E03846 /* string_builder.cc in Sources */, + 697E9BC921A4ED6C00E03846 /* platform_file.cc in Sources */, + 697E9C0E21A4ED6C00E03846 /* lattice.c in Sources */, + 69DD8D03218CD401001E8140 /* VideoSource.cpp in Sources */, + 697E9CB421A4ED6D00E03846 /* aec_core_sse2.cc in Sources */, + 697E9B6721A4ED6B00E03846 /* filter_ar_fast_q12.c in Sources */, + 697E9CDC21A4ED6D00E03846 /* aecm_core_neon.cc in Sources */, + 697E9C5521A4ED6C00E03846 /* aec_dump.cc in Sources */, + 697E9D4B21A4ED6D00E03846 /* decimator.cc in Sources */, + 697E9C8521A4ED6C00E03846 /* fixed_gain_controller.cc in Sources */, 692AB8E91E6759DD00706ACC /* MediaStreamItf.cpp in Sources */, - 69A6DDE11E95EC7700000E69 /* aec_resampler.cc in Sources */, + 697E9CE221A4ED6D00E03846 /* reverb_model_fallback.cc in Sources */, + 697E9B8F21A4ED6B00E03846 /* vad_filterbank.c in Sources */, + 697E9C9121A4ED6D00E03846 /* down_sampler.cc in Sources */, + 697E9CA821A4ED6D00E03846 /* low_cut_filter.cc in Sources */, + 697E9C9A21A4ED6D00E03846 /* adaptive_mode_level_estimator.cc in Sources */, + 697E9C9521A4ED6D00E03846 /* compute_interpolated_gain_curve.cc in Sources */, + 697E9C1621A4ED6C00E03846 /* lpc_analysis.c in Sources */, + 697E9B8321A4ED6B00E03846 /* get_hanning_window.c in Sources */, + 697E9C0221A4ED6C00E03846 /* filterbanks.c in Sources */, + 697E9C5E21A4ED6C00E03846 /* agc2_common.cc in Sources */, + 697E9D0021A4ED6D00E03846 /* vector_buffer.cc in Sources */, + 697E9C0021A4ED6C00E03846 /* arith_routines_logist.c in Sources */, + 697E9B8A21A4ED6B00E03846 /* webrtc_vad.c in Sources */, + 697E9D0221A4ED6D00E03846 /* aec_state.cc in Sources */, + 697E9B3621A4ED6B00E03846 /* real_fourier_ooura.cc in Sources */, 692AB8DA1E6759DD00706ACC /* EchoCanceller.cpp in Sources */, - 69A6DDB71E95EC7700000E69 /* filter_ar.c in Sources */, - 69A6DE041E95EC7800000E69 /* block_mean_calculator.cc in Sources */, - 69A6DD9E1E95EC7700000E69 /* stringutils.cc in Sources */, - 69A6DE001E95EC7800000E69 /* splitting_filter.cc in Sources */, - 69A6DDC81E95EC7700000E69 /* real_fft.c in Sources */, - 69A6DDD11E95EC7700000E69 /* spl_init.c in Sources */, - 69A6DE061E95EC7800000E69 /* delay_estimator.cc in Sources */, - 69A6DDD41E95EC7700000E69 /* spl_sqrt_floor.c in Sources */, + 697E9C7B21A4ED6C00E03846 /* features_extraction.cc in Sources */, + 697E9D2C21A4ED6D00E03846 /* render_delay_controller2.cc in Sources */, + 697E9CB321A4ED6D00E03846 /* aec_core_neon.cc in Sources */, + 697E9D3921A4ED6D00E03846 /* echo_canceller3.cc in Sources */, + 697E9CF821A4ED6D00E03846 /* block_processor.cc in Sources */, + 697E9C5D21A4ED6C00E03846 /* interpolated_gain_curve.cc in Sources */, + 697E9C3E21A4ED6C00E03846 /* nsx_core_c.c in Sources */, + 697E9BE221A4ED6C00E03846 /* platform_thread.cc in Sources */, + 697E9B6621A4ED6B00E03846 /* downsample_fast.c in Sources */, + 697E9BEC21A4ED6C00E03846 /* platform_thread_types.cc in Sources */, + 697E9CB821A4ED6D00E03846 /* echo_cancellation_impl.cc in Sources */, + 697E9C2A21A4ED6C00E03846 /* pitch_lag_tables.c in Sources */, + 697E9C3321A4ED6C00E03846 /* moving_max.cc in Sources */, + 697E9BCB21A4ED6C00E03846 /* string_to_number.cc in Sources */, 6998617B2095292A00B68BEC /* PacketReassembler.cpp in Sources */, - 69A6DDB41E95EC7700000E69 /* downsample_fast.c in Sources */, - 69A6DDEA1E95EC7700000E69 /* echo_control_mobile.cc in Sources */, - 69A6DDF41E95EC7700000E69 /* noise_suppression.c in Sources */, + 697E9B8421A4ED6B00E03846 /* resample_48khz.c in Sources */, + 697E9D2721A4ED6D00E03846 /* matched_filter.cc in Sources */, + 697E9C4A21A4ED6C00E03846 /* audio_buffer.cc in Sources */, 69FB0B2D20F6860E00827817 /* MessageThread.cpp in Sources */, + 697E9B8621A4ED6B00E03846 /* spl_sqrt.c in Sources */, + 697E9BC121A4ED6B00E03846 /* aligned_malloc.cc in Sources */, + 697E9CD321A4ED6D00E03846 /* residual_echo_detector.cc in Sources */, + 697E9D0121A4ED6D00E03846 /* erl_estimator.cc in Sources */, + 697E9BD621A4ED6C00E03846 /* stringutils.cc in Sources */, + 697E9D6A21A4ED6E00E03846 /* delay_estimator_wrapper.cc in Sources */, 692AB8CF1E6759DD00706ACC /* BlockingQueue.cpp in Sources */, - 69A6DDC31E95EC7700000E69 /* levinson_durbin.c in Sources */, - 69A6DDF61E95EC7700000E69 /* noise_suppression_x.c in Sources */, - 69A6DE1B1E95ECF000000E69 /* wav_file.cc in Sources */, - 69A6DDCE1E95EC7700000E69 /* resample_by_2_internal.c in Sources */, 692AB8CB1E6759DD00706ACC /* AudioInput.cpp in Sources */, + 697E9B7621A4ED6B00E03846 /* cross_correlation_neon.c in Sources */, + 697E9C4121A4ED6C00E03846 /* ns_core.c in Sources */, 69E357B020F88955002E163B /* AudioIO.cpp in Sources */, - 69A6DDCC1E95EC7700000E69 /* resample_48khz.c in Sources */, - 69A6DDAC1E95EC7700000E69 /* complex_bit_reverse_arm.S in Sources */, - 69A6DDD81E95EC7700000E69 /* vector_scaling_operations.c in Sources */, - 69A6DE0D1E95EC7800000E69 /* ooura_fft_neon.cc in Sources */, + 697E9D3221A4ED6D00E03846 /* downsampled_render_buffer.cc in Sources */, + 69E629EE21AF62A900377D0F /* json11.cpp in Sources */, + 697E9D6B21A4ED6E00E03846 /* ooura_fft_sse2.cc in Sources */, + 697E9C6421A4ED6C00E03846 /* adaptive_digital_gain_applier.cc in Sources */, + 697E9C9421A4ED6D00E03846 /* noise_spectrum_estimator.cc in Sources */, + 697E9BCF21A4ED6C00E03846 /* thread_checker_impl.cc in Sources */, + 697E9D6321A4ED6E00E03846 /* gmm.cc in Sources */, + 697E9CAA21A4ED6D00E03846 /* level_estimator_impl.cc in Sources */, + 697E9D3021A4ED6D00E03846 /* echo_remover.cc in Sources */, + 697E9C8721A4ED6C00E03846 /* vad_with_level.cc in Sources */, + 697E9B3721A4ED6B00E03846 /* fir_filter_neon.cc in Sources */, + 697E9C4621A4ED6C00E03846 /* noise_suppression.c in Sources */, + 697E9C2E21A4ED6C00E03846 /* rms_level.cc in Sources */, + 697E9B6821A4ED6B00E03846 /* spl_init.c in Sources */, + 697E9B7721A4ED6B00E03846 /* min_max_operations.c in Sources */, + 697E9D2E21A4ED6D00E03846 /* suppression_gain_limiter.cc in Sources */, + 697E9C8221A4ED6C00E03846 /* noise_level_estimator.cc in Sources */, + 697E9B8121A4ED6B00E03846 /* copy_set_operations.c in Sources */, + 697E9B6021A4ED6B00E03846 /* dot_product_with_scale.cc in Sources */, + 697E9B5D21A4ED6B00E03846 /* splitting_filter1.c in Sources */, + 697E9C3C21A4ED6C00E03846 /* nsx_core.c in Sources */, + 697E9C3221A4ED6C00E03846 /* normalized_covariance_estimator.cc in Sources */, + 697E9B5F21A4ED6B00E03846 /* downsample_fast_neon.c in Sources */, + 697E9D2321A4ED6D00E03846 /* aec3_common.cc in Sources */, + 697E9D1121A4ED6D00E03846 /* render_buffer.cc in Sources */, + 697E9B7B21A4ED6B00E03846 /* resample_fractional.c in Sources */, + 697E9D3421A4ED6D00E03846 /* matrix_buffer.cc in Sources */, + 697E9C8421A4ED6C00E03846 /* fixed_digital_level_estimator.cc in Sources */, + 697E9BFF21A4ED6C00E03846 /* pitch_gain_tables.c in Sources */, + 697E9CA621A4ED6D00E03846 /* transient_detector.cc in Sources */, + 697E9D1421A4ED6D00E03846 /* stationarity_estimator.cc in Sources */, + 697E9C2421A4ED6C00E03846 /* crc.c in Sources */, + 697E9BC321A4ED6B00E03846 /* timeutils.cc in Sources */, + 697E9B9621A4ED6B00E03846 /* string_view.cc in Sources */, 692AB8FD1E6759DD00706ACC /* AudioUnitIO.cpp in Sources */, + 697E9D0C21A4ED6D00E03846 /* block_framer.cc in Sources */, + 697E9B6A21A4ED6B00E03846 /* cross_correlation.c in Sources */, + 697E9D0921A4ED6D00E03846 /* echo_path_delay_estimator.cc in Sources */, 69986177209526D400B68BEC /* Buffers.cpp in Sources */, - 69A6DDB31E95EC7700000E69 /* dot_product_with_scale.c in Sources */, - 69A6DDB91E95EC7700000E69 /* filter_ar_fast_q12_armv7.S in Sources */, - 69A6DDAA1E95EC7700000E69 /* auto_correlation.c in Sources */, - 69A6DDFD1E95EC7700000E69 /* nsx_core_neon.c in Sources */, - 69A6DDE01E95EC7700000E69 /* aec_core_sse2.cc in Sources */, - 69A6DDBD1E95EC7700000E69 /* ilbc_specific_functions.c in Sources */, - 69A6DE0E1E95EC7800000E69 /* ooura_fft_sse2.cc in Sources */, + 697E9B2C21A4ED6B00E03846 /* window_generator.cc in Sources */, + 697E9C0F21A4ED6C00E03846 /* intialize.c in Sources */, 692AB8CD1E6759DD00706ACC /* AudioOutput.cpp in Sources */, - 69A6DE151E95EC7800000E69 /* cpu_features.cc in Sources */, - 69A6DE021E95EC7800000E69 /* three_band_filter_bank.cc in Sources */, - 69A6DDB81E95EC7700000E69 /* filter_ar_fast_q12.c in Sources */, - 69A6DE091E95EC7800000E69 /* delay_estimator_wrapper.cc in Sources */, + 697E9CC221A4ED6D00E03846 /* utility.cc in Sources */, + 697E9B4621A4ED6B00E03846 /* sinc_resampler.cc in Sources */, + 697E9B7021A4ED6B00E03846 /* auto_correlation.c in Sources */, + 697E9B7121A4ED6B00E03846 /* get_scaling_square.c in Sources */, + 697E9D5221A4ED6D00E03846 /* voice_activity_detector.cc in Sources */, + 697E9D2221A4ED6D00E03846 /* reverb_model_estimator.cc in Sources */, + 697E9BA621A4ED6B00E03846 /* throw_delegate.cc in Sources */, + 697E9D6821A4ED6E00E03846 /* ooura_fft.cc in Sources */, + 697E9B7F21A4ED6B00E03846 /* randomization_functions.c in Sources */, + 697E9CE521A4ED6D00E03846 /* echo_remover_metrics.cc in Sources */, + 697E9CBA21A4ED6D00E03846 /* agc.cc in Sources */, + 697E9C9B21A4ED6D00E03846 /* moving_moments.cc in Sources */, + 697E9D7321A4ED6E00E03846 /* rnn_vad_weights.cc in Sources */, + 697E9C5421A4ED6C00E03846 /* audio_generator_factory.cc in Sources */, + 697E9CC121A4ED6D00E03846 /* digital_agc.c in Sources */, + 697E9B2D21A4ED6B00E03846 /* channel_buffer.cc in Sources */, + 697E9BB621A4ED6B00E03846 /* echo_canceller3_config.cc in Sources */, 692AB8ED1E6759DD00706ACC /* OpusEncoder.cpp in Sources */, - 69A6DDAB1E95EC7700000E69 /* complex_bit_reverse.c in Sources */, - 69A6DDD91E95EC7700000E69 /* sparse_fir_filter.cc in Sources */, + 697E9B7E21A4ED6B00E03846 /* complex_bit_reverse.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1325,6 +2895,9 @@ "-DWEBRTC_APM_DEBUG_DUMP=0", "-DWEBRTC_POSIX", "-DTGVOIP_HAVE_TGLOG", + "-DWEBRTC_NS_FLOAT", + "-DWEBRTC_IOS", + "-DWEBRTC_HAS_NEON", ); PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1361,6 +2934,9 @@ "-DWEBRTC_APM_DEBUG_DUMP=0", "-DWEBRTC_POSIX", "-DTGVOIP_HAVE_TGLOG", + "-DWEBRTC_NS_FLOAT", + "-DWEBRTC_IOS", + "-DWEBRTC_HAS_NEON", ); PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1368,7 +2944,7 @@ }; name = Release; }; - D00ACA51202234510045D427 /* Debug Hockeyapp */ = { + D00ACA51202234510045D427 /* DebugHockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1417,9 +2993,9 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = "Debug Hockeyapp"; + name = DebugHockeyapp; }; - D00ACA52202234510045D427 /* Debug Hockeyapp */ = { + D00ACA52202234510045D427 /* DebugHockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; @@ -1448,14 +3024,17 @@ "-DWEBRTC_APM_DEBUG_DUMP=0", "-DWEBRTC_POSIX", "-DTGVOIP_HAVE_TGLOG", + "-DWEBRTC_NS_FLOAT", + "-DWEBRTC_IOS", + "-DWEBRTC_HAS_NEON", ); PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; - name = "Debug Hockeyapp"; + name = DebugHockeyapp; }; - D00ACA532022347C0045D427 /* Release Hockeyapp */ = { + D00ACA532022347C0045D427 /* ReleaseHockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1498,9 +3077,9 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = "Release Hockeyapp"; + name = ReleaseHockeyapp; }; - D00ACA542022347C0045D427 /* Release Hockeyapp */ = { + D00ACA542022347C0045D427 /* ReleaseHockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; @@ -1529,14 +3108,17 @@ "-DWEBRTC_APM_DEBUG_DUMP=0", "-DWEBRTC_POSIX", "-DTGVOIP_HAVE_TGLOG", + "-DWEBRTC_NS_FLOAT", + "-DWEBRTC_IOS", + "-DWEBRTC_HAS_NEON", ); PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; - name = "Release Hockeyapp"; + name = ReleaseHockeyapp; }; - D00ACA55202234840045D427 /* Release Hockeyapp Internal */ = { + D00ACA55202234840045D427 /* ReleaseHockeyappInternal */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1579,9 +3161,9 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = "Release Hockeyapp Internal"; + name = ReleaseHockeyappInternal; }; - D00ACA56202234840045D427 /* Release Hockeyapp Internal */ = { + D00ACA56202234840045D427 /* ReleaseHockeyappInternal */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; @@ -1610,14 +3192,17 @@ "-DWEBRTC_APM_DEBUG_DUMP=0", "-DWEBRTC_POSIX", "-DTGVOIP_HAVE_TGLOG", + "-DWEBRTC_NS_FLOAT", + "-DWEBRTC_IOS", + "-DWEBRTC_HAS_NEON", ); PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; - name = "Release Hockeyapp Internal"; + name = ReleaseHockeyappInternal; }; - D00ACA5B2022A70D0045D427 /* Release AppStore */ = { + D00ACA5B2022A70D0045D427 /* ReleaseAppStore */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1660,9 +3245,99 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = "Release AppStore"; + name = ReleaseAppStore; + }; + D00ACA5C2022A70D0045D427 /* ReleaseAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(PROJECT_DIR)/../../Telegraph/thirdparty/opus/include/opus", + "$(inherited)", + "$(PROJECT_DIR)/../../Telegraph", + webrtc_dsp, + "$(PROJECT_DIR)/../TelegramUI/third-party/opus/include/opus", + ); + INFOPLIST_FILE = "$(SRCROOT)/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.6; + OTHER_CFLAGS = ( + "-DTGVOIP_USE_CUSTOM_CRYPTO", + "-DWEBRTC_APM_DEBUG_DUMP=0", + "-DWEBRTC_POSIX", + "-DTGVOIP_HAVE_TGLOG", + "-DWEBRTC_NS_FLOAT", + "-DWEBRTC_IOS", + "-DWEBRTC_HAS_NEON", + ); + PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = ReleaseAppStore; + }; + D021D50E219CB21A0064BEBA /* DebugFork */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugFork; }; - D00ACA5C2022A70D0045D427 /* Release AppStore */ = { + D021D50F219CB21A0064BEBA /* DebugFork */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; @@ -1691,14 +3366,17 @@ "-DWEBRTC_APM_DEBUG_DUMP=0", "-DWEBRTC_POSIX", "-DTGVOIP_HAVE_TGLOG", + "-DWEBRTC_NS_FLOAT", + "-DWEBRTC_IOS", + "-DWEBRTC_HAS_NEON", ); PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; - name = "Release AppStore"; + name = DebugFork; }; - D04D01C31E678C0D0086DDC0 /* Debug AppStore */ = { + D04D01C31E678C0D0086DDC0 /* DebugAppStore */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1747,9 +3425,9 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = "Debug AppStore"; + name = DebugAppStore; }; - D04D01C41E678C0D0086DDC0 /* Debug AppStore */ = { + D04D01C41E678C0D0086DDC0 /* DebugAppStore */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; @@ -1778,12 +3456,15 @@ "-DWEBRTC_APM_DEBUG_DUMP=0", "-DWEBRTC_POSIX", "-DTGVOIP_HAVE_TGLOG", + "-DWEBRTC_NS_FLOAT", + "-DWEBRTC_IOS", + "-DWEBRTC_HAS_NEON", ); PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; - name = "Debug AppStore"; + name = DebugAppStore; }; D04D01CB1E678C230086DDC0 /* Hockeyapp */ = { isa = XCBuildConfiguration; @@ -1859,6 +3540,9 @@ "-DWEBRTC_APM_DEBUG_DUMP=0", "-DWEBRTC_POSIX", "-DTGVOIP_HAVE_TGLOG", + "-DWEBRTC_NS_FLOAT", + "-DWEBRTC_IOS", + "-DWEBRTC_HAS_NEON", ); PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1946,6 +3630,180 @@ }; name = "Release Hockeyapp"; }; + D0ADF946212B3AF400310BBC /* DebugAppStoreLLC */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugAppStoreLLC; + }; + D0ADF947212B3AF400310BBC /* DebugAppStoreLLC */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(PROJECT_DIR)/../../Telegraph/thirdparty/opus/include/opus", + "$(inherited)", + "$(PROJECT_DIR)/../../Telegraph", + webrtc_dsp, + "$(PROJECT_DIR)/../TelegramUI/third-party/opus/include/opus", + ); + INFOPLIST_FILE = "$(SRCROOT)/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.6; + OTHER_CFLAGS = ( + "-DTGVOIP_USE_CUSTOM_CRYPTO", + "-DWEBRTC_APM_DEBUG_DUMP=0", + "-DWEBRTC_POSIX", + "-DTGVOIP_HAVE_TGLOG", + "-DWEBRTC_NS_FLOAT", + "-DWEBRTC_IOS", + "-DWEBRTC_HAS_NEON", + ); + PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = DebugAppStoreLLC; + }; + D0CE6F00213DC31900BCD44B /* ReleaseAppStoreLLC */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseAppStoreLLC; + }; + D0CE6F01213DC31900BCD44B /* ReleaseAppStoreLLC */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(PROJECT_DIR)/../../Telegraph/thirdparty/opus/include/opus", + "$(inherited)", + "$(PROJECT_DIR)/../../Telegraph", + webrtc_dsp, + "$(PROJECT_DIR)/../TelegramUI/third-party/opus/include/opus", + ); + INFOPLIST_FILE = "$(SRCROOT)/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.6; + OTHER_CFLAGS = ( + "-DTGVOIP_USE_CUSTOM_CRYPTO", + "-DWEBRTC_APM_DEBUG_DUMP=0", + "-DWEBRTC_POSIX", + "-DTGVOIP_HAVE_TGLOG", + "-DWEBRTC_NS_FLOAT", + "-DWEBRTC_IOS", + "-DWEBRTC_HAS_NEON", + ); + PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = ReleaseAppStoreLLC; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1953,12 +3811,15 @@ isa = XCConfigurationList; buildConfigurations = ( 69F8423C1E67540700C110F7 /* Debug */, - D00ACA51202234510045D427 /* Debug Hockeyapp */, - D04D01C31E678C0D0086DDC0 /* Debug AppStore */, + D00ACA51202234510045D427 /* DebugHockeyapp */, + D021D50E219CB21A0064BEBA /* DebugFork */, + D04D01C31E678C0D0086DDC0 /* DebugAppStore */, + D0ADF946212B3AF400310BBC /* DebugAppStoreLLC */, 69F8423D1E67540700C110F7 /* Release */, - D00ACA5B2022A70D0045D427 /* Release AppStore */, - D00ACA532022347C0045D427 /* Release Hockeyapp */, - D00ACA55202234840045D427 /* Release Hockeyapp Internal */, + D00ACA5B2022A70D0045D427 /* ReleaseAppStore */, + D0CE6F00213DC31900BCD44B /* ReleaseAppStoreLLC */, + D00ACA532022347C0045D427 /* ReleaseHockeyapp */, + D00ACA55202234840045D427 /* ReleaseHockeyappInternal */, D04D01CB1E678C230086DDC0 /* Hockeyapp */, D077B8DF1F45EA870046D27A /* Release Hockeyapp */, ); @@ -1969,12 +3830,15 @@ isa = XCConfigurationList; buildConfigurations = ( 69F8423F1E67540700C110F7 /* Debug */, - D00ACA52202234510045D427 /* Debug Hockeyapp */, - D04D01C41E678C0D0086DDC0 /* Debug AppStore */, + D00ACA52202234510045D427 /* DebugHockeyapp */, + D021D50F219CB21A0064BEBA /* DebugFork */, + D04D01C41E678C0D0086DDC0 /* DebugAppStore */, + D0ADF947212B3AF400310BBC /* DebugAppStoreLLC */, 69F842401E67540700C110F7 /* Release */, - D00ACA5C2022A70D0045D427 /* Release AppStore */, - D00ACA542022347C0045D427 /* Release Hockeyapp */, - D00ACA56202234840045D427 /* Release Hockeyapp Internal */, + D00ACA5C2022A70D0045D427 /* ReleaseAppStore */, + D0CE6F01213DC31900BCD44B /* ReleaseAppStoreLLC */, + D00ACA542022347C0045D427 /* ReleaseHockeyapp */, + D00ACA56202234840045D427 /* ReleaseHockeyappInternal */, D04D01CC1E678C230086DDC0 /* Hockeyapp */, D077B8E01F45EA870046D27A /* Release Hockeyapp */, ); diff --git a/libtgvoip/libtgvoip_osx.xcodeproj/project.pbxproj b/libtgvoip/libtgvoip_osx.xcodeproj/project.pbxproj index 9bd25ab..ae7976e 100644 --- a/libtgvoip/libtgvoip_osx.xcodeproj/project.pbxproj +++ b/libtgvoip/libtgvoip_osx.xcodeproj/project.pbxproj @@ -8,34 +8,296 @@ /* Begin PBXBuildFile section */ 690725BE1EBBD5DE005D860B /* NetworkSocketPosix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 690725BC1EBBD5DE005D860B /* NetworkSocketPosix.cpp */; }; - 690725BF1EBBD5DE005D860B /* NetworkSocketPosix.h in Headers */ = {isa = PBXBuildFile; fileRef = 690725BD1EBBD5DE005D860B /* NetworkSocketPosix.h */; }; 690725C21EBBD5F2005D860B /* NetworkSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 690725C01EBBD5F2005D860B /* NetworkSocket.cpp */; }; - 690725C31EBBD5F2005D860B /* NetworkSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 690725C11EBBD5F2005D860B /* NetworkSocket.h */; }; 6915307B1E6B5BAB004F643F /* logging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6915307A1E6B5BAB004F643F /* logging.cpp */; }; + 691E05C921A4FD7600F838EF /* memutil.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E033321A4FD7500F838EF /* memutil.cc */; }; + 691E05CA21A4FD7600F838EF /* string_view.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E033421A4FD7500F838EF /* string_view.cc */; }; + 691E05CC21A4FD7600F838EF /* ascii.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E033621A4FD7500F838EF /* ascii.cc */; }; + 691E05D021A4FD7600F838EF /* bad_optional_access.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E033B21A4FD7500F838EF /* bad_optional_access.cc */; }; + 691E05D121A4FD7600F838EF /* optional.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E033C21A4FD7500F838EF /* optional.cc */; }; + 691E05D921A4FD7600F838EF /* raw_logging.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E034A21A4FD7500F838EF /* raw_logging.cc */; }; + 691E05DA21A4FD7600F838EF /* throw_delegate.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E034B21A4FD7500F838EF /* throw_delegate.cc */; }; + 691E05E821A4FD7600F838EF /* window_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E035C21A4FD7500F838EF /* window_generator.cc */; }; + 691E05E921A4FD7600F838EF /* channel_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E035D21A4FD7500F838EF /* channel_buffer.cc */; }; + 691E05EA21A4FD7600F838EF /* fir_filter_factory.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E035E21A4FD7500F838EF /* fir_filter_factory.cc */; }; + 691E05F121A4FD7600F838EF /* wav_header.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E036621A4FD7500F838EF /* wav_header.cc */; }; + 691E05F221A4FD7600F838EF /* real_fourier_ooura.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E036721A4FD7500F838EF /* real_fourier_ooura.cc */; }; + 691E05F321A4FD7600F838EF /* fir_filter_neon.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E036821A4FD7500F838EF /* fir_filter_neon.cc */; }; + 691E05F421A4FD7600F838EF /* audio_util.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E036921A4FD7500F838EF /* audio_util.cc */; }; + 691E05F621A4FD7600F838EF /* fir_filter_sse.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E036B21A4FD7500F838EF /* fir_filter_sse.cc */; }; + 691E05F821A4FD7600F838EF /* sinc_resampler_neon.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E036E21A4FD7500F838EF /* sinc_resampler_neon.cc */; }; + 691E05F921A4FD7600F838EF /* push_sinc_resampler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E036F21A4FD7500F838EF /* push_sinc_resampler.cc */; }; + 691E05FB21A4FD7600F838EF /* resampler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E037121A4FD7500F838EF /* resampler.cc */; }; + 691E05FC21A4FD7600F838EF /* sinc_resampler_sse.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E037221A4FD7500F838EF /* sinc_resampler_sse.cc */; }; + 691E060021A4FD7600F838EF /* push_resampler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E037721A4FD7500F838EF /* push_resampler.cc */; }; + 691E060221A4FD7600F838EF /* sinc_resampler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E037921A4FD7500F838EF /* sinc_resampler.cc */; }; + 691E060321A4FD7600F838EF /* sinusoidal_linear_chirp_source.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E037A21A4FD7500F838EF /* sinusoidal_linear_chirp_source.cc */; }; + 691E060621A4FD7600F838EF /* wav_file.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E037D21A4FD7500F838EF /* wav_file.cc */; }; + 691E060721A4FD7600F838EF /* spl_sqrt_floor.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E038021A4FD7500F838EF /* spl_sqrt_floor.c */; }; + 691E060A21A4FD7600F838EF /* fft4g.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E038421A4FD7500F838EF /* fft4g.c */; }; + 691E060C21A4FD7600F838EF /* audio_converter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E038621A4FD7500F838EF /* audio_converter.cc */; }; + 691E060D21A4FD7600F838EF /* real_fourier.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E038721A4FD7500F838EF /* real_fourier.cc */; }; + 691E061021A4FD7600F838EF /* sparse_fir_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E038A21A4FD7500F838EF /* sparse_fir_filter.cc */; }; + 691E061221A4FD7600F838EF /* smoothing_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E038C21A4FD7500F838EF /* smoothing_filter.cc */; }; + 691E061321A4FD7600F838EF /* fir_filter_c.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E038D21A4FD7500F838EF /* fir_filter_c.cc */; }; + 691E061421A4FD7600F838EF /* ring_buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E038E21A4FD7500F838EF /* ring_buffer.c */; }; + 691E061721A4FD7600F838EF /* complex_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E039221A4FD7500F838EF /* complex_fft.c */; }; + 691E061821A4FD7600F838EF /* filter_ma_fast_q12.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E039321A4FD7500F838EF /* filter_ma_fast_q12.c */; }; + 691E061921A4FD7600F838EF /* splitting_filter1.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E039421A4FD7500F838EF /* splitting_filter1.c */; }; + 691E061A21A4FD7600F838EF /* levinson_durbin.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E039521A4FD7500F838EF /* levinson_durbin.c */; }; + 691E061B21A4FD7600F838EF /* downsample_fast_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E039621A4FD7500F838EF /* downsample_fast_neon.c */; }; + 691E061C21A4FD7600F838EF /* dot_product_with_scale.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E039721A4FD7500F838EF /* dot_product_with_scale.cc */; }; + 691E061D21A4FD7600F838EF /* auto_corr_to_refl_coef.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E039821A4FD7500F838EF /* auto_corr_to_refl_coef.c */; }; + 691E061E21A4FD7600F838EF /* resample_by_2_internal.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E039921A4FD7500F838EF /* resample_by_2_internal.c */; }; + 691E062021A4FD7600F838EF /* energy.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E039B21A4FD7500F838EF /* energy.c */; }; + 691E062121A4FD7600F838EF /* sqrt_of_one_minus_x_squared.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E039C21A4FD7500F838EF /* sqrt_of_one_minus_x_squared.c */; }; + 691E062221A4FD7600F838EF /* downsample_fast.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E039D21A4FD7500F838EF /* downsample_fast.c */; }; + 691E062321A4FD7600F838EF /* filter_ar_fast_q12.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E039E21A4FD7500F838EF /* filter_ar_fast_q12.c */; }; + 691E062421A4FD7600F838EF /* spl_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E039F21A4FD7500F838EF /* spl_init.c */; }; + 691E062521A4FD7600F838EF /* lpc_to_refl_coef.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03A021A4FD7500F838EF /* lpc_to_refl_coef.c */; }; + 691E062621A4FD7600F838EF /* cross_correlation.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03A121A4FD7500F838EF /* cross_correlation.c */; }; + 691E062B21A4FD7600F838EF /* division_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03A721A4FD7500F838EF /* division_operations.c */; }; + 691E062C21A4FD7600F838EF /* auto_correlation.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03A821A4FD7500F838EF /* auto_correlation.c */; }; + 691E062D21A4FD7600F838EF /* get_scaling_square.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03A921A4FD7500F838EF /* get_scaling_square.c */; }; + 691E062E21A4FD7600F838EF /* min_max_operations_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03AA21A4FD7500F838EF /* min_max_operations_neon.c */; }; + 691E063121A4FD7600F838EF /* resample.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03AD21A4FD7500F838EF /* resample.c */; }; + 691E063221A4FD7600F838EF /* cross_correlation_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03AE21A4FD7500F838EF /* cross_correlation_neon.c */; }; + 691E063321A4FD7600F838EF /* min_max_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03AF21A4FD7500F838EF /* min_max_operations.c */; }; + 691E063421A4FD7600F838EF /* refl_coef_to_lpc.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03B021A4FD7500F838EF /* refl_coef_to_lpc.c */; }; + 691E063521A4FD7600F838EF /* filter_ar.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03B121A4FD7500F838EF /* filter_ar.c */; }; + 691E063621A4FD7600F838EF /* vector_scaling_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03B221A4FD7500F838EF /* vector_scaling_operations.c */; }; + 691E063721A4FD7600F838EF /* resample_fractional.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03B321A4FD7500F838EF /* resample_fractional.c */; }; + 691E063821A4FD7600F838EF /* real_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03B421A4FD7500F838EF /* real_fft.c */; }; + 691E063921A4FD7600F838EF /* ilbc_specific_functions.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03B521A4FD7500F838EF /* ilbc_specific_functions.c */; }; + 691E063A21A4FD7600F838EF /* complex_bit_reverse.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03B621A4FD7500F838EF /* complex_bit_reverse.c */; }; + 691E063B21A4FD7600F838EF /* randomization_functions.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03B721A4FD7500F838EF /* randomization_functions.c */; }; + 691E063D21A4FD7600F838EF /* copy_set_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03B921A4FD7500F838EF /* copy_set_operations.c */; }; + 691E063E21A4FD7600F838EF /* resample_by_2.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03BA21A4FD7500F838EF /* resample_by_2.c */; }; + 691E063F21A4FD7600F838EF /* get_hanning_window.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03BB21A4FD7500F838EF /* get_hanning_window.c */; }; + 691E064021A4FD7600F838EF /* resample_48khz.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03BC21A4FD7500F838EF /* resample_48khz.c */; }; + 691E064121A4FD7600F838EF /* spl_inl.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03BD21A4FD7500F838EF /* spl_inl.c */; }; + 691E064221A4FD7600F838EF /* spl_sqrt.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03BE21A4FD7500F838EF /* spl_sqrt.c */; }; + 691E064421A4FD7600F838EF /* vad_sp.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03C121A4FD7500F838EF /* vad_sp.c */; }; + 691E064521A4FD7600F838EF /* vad.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E03C221A4FD7500F838EF /* vad.cc */; }; + 691E064621A4FD7600F838EF /* webrtc_vad.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03C321A4FD7500F838EF /* webrtc_vad.c */; }; + 691E064B21A4FD7600F838EF /* vad_filterbank.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03C921A4FD7500F838EF /* vad_filterbank.c */; }; + 691E064C21A4FD7600F838EF /* vad_core.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03CA21A4FD7500F838EF /* vad_core.c */; }; + 691E064F21A4FD7600F838EF /* vad_gmm.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03CD21A4FD7500F838EF /* vad_gmm.c */; }; + 691E065021A4FD7600F838EF /* audio_frame.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E03D021A4FD7500F838EF /* audio_frame.cc */; }; + 691E065421A4FD7600F838EF /* echo_canceller3_config.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E03D421A4FD7500F838EF /* echo_canceller3_config.cc */; }; + 691E065621A4FD7600F838EF /* echo_canceller3_factory.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E03D621A4FD7500F838EF /* echo_canceller3_factory.cc */; }; + 691E065821A4FD7600F838EF /* rnn_vad_weights.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E03DB21A4FD7500F838EF /* rnn_vad_weights.cc */; }; + 691E065B21A4FD7600F838EF /* kiss_fft.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E03DE21A4FD7500F838EF /* kiss_fft.cc */; }; + 691E066221A4FD7600F838EF /* field_trial.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E03E821A4FD7500F838EF /* field_trial.cc */; }; + 691E066321A4FD7600F838EF /* metrics.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E03E921A4FD7500F838EF /* metrics.cc */; }; + 691E066421A4FD7600F838EF /* cpu_features.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E03EA21A4FD7500F838EF /* cpu_features.cc */; }; + 691E066621A4FD7600F838EF /* fft.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03EF21A4FD7500F838EF /* fft.c */; }; + 691E066921A4FD7600F838EF /* pitch_estimator.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03F821A4FD7500F838EF /* pitch_estimator.c */; }; + 691E066A21A4FD7600F838EF /* lpc_shape_swb16_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03F921A4FD7500F838EF /* lpc_shape_swb16_tables.c */; }; + 691E066B21A4FD7600F838EF /* pitch_gain_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03FA21A4FD7500F838EF /* pitch_gain_tables.c */; }; + 691E066C21A4FD7600F838EF /* arith_routines_logist.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03FB21A4FD7500F838EF /* arith_routines_logist.c */; }; + 691E066E21A4FD7600F838EF /* filterbanks.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E03FD21A4FD7500F838EF /* filterbanks.c */; }; + 691E067221A4FD7600F838EF /* transform.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E040121A4FD7500F838EF /* transform.c */; }; + 691E067621A4FD7600F838EF /* pitch_filter.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E040521A4FD7500F838EF /* pitch_filter.c */; }; + 691E067721A4FD7600F838EF /* encode_lpc_swb.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E040621A4FD7500F838EF /* encode_lpc_swb.c */; }; + 691E067821A4FD7600F838EF /* filter_functions.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E040721A4FD7500F838EF /* filter_functions.c */; }; + 691E067921A4FD7600F838EF /* decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E040821A4FD7500F838EF /* decode.c */; }; + 691E067A21A4FD7600F838EF /* lattice.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E040921A4FD7500F838EF /* lattice.c */; }; + 691E067B21A4FD7600F838EF /* intialize.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E040A21A4FD7500F838EF /* intialize.c */; }; + 691E067C21A4FD7600F838EF /* lpc_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E040B21A4FD7500F838EF /* lpc_tables.c */; }; + 691E067D21A4FD7600F838EF /* lpc_gain_swb_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E040C21A4FD7500F838EF /* lpc_gain_swb_tables.c */; }; + 691E067E21A4FD7600F838EF /* bandwidth_estimator.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E040D21A4FD7500F838EF /* bandwidth_estimator.c */; }; + 691E068121A4FD7600F838EF /* encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E041021A4FD7500F838EF /* encode.c */; }; + 691E068221A4FD7600F838EF /* lpc_analysis.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E041121A4FD7500F838EF /* lpc_analysis.c */; }; + 691E068421A4FD7600F838EF /* arith_routines_hist.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E041321A4FD7500F838EF /* arith_routines_hist.c */; }; + 691E068921A4FD7600F838EF /* entropy_coding.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E041821A4FD7500F838EF /* entropy_coding.c */; }; + 691E068A21A4FD7600F838EF /* isac_vad.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E041921A4FD7500F838EF /* isac_vad.c */; }; + 691E068F21A4FD7600F838EF /* arith_routines.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E041E21A4FD7500F838EF /* arith_routines.c */; }; + 691E069021A4FD7600F838EF /* crc.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E041F21A4FD7500F838EF /* crc.c */; }; + 691E069121A4FD7600F838EF /* lpc_shape_swb12_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E042021A4FD7500F838EF /* lpc_shape_swb12_tables.c */; }; + 691E069321A4FD7600F838EF /* decode_bwe.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E042221A4FD7500F838EF /* decode_bwe.c */; }; + 691E069421A4FD7600F838EF /* spectrum_ar_model_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E042321A4FD7500F838EF /* spectrum_ar_model_tables.c */; }; + 691E069621A4FD7600F838EF /* pitch_lag_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E042521A4FD7500F838EF /* pitch_lag_tables.c */; }; + 691E069721A4FD7600F838EF /* isac.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E042621A4FD7500F838EF /* isac.c */; }; + 691E069A21A4FD7600F838EF /* rms_level.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E042A21A4FD7500F838EF /* rms_level.cc */; }; + 691E069E21A4FD7600F838EF /* normalized_covariance_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E042F21A4FD7600F838EF /* normalized_covariance_estimator.cc */; }; + 691E069F21A4FD7600F838EF /* moving_max.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E043021A4FD7600F838EF /* moving_max.cc */; }; + 691E06A021A4FD7600F838EF /* circular_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E043121A4FD7600F838EF /* circular_buffer.cc */; }; + 691E06A121A4FD7600F838EF /* mean_variance_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E043221A4FD7600F838EF /* mean_variance_estimator.cc */; }; + 691E06A421A4FD7600F838EF /* splitting_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E043521A4FD7600F838EF /* splitting_filter.cc */; }; + 691E06A521A4FD7600F838EF /* gain_control_impl.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E043621A4FD7600F838EF /* gain_control_impl.cc */; }; + 691E06A821A4FD7600F838EF /* nsx_core.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E043E21A4FD7600F838EF /* nsx_core.c */; }; + 691E06A921A4FD7600F838EF /* noise_suppression_x.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E043F21A4FD7600F838EF /* noise_suppression_x.c */; }; + 691E06AA21A4FD7600F838EF /* nsx_core_c.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E044021A4FD7600F838EF /* nsx_core_c.c */; }; + 691E06AD21A4FD7600F838EF /* ns_core.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E044321A4FD7600F838EF /* ns_core.c */; }; + 691E06B121A4FD7600F838EF /* nsx_core_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E044721A4FD7600F838EF /* nsx_core_neon.c */; }; + 691E06B221A4FD7600F838EF /* noise_suppression.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E044821A4FD7600F838EF /* noise_suppression.c */; }; + 691E06B621A4FD7600F838EF /* audio_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E044C21A4FD7600F838EF /* audio_buffer.cc */; }; + 691E06B721A4FD7600F838EF /* typing_detection.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E044D21A4FD7600F838EF /* typing_detection.cc */; }; + 691E06BF21A4FD7600F838EF /* audio_processing_statistics.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E045721A4FD7600F838EF /* audio_processing_statistics.cc */; }; + 691E06C021A4FD7600F838EF /* audio_generator_factory.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E045821A4FD7600F838EF /* audio_generator_factory.cc */; }; + 691E06C121A4FD7600F838EF /* aec_dump.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E045921A4FD7600F838EF /* aec_dump.cc */; }; + 691E06C521A4FD7600F838EF /* audio_processing.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E045D21A4FD7600F838EF /* audio_processing.cc */; }; + 691E06C621A4FD7600F838EF /* config.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E045E21A4FD7600F838EF /* config.cc */; }; + 691E06C921A4FD7600F838EF /* interpolated_gain_curve.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E046221A4FD7600F838EF /* interpolated_gain_curve.cc */; }; + 691E06CA21A4FD7600F838EF /* agc2_common.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E046321A4FD7600F838EF /* agc2_common.cc */; }; + 691E06CD21A4FD7600F838EF /* gain_applier.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E046621A4FD7600F838EF /* gain_applier.cc */; }; + 691E06CF21A4FD7600F838EF /* adaptive_agc.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E046821A4FD7600F838EF /* adaptive_agc.cc */; }; + 691E06D021A4FD7600F838EF /* adaptive_digital_gain_applier.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E046921A4FD7600F838EF /* adaptive_digital_gain_applier.cc */; }; + 691E06D121A4FD7600F838EF /* limiter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E046A21A4FD7600F838EF /* limiter.cc */; }; + 691E06D221A4FD7600F838EF /* saturation_protector.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E046B21A4FD7600F838EF /* saturation_protector.cc */; }; + 691E06D421A4FD7600F838EF /* spectral_features_internal.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E046E21A4FD7600F838EF /* spectral_features_internal.cc */; }; + 691E06D721A4FD7600F838EF /* rnn.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E047121A4FD7600F838EF /* rnn.cc */; }; + 691E06DC21A4FD7600F838EF /* pitch_search_internal.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E047621A4FD7600F838EF /* pitch_search_internal.cc */; }; + 691E06E321A4FD7600F838EF /* spectral_features.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E047D21A4FD7600F838EF /* spectral_features.cc */; }; + 691E06E521A4FD7600F838EF /* pitch_search.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E047F21A4FD7600F838EF /* pitch_search.cc */; }; + 691E06E721A4FD7600F838EF /* features_extraction.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E048121A4FD7600F838EF /* features_extraction.cc */; }; + 691E06E821A4FD7600F838EF /* fft_util.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E048221A4FD7600F838EF /* fft_util.cc */; }; + 691E06E921A4FD7600F838EF /* lp_residual.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E048321A4FD7600F838EF /* lp_residual.cc */; }; + 691E06EB21A4FD7600F838EF /* adaptive_mode_level_estimator_agc.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E048521A4FD7600F838EF /* adaptive_mode_level_estimator_agc.cc */; }; + 691E06EC21A4FD7600F838EF /* vector_float_frame.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E048621A4FD7600F838EF /* vector_float_frame.cc */; }; + 691E06EE21A4FD7600F838EF /* noise_level_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E048821A4FD7600F838EF /* noise_level_estimator.cc */; }; + 691E06EF21A4FD7600F838EF /* agc2_testing_common.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E048921A4FD7600F838EF /* agc2_testing_common.cc */; }; + 691E06F021A4FD7600F838EF /* fixed_digital_level_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E048A21A4FD7600F838EF /* fixed_digital_level_estimator.cc */; }; + 691E06F121A4FD7600F838EF /* fixed_gain_controller.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E048B21A4FD7600F838EF /* fixed_gain_controller.cc */; }; + 691E06F321A4FD7600F838EF /* vad_with_level.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E048D21A4FD7600F838EF /* vad_with_level.cc */; }; + 691E06F421A4FD7600F838EF /* limiter_db_gain_curve.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E048E21A4FD7600F838EF /* limiter_db_gain_curve.cc */; }; + 691E06FD21A4FD7600F838EF /* down_sampler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E049721A4FD7600F838EF /* down_sampler.cc */; }; + 691E06FF21A4FD7600F838EF /* signal_classifier.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E049921A4FD7600F838EF /* signal_classifier.cc */; }; + 691E070021A4FD7600F838EF /* noise_spectrum_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E049A21A4FD7600F838EF /* noise_spectrum_estimator.cc */; }; + 691E070121A4FD7600F838EF /* compute_interpolated_gain_curve.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E049B21A4FD7600F838EF /* compute_interpolated_gain_curve.cc */; }; + 691E070321A4FD7600F838EF /* biquad_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E049D21A4FD7600F838EF /* biquad_filter.cc */; }; + 691E070621A4FD7700F838EF /* adaptive_mode_level_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04A021A4FD7600F838EF /* adaptive_mode_level_estimator.cc */; }; + 691E070721A4FD7700F838EF /* moving_moments.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04A221A4FD7600F838EF /* moving_moments.cc */; }; + 691E070921A4FD7700F838EF /* wpd_tree.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04A421A4FD7600F838EF /* wpd_tree.cc */; }; + 691E071021A4FD7700F838EF /* wpd_node.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04AB21A4FD7600F838EF /* wpd_node.cc */; }; + 691E071121A4FD7700F838EF /* transient_suppressor.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04AC21A4FD7600F838EF /* transient_suppressor.cc */; }; + 691E071221A4FD7700F838EF /* transient_detector.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04AD21A4FD7600F838EF /* transient_detector.cc */; }; + 691E071421A4FD7700F838EF /* low_cut_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04AF21A4FD7600F838EF /* low_cut_filter.cc */; }; + 691E071621A4FD7700F838EF /* level_estimator_impl.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04B121A4FD7600F838EF /* level_estimator_impl.cc */; }; + 691E071721A4FD7700F838EF /* three_band_filter_bank.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04B221A4FD7600F838EF /* three_band_filter_bank.cc */; }; + 691E071821A4FD7700F838EF /* echo_cancellation.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04B421A4FD7600F838EF /* echo_cancellation.cc */; }; + 691E071A21A4FD7700F838EF /* aec_resampler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04B621A4FD7600F838EF /* aec_resampler.cc */; }; + 691E071C21A4FD7700F838EF /* aec_core.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04B821A4FD7600F838EF /* aec_core.cc */; }; + 691E071F21A4FD7700F838EF /* aec_core_neon.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04BB21A4FD7600F838EF /* aec_core_neon.cc */; }; + 691E072021A4FD7700F838EF /* aec_core_sse2.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04BC21A4FD7600F838EF /* aec_core_sse2.cc */; }; + 691E072321A4FD7700F838EF /* voice_detection_impl.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04BF21A4FD7600F838EF /* voice_detection_impl.cc */; }; + 691E072421A4FD7700F838EF /* echo_cancellation_impl.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04C021A4FD7600F838EF /* echo_cancellation_impl.cc */; }; + 691E072521A4FD7700F838EF /* gain_control_for_experimental_agc.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04C121A4FD7600F838EF /* gain_control_for_experimental_agc.cc */; }; + 691E072621A4FD7700F838EF /* agc.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04C321A4FD7600F838EF /* agc.cc */; }; + 691E072721A4FD7700F838EF /* loudness_histogram.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04C421A4FD7600F838EF /* loudness_histogram.cc */; }; + 691E072821A4FD7700F838EF /* agc_manager_direct.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04C521A4FD7600F838EF /* agc_manager_direct.cc */; }; + 691E072C21A4FD7700F838EF /* analog_agc.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E04CA21A4FD7600F838EF /* analog_agc.c */; }; + 691E072D21A4FD7700F838EF /* digital_agc.c in Sources */ = {isa = PBXBuildFile; fileRef = 691E04CB21A4FD7600F838EF /* digital_agc.c */; }; + 691E072E21A4FD7700F838EF /* utility.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04CC21A4FD7600F838EF /* utility.cc */; }; + 691E073621A4FD7700F838EF /* audio_processing_impl.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04D421A4FD7600F838EF /* audio_processing_impl.cc */; }; + 691E073C21A4FD7700F838EF /* file_audio_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04DB21A4FD7600F838EF /* file_audio_generator.cc */; }; + 691E073D21A4FD7700F838EF /* gain_controller2.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04DC21A4FD7600F838EF /* gain_controller2.cc */; }; + 691E073F21A4FD7700F838EF /* residual_echo_detector.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04DE21A4FD7600F838EF /* residual_echo_detector.cc */; }; + 691E074121A4FD7700F838EF /* noise_suppression_impl.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04E021A4FD7600F838EF /* noise_suppression_impl.cc */; }; + 691E074621A4FD7700F838EF /* aecm_core.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04E621A4FD7600F838EF /* aecm_core.cc */; }; + 691E074721A4FD7700F838EF /* aecm_core_c.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04E721A4FD7600F838EF /* aecm_core_c.cc */; }; + 691E074821A4FD7700F838EF /* aecm_core_neon.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04E821A4FD7600F838EF /* aecm_core_neon.cc */; }; + 691E074A21A4FD7700F838EF /* echo_control_mobile.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04EA21A4FD7600F838EF /* echo_control_mobile.cc */; }; + 691E074B21A4FD7700F838EF /* render_reverb_model.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04EC21A4FD7600F838EF /* render_reverb_model.cc */; }; + 691E074E21A4FD7700F838EF /* reverb_model_fallback.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04EF21A4FD7600F838EF /* reverb_model_fallback.cc */; }; + 691E075121A4FD7700F838EF /* echo_remover_metrics.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04F221A4FD7600F838EF /* echo_remover_metrics.cc */; }; + 691E075221A4FD7700F838EF /* matched_filter_lag_aggregator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04F321A4FD7600F838EF /* matched_filter_lag_aggregator.cc */; }; + 691E075321A4FD7700F838EF /* render_delay_buffer2.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04F421A4FD7600F838EF /* render_delay_buffer2.cc */; }; + 691E075621A4FD7700F838EF /* echo_path_variability.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04F721A4FD7600F838EF /* echo_path_variability.cc */; }; + 691E075721A4FD7700F838EF /* frame_blocker.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04F821A4FD7600F838EF /* frame_blocker.cc */; }; + 691E075821A4FD7700F838EF /* subtractor.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E04F921A4FD7600F838EF /* subtractor.cc */; }; + 691E075F21A4FD7700F838EF /* aec3_fft.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E050021A4FD7600F838EF /* aec3_fft.cc */; }; + 691E076221A4FD7700F838EF /* fullband_erle_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E050321A4FD7600F838EF /* fullband_erle_estimator.cc */; }; + 691E076321A4FD7700F838EF /* suppression_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E050421A4FD7600F838EF /* suppression_filter.cc */; }; + 691E076421A4FD7700F838EF /* block_processor.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E050521A4FD7600F838EF /* block_processor.cc */; }; + 691E076821A4FD7700F838EF /* subband_erle_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E050921A4FD7600F838EF /* subband_erle_estimator.cc */; }; + 691E076921A4FD7700F838EF /* render_delay_controller_metrics.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E050A21A4FD7600F838EF /* render_delay_controller_metrics.cc */; }; + 691E076A21A4FD7700F838EF /* render_delay_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E050B21A4FD7600F838EF /* render_delay_buffer.cc */; }; + 691E076C21A4FD7700F838EF /* vector_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E050D21A4FD7600F838EF /* vector_buffer.cc */; }; + 691E076D21A4FD7700F838EF /* erl_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E050E21A4FD7600F838EF /* erl_estimator.cc */; }; + 691E076E21A4FD7700F838EF /* aec_state.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E050F21A4FD7600F838EF /* aec_state.cc */; }; + 691E076F21A4FD7700F838EF /* adaptive_fir_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E051021A4FD7600F838EF /* adaptive_fir_filter.cc */; }; + 691E077121A4FD7700F838EF /* render_delay_controller.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E051221A4FD7600F838EF /* render_delay_controller.cc */; }; + 691E077221A4FD7700F838EF /* skew_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E051321A4FD7600F838EF /* skew_estimator.cc */; }; + 691E077521A4FD7700F838EF /* echo_path_delay_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E051621A4FD7600F838EF /* echo_path_delay_estimator.cc */; }; + 691E077821A4FD7700F838EF /* block_framer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E051921A4FD7600F838EF /* block_framer.cc */; }; + 691E077921A4FD7700F838EF /* erle_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E051A21A4FD7600F838EF /* erle_estimator.cc */; }; + 691E077A21A4FD7700F838EF /* reverb_model.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E051B21A4FD7600F838EF /* reverb_model.cc */; }; + 691E077B21A4FD7700F838EF /* cascaded_biquad_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E051C21A4FD7600F838EF /* cascaded_biquad_filter.cc */; }; + 691E077D21A4FD7700F838EF /* render_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E051E21A4FD7600F838EF /* render_buffer.cc */; }; + 691E077F21A4FD7700F838EF /* subtractor_output.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E052021A4FD7600F838EF /* subtractor_output.cc */; }; + 691E078021A4FD7700F838EF /* stationarity_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E052121A4FD7600F838EF /* stationarity_estimator.cc */; }; + 691E078121A4FD7700F838EF /* render_signal_analyzer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E052221A4FD7600F838EF /* render_signal_analyzer.cc */; }; + 691E078521A4FD7700F838EF /* subtractor_output_analyzer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E052621A4FD7600F838EF /* subtractor_output_analyzer.cc */; }; + 691E078621A4FD7700F838EF /* suppression_gain.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E052721A4FD7600F838EF /* suppression_gain.cc */; }; + 691E078721A4FD7700F838EF /* echo_audibility.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E052821A4FD7600F838EF /* echo_audibility.cc */; }; + 691E078821A4FD7700F838EF /* block_processor_metrics.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E052921A4FD7600F838EF /* block_processor_metrics.cc */; }; + 691E078B21A4FD7700F838EF /* moving_average.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E052C21A4FD7600F838EF /* moving_average.cc */; }; + 691E078E21A4FD7700F838EF /* reverb_model_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E052F21A4FD7600F838EF /* reverb_model_estimator.cc */; }; + 691E078F21A4FD7700F838EF /* aec3_common.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E053021A4FD7600F838EF /* aec3_common.cc */; }; + 691E079021A4FD7700F838EF /* residual_echo_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E053121A4FD7600F838EF /* residual_echo_estimator.cc */; }; + 691E079321A4FD7700F838EF /* matched_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E053421A4FD7600F838EF /* matched_filter.cc */; }; + 691E079721A4FD7700F838EF /* reverb_decay_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E053821A4FD7600F838EF /* reverb_decay_estimator.cc */; }; + 691E079821A4FD7700F838EF /* render_delay_controller2.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E053921A4FD7600F838EF /* render_delay_controller2.cc */; }; + 691E079A21A4FD7700F838EF /* suppression_gain_limiter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E053B21A4FD7600F838EF /* suppression_gain_limiter.cc */; }; + 691E079B21A4FD7700F838EF /* main_filter_update_gain.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E053C21A4FD7600F838EF /* main_filter_update_gain.cc */; }; + 691E079C21A4FD7700F838EF /* echo_remover.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E053D21A4FD7600F838EF /* echo_remover.cc */; }; + 691E079E21A4FD7700F838EF /* downsampled_render_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E053F21A4FD7600F838EF /* downsampled_render_buffer.cc */; }; + 691E07A021A4FD7700F838EF /* matrix_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E054121A4FD7600F838EF /* matrix_buffer.cc */; }; + 691E07A421A4FD7700F838EF /* block_processor2.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E054521A4FD7600F838EF /* block_processor2.cc */; }; + 691E07A521A4FD7700F838EF /* echo_canceller3.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E054621A4FD7600F838EF /* echo_canceller3.cc */; }; + 691E07A621A4FD7700F838EF /* block_delay_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E054721A4FD7600F838EF /* block_delay_buffer.cc */; }; + 691E07A821A4FD7700F838EF /* fft_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E054921A4FD7600F838EF /* fft_buffer.cc */; }; + 691E07AF21A4FD7700F838EF /* comfort_noise_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E055021A4FD7600F838EF /* comfort_noise_generator.cc */; }; + 691E07B321A4FD7700F838EF /* shadow_filter_update_gain.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E055421A4FD7600F838EF /* shadow_filter_update_gain.cc */; }; + 691E07B421A4FD7700F838EF /* filter_analyzer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E055521A4FD7600F838EF /* filter_analyzer.cc */; }; + 691E07B621A4FD7700F838EF /* reverb_frequency_response.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E055721A4FD7600F838EF /* reverb_frequency_response.cc */; }; + 691E07B721A4FD7700F838EF /* decimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E055821A4FD7600F838EF /* decimator.cc */; }; + 691E07B921A4FD7700F838EF /* echo_control_mobile_impl.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E055A21A4FD7600F838EF /* echo_control_mobile_impl.cc */; }; + 691E07BC21A4FD7700F838EF /* apm_data_dumper.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E055E21A4FD7600F838EF /* apm_data_dumper.cc */; }; + 691E07BE21A4FD7700F838EF /* voice_activity_detector.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E056121A4FD7600F838EF /* voice_activity_detector.cc */; }; + 691E07BF21A4FD7700F838EF /* standalone_vad.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E056221A4FD7600F838EF /* standalone_vad.cc */; }; + 691E07C121A4FD7700F838EF /* pitch_internal.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E056421A4FD7600F838EF /* pitch_internal.cc */; }; + 691E07C221A4FD7700F838EF /* vad_circular_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E056521A4FD7600F838EF /* vad_circular_buffer.cc */; }; + 691E07C521A4FD7700F838EF /* vad_audio_proc.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E056821A4FD7600F838EF /* vad_audio_proc.cc */; }; + 691E07C621A4FD7700F838EF /* pole_zero_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E056921A4FD7600F838EF /* pole_zero_filter.cc */; }; + 691E07C821A4FD7700F838EF /* pitch_based_vad.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E056B21A4FD7600F838EF /* pitch_based_vad.cc */; }; + 691E07CF21A4FD7700F838EF /* gmm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E057221A4FD7600F838EF /* gmm.cc */; }; + 691E07D421A4FD7700F838EF /* ooura_fft.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E057821A4FD7600F838EF /* ooura_fft.cc */; }; + 691E07D621A4FD7700F838EF /* delay_estimator_wrapper.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E057A21A4FD7600F838EF /* delay_estimator_wrapper.cc */; }; + 691E07D721A4FD7700F838EF /* ooura_fft_sse2.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E057B21A4FD7600F838EF /* ooura_fft_sse2.cc */; }; + 691E07D821A4FD7700F838EF /* delay_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E057C21A4FD7600F838EF /* delay_estimator.cc */; }; + 691E07DA21A4FD7700F838EF /* ooura_fft_neon.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E057E21A4FD7600F838EF /* ooura_fft_neon.cc */; }; + 691E07DB21A4FD7700F838EF /* block_mean_calculator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E057F21A4FD7600F838EF /* block_mean_calculator.cc */; }; + 691E07E121A4FD7700F838EF /* race_checker.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E058621A4FD7600F838EF /* race_checker.cc */; }; + 691E07E321A4FD7700F838EF /* string_builder.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E058921A4FD7600F838EF /* string_builder.cc */; }; + 691E07E621A4FD7700F838EF /* aligned_malloc.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E058D21A4FD7600F838EF /* aligned_malloc.cc */; }; + 691E07E821A4FD7700F838EF /* timeutils.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E058F21A4FD7600F838EF /* timeutils.cc */; }; + 691E07EA21A4FD7700F838EF /* logging_mac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 691E059121A4FD7600F838EF /* logging_mac.mm */; }; + 691E07EE21A4FD7700F838EF /* platform_file.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E059521A4FD7600F838EF /* platform_file.cc */; }; + 691E07F021A4FD7700F838EF /* string_to_number.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E059721A4FD7600F838EF /* string_to_number.cc */; }; + 691E07F421A4FD7700F838EF /* thread_checker_impl.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E059B21A4FD7600F838EF /* thread_checker_impl.cc */; }; + 691E07FA21A4FD7700F838EF /* stringencode.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E05A121A4FD7600F838EF /* stringencode.cc */; }; + 691E07FB21A4FD7700F838EF /* stringutils.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E05A221A4FD7600F838EF /* stringutils.cc */; }; + 691E07FC21A4FD7700F838EF /* checks.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E05A321A4FD7600F838EF /* checks.cc */; }; + 691E080721A4FD7700F838EF /* platform_thread.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E05B021A4FD7600F838EF /* platform_thread.cc */; }; + 691E080921A4FD7700F838EF /* logging_webrtc.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E05B221A4FD7600F838EF /* logging_webrtc.cc */; }; + 691E081021A4FD7700F838EF /* criticalsection.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E05B921A4FD7600F838EF /* criticalsection.cc */; }; + 691E081121A4FD7700F838EF /* platform_thread_types.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E05BA21A4FD7600F838EF /* platform_thread_types.cc */; }; + 691E081321A4FD7700F838EF /* event.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E05BC21A4FD7600F838EF /* event.cc */; }; + 691E081521A4FD7700F838EF /* event_tracer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 691E05BE21A4FD7600F838EF /* event_tracer.cc */; }; 692AB8CB1E6759DD00706ACC /* AudioInput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AB8881E6759DD00706ACC /* AudioInput.cpp */; }; - 692AB8CC1E6759DD00706ACC /* AudioInput.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AB8891E6759DD00706ACC /* AudioInput.h */; }; 692AB8CD1E6759DD00706ACC /* AudioOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AB88A1E6759DD00706ACC /* AudioOutput.cpp */; }; - 692AB8CE1E6759DD00706ACC /* AudioOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AB88B1E6759DD00706ACC /* AudioOutput.h */; }; 692AB8CF1E6759DD00706ACC /* BlockingQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AB88C1E6759DD00706ACC /* BlockingQueue.cpp */; }; - 692AB8D01E6759DD00706ACC /* BlockingQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AB88D1E6759DD00706ACC /* BlockingQueue.h */; }; 692AB8D11E6759DD00706ACC /* Buffers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AB88E1E6759DD00706ACC /* Buffers.cpp */; }; - 692AB8D21E6759DD00706ACC /* Buffers.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AB88F1E6759DD00706ACC /* Buffers.h */; }; 692AB8D31E6759DD00706ACC /* VoIPGroupController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AB8901E6759DD00706ACC /* VoIPGroupController.cpp */; }; - 692AB8D41E6759DD00706ACC /* PrivateDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AB8911E6759DD00706ACC /* PrivateDefines.h */; }; 692AB8D81E6759DD00706ACC /* CongestionControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AB8971E6759DD00706ACC /* CongestionControl.cpp */; }; - 692AB8D91E6759DD00706ACC /* CongestionControl.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AB8981E6759DD00706ACC /* CongestionControl.h */; }; 692AB8DA1E6759DD00706ACC /* EchoCanceller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AB8991E6759DD00706ACC /* EchoCanceller.cpp */; }; - 692AB8DB1E6759DD00706ACC /* EchoCanceller.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AB89A1E6759DD00706ACC /* EchoCanceller.h */; }; 692AB8E61E6759DD00706ACC /* JitterBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AB8A81E6759DD00706ACC /* JitterBuffer.cpp */; }; - 692AB8E71E6759DD00706ACC /* JitterBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AB8A91E6759DD00706ACC /* JitterBuffer.h */; }; - 692AB8E81E6759DD00706ACC /* logging.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AB8AA1E6759DD00706ACC /* logging.h */; }; 692AB8E91E6759DD00706ACC /* MediaStreamItf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AB8AB1E6759DD00706ACC /* MediaStreamItf.cpp */; }; - 692AB8EA1E6759DD00706ACC /* MediaStreamItf.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AB8AC1E6759DD00706ACC /* MediaStreamItf.h */; }; 692AB8EB1E6759DD00706ACC /* OpusDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AB8AD1E6759DD00706ACC /* OpusDecoder.cpp */; }; - 692AB8EC1E6759DD00706ACC /* OpusDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AB8AE1E6759DD00706ACC /* OpusDecoder.h */; }; 692AB8ED1E6759DD00706ACC /* OpusEncoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AB8AF1E6759DD00706ACC /* OpusEncoder.cpp */; }; - 692AB8EE1E6759DD00706ACC /* OpusEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AB8B01E6759DD00706ACC /* OpusEncoder.h */; }; - 692AB9011E6759DD00706ACC /* threading.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AB8C61E6759DD00706ACC /* threading.h */; }; 692AB9021E6759DD00706ACC /* VoIPController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AB8C71E6759DD00706ACC /* VoIPController.cpp */; }; 692AB9031E6759DD00706ACC /* VoIPController.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AB8C81E6759DD00706ACC /* VoIPController.h */; }; 692AB9041E6759DD00706ACC /* VoIPServerConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AB8C91E6759DD00706ACC /* VoIPServerConfig.cpp */; }; @@ -43,158 +305,21 @@ 692AB91F1E675F7000706ACC /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AB91C1E675F7000706ACC /* AudioToolbox.framework */; }; 692AB9201E675F7000706ACC /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AB91D1E675F7000706ACC /* AudioUnit.framework */; }; 692AB9211E675F7000706ACC /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AB91E1E675F7000706ACC /* CoreAudio.framework */; }; - 695B20621EBD39FF00E31757 /* DarwinSpecific.h in Headers */ = {isa = PBXBuildFile; fileRef = 695B20601EBD39FF00E31757 /* DarwinSpecific.h */; }; + 694DE8A1219F2265009C09A7 /* VideoRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 694DE89D219F2265009C09A7 /* VideoRenderer.cpp */; }; + 694DE8A2219F2265009C09A7 /* VideoSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 694DE89E219F2265009C09A7 /* VideoSource.cpp */; }; 6971220F20C8107F00971C2C /* PacketReassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6971220D20C8107E00971C2C /* PacketReassembler.cpp */; }; - 6971221020C8107F00971C2C /* PacketReassembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 6971220E20C8107F00971C2C /* PacketReassembler.h */; }; 6976FD0320F6A7060019939E /* MessageThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6976FD0120F6A7050019939E /* MessageThread.cpp */; }; - 6976FD0420F6A7060019939E /* MessageThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 6976FD0220F6A7060019939E /* MessageThread.h */; }; 697B6FC72136DBA4004C8E54 /* libtgvoipTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 697B6FC62136DBA4004C8E54 /* libtgvoipTests.mm */; }; 697B6FC92136DBA4004C8E54 /* libtgvoip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69F842361E67540700C110F7 /* libtgvoip.framework */; }; - 697B6FD32136E18A004C8E54 /* AudioUnitIO.h in Headers */ = {isa = PBXBuildFile; fileRef = 697B6FD22136E18A004C8E54 /* AudioUnitIO.h */; }; 697B6FD62136E1F3004C8E54 /* AudioIO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 697B6FD42136E1F3004C8E54 /* AudioIO.cpp */; }; - 697B6FD72136E1F3004C8E54 /* AudioIO.h in Headers */ = {isa = PBXBuildFile; fileRef = 697B6FD52136E1F3004C8E54 /* AudioIO.h */; }; 697B6FDA2136E2D9004C8E54 /* AudioIOCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 697B6FD82136E2D9004C8E54 /* AudioIOCallback.cpp */; }; - 697B6FDB2136E2D9004C8E54 /* AudioIOCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 697B6FD92136E2D9004C8E54 /* AudioIOCallback.h */; }; 697B6FDF2136F01E004C8E54 /* MockReflector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 697B6FDE2136F01E004C8E54 /* MockReflector.cpp */; }; - 69A6DEB91E96149300000E69 /* array_view.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE231E96149300000E69 /* array_view.h */; }; - 69A6DEBA1E96149300000E69 /* atomicops.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE241E96149300000E69 /* atomicops.h */; }; - 69A6DEBB1E96149300000E69 /* basictypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE251E96149300000E69 /* basictypes.h */; }; - 69A6DEBC1E96149300000E69 /* checks.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE261E96149300000E69 /* checks.cc */; }; - 69A6DEBD1E96149300000E69 /* checks.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE271E96149300000E69 /* checks.h */; }; - 69A6DEBE1E96149300000E69 /* constructormagic.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE281E96149300000E69 /* constructormagic.h */; }; - 69A6DEBF1E96149300000E69 /* safe_compare.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE291E96149300000E69 /* safe_compare.h */; }; - 69A6DEC01E96149300000E69 /* safe_conversions.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE2A1E96149300000E69 /* safe_conversions.h */; }; - 69A6DEC11E96149300000E69 /* safe_conversions_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE2B1E96149300000E69 /* safe_conversions_impl.h */; }; - 69A6DEC21E96149300000E69 /* sanitizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE2C1E96149300000E69 /* sanitizer.h */; }; - 69A6DEC31E96149300000E69 /* stringutils.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE2D1E96149300000E69 /* stringutils.cc */; }; - 69A6DEC41E96149300000E69 /* stringutils.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE2E1E96149300000E69 /* stringutils.h */; }; - 69A6DEC51E96149300000E69 /* type_traits.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE2F1E96149300000E69 /* type_traits.h */; }; - 69A6DEC61E96149300000E69 /* audio_util.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE311E96149300000E69 /* audio_util.cc */; }; - 69A6DEC71E96149300000E69 /* channel_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE321E96149300000E69 /* channel_buffer.cc */; }; - 69A6DEC81E96149300000E69 /* channel_buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE331E96149300000E69 /* channel_buffer.h */; }; - 69A6DEC91E96149300000E69 /* fft4g.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE341E96149300000E69 /* fft4g.c */; }; - 69A6DECA1E96149300000E69 /* fft4g.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE351E96149300000E69 /* fft4g.h */; }; - 69A6DECB1E96149300000E69 /* audio_util.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE371E96149300000E69 /* audio_util.h */; }; - 69A6DECC1E96149300000E69 /* ring_buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE381E96149300000E69 /* ring_buffer.c */; }; - 69A6DECD1E96149300000E69 /* ring_buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE391E96149300000E69 /* ring_buffer.h */; }; - 69A6DECE1E96149300000E69 /* auto_corr_to_refl_coef.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE3B1E96149300000E69 /* auto_corr_to_refl_coef.c */; }; - 69A6DECF1E96149300000E69 /* auto_correlation.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE3C1E96149300000E69 /* auto_correlation.c */; }; - 69A6DED01E96149300000E69 /* complex_bit_reverse.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE3D1E96149300000E69 /* complex_bit_reverse.c */; }; - 69A6DED21E96149300000E69 /* complex_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE3F1E96149300000E69 /* complex_fft.c */; }; - 69A6DED31E96149300000E69 /* complex_fft_tables.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE401E96149300000E69 /* complex_fft_tables.h */; }; - 69A6DED41E96149300000E69 /* copy_set_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE411E96149300000E69 /* copy_set_operations.c */; }; - 69A6DED51E96149300000E69 /* cross_correlation.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE421E96149300000E69 /* cross_correlation.c */; }; - 69A6DED61E96149300000E69 /* cross_correlation_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE431E96149300000E69 /* cross_correlation_neon.c */; }; - 69A6DED71E96149300000E69 /* division_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE441E96149300000E69 /* division_operations.c */; }; - 69A6DED81E96149300000E69 /* dot_product_with_scale.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE451E96149300000E69 /* dot_product_with_scale.c */; }; - 69A6DED91E96149300000E69 /* downsample_fast.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE461E96149300000E69 /* downsample_fast.c */; }; - 69A6DEDA1E96149300000E69 /* downsample_fast_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE471E96149300000E69 /* downsample_fast_neon.c */; }; - 69A6DEDB1E96149300000E69 /* energy.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE481E96149300000E69 /* energy.c */; }; - 69A6DEDC1E96149300000E69 /* filter_ar.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE491E96149300000E69 /* filter_ar.c */; }; - 69A6DEDD1E96149300000E69 /* filter_ar_fast_q12.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE4A1E96149300000E69 /* filter_ar_fast_q12.c */; }; - 69A6DEDF1E96149300000E69 /* filter_ma_fast_q12.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE4C1E96149300000E69 /* filter_ma_fast_q12.c */; }; - 69A6DEE01E96149300000E69 /* get_hanning_window.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE4D1E96149300000E69 /* get_hanning_window.c */; }; - 69A6DEE11E96149300000E69 /* get_scaling_square.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE4E1E96149300000E69 /* get_scaling_square.c */; }; - 69A6DEE21E96149300000E69 /* ilbc_specific_functions.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE4F1E96149300000E69 /* ilbc_specific_functions.c */; }; - 69A6DEE31E96149300000E69 /* real_fft.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE511E96149300000E69 /* real_fft.h */; }; - 69A6DEE41E96149300000E69 /* signal_processing_library.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE521E96149300000E69 /* signal_processing_library.h */; }; - 69A6DEE51E96149300000E69 /* spl_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE531E96149300000E69 /* spl_inl.h */; }; - 69A6DEE61E96149300000E69 /* spl_inl_armv7.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE541E96149300000E69 /* spl_inl_armv7.h */; }; - 69A6DEE71E96149300000E69 /* spl_inl_mips.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE551E96149300000E69 /* spl_inl_mips.h */; }; - 69A6DEE81E96149300000E69 /* levinson_durbin.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE561E96149300000E69 /* levinson_durbin.c */; }; - 69A6DEE91E96149300000E69 /* lpc_to_refl_coef.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE571E96149300000E69 /* lpc_to_refl_coef.c */; }; - 69A6DEEA1E96149300000E69 /* min_max_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE581E96149300000E69 /* min_max_operations.c */; }; - 69A6DEEB1E96149300000E69 /* min_max_operations_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE591E96149300000E69 /* min_max_operations_neon.c */; }; - 69A6DEEC1E96149300000E69 /* randomization_functions.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE5A1E96149300000E69 /* randomization_functions.c */; }; - 69A6DEED1E96149300000E69 /* real_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE5B1E96149300000E69 /* real_fft.c */; }; - 69A6DEEE1E96149300000E69 /* refl_coef_to_lpc.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE5C1E96149300000E69 /* refl_coef_to_lpc.c */; }; - 69A6DEEF1E96149300000E69 /* resample.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE5D1E96149300000E69 /* resample.c */; }; - 69A6DEF01E96149300000E69 /* resample_48khz.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE5E1E96149300000E69 /* resample_48khz.c */; }; - 69A6DEF11E96149300000E69 /* resample_by_2.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE5F1E96149300000E69 /* resample_by_2.c */; }; - 69A6DEF21E96149300000E69 /* resample_by_2_internal.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE601E96149300000E69 /* resample_by_2_internal.c */; }; - 69A6DEF31E96149300000E69 /* resample_by_2_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE611E96149300000E69 /* resample_by_2_internal.h */; }; - 69A6DEF41E96149300000E69 /* resample_fractional.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE621E96149300000E69 /* resample_fractional.c */; }; - 69A6DEF51E96149300000E69 /* spl_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE631E96149300000E69 /* spl_init.c */; }; - 69A6DEF61E96149300000E69 /* spl_inl.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE641E96149300000E69 /* spl_inl.c */; }; - 69A6DEF71E96149300000E69 /* spl_sqrt.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE651E96149300000E69 /* spl_sqrt.c */; }; - 69A6DEF81E96149300000E69 /* spl_sqrt_floor.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE661E96149300000E69 /* spl_sqrt_floor.c */; }; - 69A6DEFA1E96149300000E69 /* splitting_filter_impl.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE681E96149300000E69 /* splitting_filter_impl.c */; }; - 69A6DEFB1E96149300000E69 /* sqrt_of_one_minus_x_squared.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE691E96149300000E69 /* sqrt_of_one_minus_x_squared.c */; }; - 69A6DEFC1E96149300000E69 /* vector_scaling_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE6A1E96149300000E69 /* vector_scaling_operations.c */; }; - 69A6DEFD1E96149300000E69 /* sparse_fir_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE6B1E96149300000E69 /* sparse_fir_filter.cc */; }; - 69A6DEFE1E96149300000E69 /* sparse_fir_filter.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE6C1E96149300000E69 /* sparse_fir_filter.h */; }; - 69A6DEFF1E96149300000E69 /* wav_file.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE6D1E96149300000E69 /* wav_file.cc */; }; - 69A6DF001E96149300000E69 /* wav_file.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE6E1E96149300000E69 /* wav_file.h */; }; - 69A6DF011E96149300000E69 /* wav_header.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE6F1E96149300000E69 /* wav_header.cc */; }; - 69A6DF021E96149300000E69 /* wav_header.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE701E96149300000E69 /* wav_header.h */; }; - 69A6DF031E96149300000E69 /* aec_common.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE741E96149300000E69 /* aec_common.h */; }; - 69A6DF041E96149300000E69 /* aec_core.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE751E96149300000E69 /* aec_core.cc */; }; - 69A6DF051E96149300000E69 /* aec_core.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE761E96149300000E69 /* aec_core.h */; }; - 69A6DF061E96149300000E69 /* aec_core_neon.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE771E96149300000E69 /* aec_core_neon.cc */; }; - 69A6DF071E96149300000E69 /* aec_core_optimized_methods.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE781E96149300000E69 /* aec_core_optimized_methods.h */; }; - 69A6DF081E96149300000E69 /* aec_core_sse2.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE791E96149300000E69 /* aec_core_sse2.cc */; }; - 69A6DF091E96149300000E69 /* aec_resampler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE7A1E96149300000E69 /* aec_resampler.cc */; }; - 69A6DF0A1E96149300000E69 /* aec_resampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE7B1E96149300000E69 /* aec_resampler.h */; }; - 69A6DF0B1E96149300000E69 /* echo_cancellation.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE7C1E96149300000E69 /* echo_cancellation.cc */; }; - 69A6DF0C1E96149300000E69 /* echo_cancellation.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE7D1E96149300000E69 /* echo_cancellation.h */; }; - 69A6DF0D1E96149300000E69 /* aecm_core.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE7F1E96149300000E69 /* aecm_core.cc */; }; - 69A6DF0E1E96149300000E69 /* aecm_core.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE801E96149300000E69 /* aecm_core.h */; }; - 69A6DF0F1E96149300000E69 /* aecm_core_c.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE811E96149300000E69 /* aecm_core_c.cc */; }; - 69A6DF101E96149300000E69 /* aecm_core_neon.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE821E96149300000E69 /* aecm_core_neon.cc */; }; - 69A6DF111E96149300000E69 /* aecm_defines.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE831E96149300000E69 /* aecm_defines.h */; }; - 69A6DF121E96149300000E69 /* echo_control_mobile.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE841E96149300000E69 /* echo_control_mobile.cc */; }; - 69A6DF131E96149300000E69 /* echo_control_mobile.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE851E96149300000E69 /* echo_control_mobile.h */; }; - 69A6DF141E96149300000E69 /* analog_agc.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE881E96149300000E69 /* analog_agc.c */; }; - 69A6DF151E96149300000E69 /* analog_agc.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE891E96149300000E69 /* analog_agc.h */; }; - 69A6DF161E96149300000E69 /* digital_agc.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE8A1E96149300000E69 /* digital_agc.c */; }; - 69A6DF171E96149300000E69 /* digital_agc.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE8B1E96149300000E69 /* digital_agc.h */; }; - 69A6DF181E96149300000E69 /* gain_control.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE8C1E96149300000E69 /* gain_control.h */; }; - 69A6DF191E96149300000E69 /* apm_data_dumper.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE8E1E96149300000E69 /* apm_data_dumper.cc */; }; - 69A6DF1A1E96149300000E69 /* apm_data_dumper.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE8F1E96149300000E69 /* apm_data_dumper.h */; }; - 69A6DF1B1E96149300000E69 /* defines.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE911E96149300000E69 /* defines.h */; }; - 69A6DF1C1E96149300000E69 /* noise_suppression.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE921E96149300000E69 /* noise_suppression.c */; }; - 69A6DF1D1E96149300000E69 /* noise_suppression.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE931E96149300000E69 /* noise_suppression.h */; }; - 69A6DF1E1E96149300000E69 /* noise_suppression_x.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE941E96149300000E69 /* noise_suppression_x.c */; }; - 69A6DF1F1E96149300000E69 /* noise_suppression_x.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE951E96149300000E69 /* noise_suppression_x.h */; }; - 69A6DF201E96149300000E69 /* ns_core.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE961E96149300000E69 /* ns_core.c */; }; - 69A6DF211E96149300000E69 /* ns_core.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE971E96149300000E69 /* ns_core.h */; }; - 69A6DF221E96149300000E69 /* nsx_core.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE981E96149300000E69 /* nsx_core.c */; }; - 69A6DF231E96149300000E69 /* nsx_core.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE991E96149300000E69 /* nsx_core.h */; }; - 69A6DF241E96149300000E69 /* nsx_core_c.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE9A1E96149300000E69 /* nsx_core_c.c */; }; - 69A6DF251E96149300000E69 /* nsx_core_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE9B1E96149300000E69 /* nsx_core_neon.c */; }; - 69A6DF261E96149300000E69 /* nsx_defines.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE9C1E96149300000E69 /* nsx_defines.h */; }; - 69A6DF271E96149300000E69 /* windows_private.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE9D1E96149300000E69 /* windows_private.h */; }; - 69A6DF281E96149300000E69 /* splitting_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DE9E1E96149300000E69 /* splitting_filter.cc */; }; - 69A6DF291E96149300000E69 /* splitting_filter.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DE9F1E96149300000E69 /* splitting_filter.h */; }; - 69A6DF2A1E96149300000E69 /* three_band_filter_bank.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DEA01E96149300000E69 /* three_band_filter_bank.cc */; }; - 69A6DF2B1E96149300000E69 /* three_band_filter_bank.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DEA11E96149300000E69 /* three_band_filter_bank.h */; }; - 69A6DF2C1E96149300000E69 /* block_mean_calculator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DEA31E96149300000E69 /* block_mean_calculator.cc */; }; - 69A6DF2D1E96149300000E69 /* block_mean_calculator.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DEA41E96149300000E69 /* block_mean_calculator.h */; }; - 69A6DF2E1E96149300000E69 /* delay_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DEA51E96149300000E69 /* delay_estimator.cc */; }; - 69A6DF2F1E96149300000E69 /* delay_estimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DEA61E96149300000E69 /* delay_estimator.h */; }; - 69A6DF301E96149300000E69 /* delay_estimator_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DEA71E96149300000E69 /* delay_estimator_internal.h */; }; - 69A6DF311E96149300000E69 /* delay_estimator_wrapper.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DEA81E96149300000E69 /* delay_estimator_wrapper.cc */; }; - 69A6DF321E96149300000E69 /* delay_estimator_wrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DEA91E96149300000E69 /* delay_estimator_wrapper.h */; }; - 69A6DF331E96149300000E69 /* ooura_fft.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DEAA1E96149300000E69 /* ooura_fft.cc */; }; - 69A6DF341E96149300000E69 /* ooura_fft.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DEAB1E96149300000E69 /* ooura_fft.h */; }; - 69A6DF351E96149300000E69 /* ooura_fft_neon.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DEAC1E96149300000E69 /* ooura_fft_neon.cc */; }; - 69A6DF361E96149300000E69 /* ooura_fft_sse2.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DEAD1E96149300000E69 /* ooura_fft_sse2.cc */; }; - 69A6DF371E96149300000E69 /* ooura_fft_tables_common.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DEAE1E96149300000E69 /* ooura_fft_tables_common.h */; }; - 69A6DF381E96149300000E69 /* ooura_fft_tables_neon_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DEAF1E96149300000E69 /* ooura_fft_tables_neon_sse2.h */; }; - 69A6DF391E96149300000E69 /* asm_defines.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DEB21E96149300000E69 /* asm_defines.h */; }; - 69A6DF3A1E96149300000E69 /* compile_assert_c.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DEB31E96149300000E69 /* compile_assert_c.h */; }; - 69A6DF3B1E96149300000E69 /* cpu_features_wrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DEB41E96149300000E69 /* cpu_features_wrapper.h */; }; - 69A6DF3C1E96149300000E69 /* metrics.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DEB51E96149300000E69 /* metrics.h */; }; - 69A6DF3D1E96149300000E69 /* cpu_features.cc in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DEB71E96149300000E69 /* cpu_features.cc */; }; - 69A6DF3E1E96149300000E69 /* typedefs.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DEB81E96149300000E69 /* typedefs.h */; }; + 69A2076521AF628A003AC4F9 /* json11.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 69A2076421AF6289003AC4F9 /* json11.cpp */; }; 69A6DF431E9614B700000E69 /* AudioInputAudioUnitOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DF3F1E9614B700000E69 /* AudioInputAudioUnitOSX.cpp */; }; - 69A6DF441E9614B700000E69 /* AudioInputAudioUnitOSX.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DF401E9614B700000E69 /* AudioInputAudioUnitOSX.h */; }; 69A6DF451E9614B700000E69 /* AudioOutputAudioUnitOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 69A6DF411E9614B700000E69 /* AudioOutputAudioUnitOSX.cpp */; }; - 69A6DF461E9614B700000E69 /* AudioOutputAudioUnitOSX.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A6DF421E9614B700000E69 /* AudioOutputAudioUnitOSX.h */; }; 69EBC7912136D220003CFE90 /* AudioInputAudioUnitOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C2A87DDC1F4B6A61002D3F73 /* AudioInputAudioUnitOSX.cpp */; }; 69EBC7922136D220003CFE90 /* AudioOutputAudioUnitOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C2A87DDE1F4B6A61002D3F73 /* AudioOutputAudioUnitOSX.cpp */; }; 69EBC7942136D277003CFE90 /* DarwinSpecific.mm in Sources */ = {isa = PBXBuildFile; fileRef = 69EBC7932136D277003CFE90 /* DarwinSpecific.mm */; }; - 69EBC7962136D2A9003CFE90 /* Resampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 69EBC7952136D2A9003CFE90 /* Resampler.h */; }; C2A87DD81F4B6A33002D3F73 /* Resampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C2A87DD71F4B6A33002D3F73 /* Resampler.cpp */; }; C2A87DDF1F4B6A61002D3F73 /* AudioInputAudioUnit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C2A87DDB1F4B6A61002D3F73 /* AudioInputAudioUnit.cpp */; }; C2A87DE01F4B6A61002D3F73 /* AudioOutputAudioUnit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C2A87DDD1F4B6A61002D3F73 /* AudioOutputAudioUnit.cpp */; }; @@ -266,6 +391,602 @@ 690725C01EBBD5F2005D860B /* NetworkSocket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkSocket.cpp; sourceTree = SOURCE_ROOT; }; 690725C11EBBD5F2005D860B /* NetworkSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkSocket.h; sourceTree = SOURCE_ROOT; }; 6915307A1E6B5BAB004F643F /* logging.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = logging.cpp; sourceTree = SOURCE_ROOT; }; + 691E032E21A4FD7500F838EF /* typedefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typedefs.h; sourceTree = ""; }; + 691E033221A4FD7500F838EF /* memutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memutil.h; sourceTree = ""; }; + 691E033321A4FD7500F838EF /* memutil.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memutil.cc; sourceTree = ""; }; + 691E033421A4FD7500F838EF /* string_view.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = string_view.cc; sourceTree = ""; }; + 691E033521A4FD7500F838EF /* ascii.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ascii.h; sourceTree = ""; }; + 691E033621A4FD7500F838EF /* ascii.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ascii.cc; sourceTree = ""; }; + 691E033721A4FD7500F838EF /* string_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_view.h; sourceTree = ""; }; + 691E033921A4FD7500F838EF /* optional.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = optional.h; sourceTree = ""; }; + 691E033A21A4FD7500F838EF /* bad_optional_access.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bad_optional_access.h; sourceTree = ""; }; + 691E033B21A4FD7500F838EF /* bad_optional_access.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bad_optional_access.cc; sourceTree = ""; }; + 691E033C21A4FD7500F838EF /* optional.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = optional.cc; sourceTree = ""; }; + 691E033E21A4FD7500F838EF /* memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memory.h; sourceTree = ""; }; + 691E034021A4FD7500F838EF /* type_traits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type_traits.h; sourceTree = ""; }; + 691E034221A4FD7500F838EF /* algorithm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = algorithm.h; sourceTree = ""; }; + 691E034421A4FD7500F838EF /* inlined_vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inlined_vector.h; sourceTree = ""; }; + 691E034621A4FD7500F838EF /* policy_checks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = policy_checks.h; sourceTree = ""; }; + 691E034721A4FD7500F838EF /* port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = port.h; sourceTree = ""; }; + 691E034821A4FD7500F838EF /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; + 691E034A21A4FD7500F838EF /* raw_logging.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = raw_logging.cc; sourceTree = ""; }; + 691E034B21A4FD7500F838EF /* throw_delegate.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = throw_delegate.cc; sourceTree = ""; }; + 691E034C21A4FD7500F838EF /* invoke.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = invoke.h; sourceTree = ""; }; + 691E034D21A4FD7500F838EF /* inline_variable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_variable.h; sourceTree = ""; }; + 691E034E21A4FD7500F838EF /* atomic_hook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = atomic_hook.h; sourceTree = ""; }; + 691E034F21A4FD7500F838EF /* identity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = identity.h; sourceTree = ""; }; + 691E035021A4FD7500F838EF /* raw_logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = raw_logging.h; sourceTree = ""; }; + 691E035121A4FD7500F838EF /* throw_delegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = throw_delegate.h; sourceTree = ""; }; + 691E035221A4FD7500F838EF /* attributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = attributes.h; sourceTree = ""; }; + 691E035321A4FD7500F838EF /* macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macros.h; sourceTree = ""; }; + 691E035421A4FD7500F838EF /* optimization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = optimization.h; sourceTree = ""; }; + 691E035521A4FD7500F838EF /* log_severity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log_severity.h; sourceTree = ""; }; + 691E035721A4FD7500F838EF /* utility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utility.h; sourceTree = ""; }; + 691E035A21A4FD7500F838EF /* mock_smoothing_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mock_smoothing_filter.h; sourceTree = ""; }; + 691E035B21A4FD7500F838EF /* wav_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wav_file.h; sourceTree = ""; }; + 691E035C21A4FD7500F838EF /* window_generator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = window_generator.cc; sourceTree = ""; }; + 691E035D21A4FD7500F838EF /* channel_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = channel_buffer.cc; sourceTree = ""; }; + 691E035E21A4FD7500F838EF /* fir_filter_factory.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fir_filter_factory.cc; sourceTree = ""; }; + 691E035F21A4FD7500F838EF /* sparse_fir_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sparse_fir_filter.h; sourceTree = ""; }; + 691E036021A4FD7500F838EF /* fir_filter_sse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fir_filter_sse.h; sourceTree = ""; }; + 691E036121A4FD7500F838EF /* window_generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = window_generator.h; sourceTree = ""; }; + 691E036221A4FD7500F838EF /* ring_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ring_buffer.h; sourceTree = ""; }; + 691E036321A4FD7500F838EF /* fir_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fir_filter.h; sourceTree = ""; }; + 691E036521A4FD7500F838EF /* audio_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_util.h; sourceTree = ""; }; + 691E036621A4FD7500F838EF /* wav_header.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wav_header.cc; sourceTree = ""; }; + 691E036721A4FD7500F838EF /* real_fourier_ooura.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = real_fourier_ooura.cc; sourceTree = ""; }; + 691E036821A4FD7500F838EF /* fir_filter_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fir_filter_neon.cc; sourceTree = ""; }; + 691E036921A4FD7500F838EF /* audio_util.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_util.cc; sourceTree = ""; }; + 691E036A21A4FD7500F838EF /* real_fourier_ooura.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = real_fourier_ooura.h; sourceTree = ""; }; + 691E036B21A4FD7500F838EF /* fir_filter_sse.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fir_filter_sse.cc; sourceTree = ""; }; + 691E036C21A4FD7500F838EF /* smoothing_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smoothing_filter.h; sourceTree = ""; }; + 691E036E21A4FD7500F838EF /* sinc_resampler_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sinc_resampler_neon.cc; sourceTree = ""; }; + 691E036F21A4FD7500F838EF /* push_sinc_resampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = push_sinc_resampler.cc; sourceTree = ""; }; + 691E037021A4FD7500F838EF /* sinc_resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sinc_resampler.h; sourceTree = ""; }; + 691E037121A4FD7500F838EF /* resampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = resampler.cc; sourceTree = ""; }; + 691E037221A4FD7500F838EF /* sinc_resampler_sse.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sinc_resampler_sse.cc; sourceTree = ""; }; + 691E037421A4FD7500F838EF /* push_resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = push_resampler.h; sourceTree = ""; }; + 691E037521A4FD7500F838EF /* resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resampler.h; sourceTree = ""; }; + 691E037621A4FD7500F838EF /* push_sinc_resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = push_sinc_resampler.h; sourceTree = ""; }; + 691E037721A4FD7500F838EF /* push_resampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = push_resampler.cc; sourceTree = ""; }; + 691E037821A4FD7500F838EF /* sinusoidal_linear_chirp_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sinusoidal_linear_chirp_source.h; sourceTree = ""; }; + 691E037921A4FD7500F838EF /* sinc_resampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sinc_resampler.cc; sourceTree = ""; }; + 691E037A21A4FD7500F838EF /* sinusoidal_linear_chirp_source.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sinusoidal_linear_chirp_source.cc; sourceTree = ""; }; + 691E037B21A4FD7500F838EF /* fir_filter_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fir_filter_factory.h; sourceTree = ""; }; + 691E037C21A4FD7500F838EF /* audio_converter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_converter.h; sourceTree = ""; }; + 691E037D21A4FD7500F838EF /* wav_file.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wav_file.cc; sourceTree = ""; }; + 691E038021A4FD7500F838EF /* spl_sqrt_floor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_sqrt_floor.c; sourceTree = ""; }; + 691E038221A4FD7500F838EF /* spl_sqrt_floor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_sqrt_floor.h; sourceTree = ""; }; + 691E038421A4FD7500F838EF /* fft4g.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fft4g.c; sourceTree = ""; }; + 691E038521A4FD7500F838EF /* fft4g.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft4g.h; sourceTree = ""; }; + 691E038621A4FD7500F838EF /* audio_converter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_converter.cc; sourceTree = ""; }; + 691E038721A4FD7500F838EF /* real_fourier.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = real_fourier.cc; sourceTree = ""; }; + 691E038821A4FD7500F838EF /* channel_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = channel_buffer.h; sourceTree = ""; }; + 691E038921A4FD7500F838EF /* real_fourier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = real_fourier.h; sourceTree = ""; }; + 691E038A21A4FD7500F838EF /* sparse_fir_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sparse_fir_filter.cc; sourceTree = ""; }; + 691E038B21A4FD7500F838EF /* fir_filter_neon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fir_filter_neon.h; sourceTree = ""; }; + 691E038C21A4FD7500F838EF /* smoothing_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = smoothing_filter.cc; sourceTree = ""; }; + 691E038D21A4FD7500F838EF /* fir_filter_c.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fir_filter_c.cc; sourceTree = ""; }; + 691E038E21A4FD7500F838EF /* ring_buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ring_buffer.c; sourceTree = ""; }; + 691E038F21A4FD7500F838EF /* fir_filter_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fir_filter_c.h; sourceTree = ""; }; + 691E039121A4FD7500F838EF /* complex_fft_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = complex_fft_tables.h; sourceTree = ""; }; + 691E039221A4FD7500F838EF /* complex_fft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = complex_fft.c; sourceTree = ""; }; + 691E039321A4FD7500F838EF /* filter_ma_fast_q12.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ma_fast_q12.c; sourceTree = ""; }; + 691E039421A4FD7500F838EF /* splitting_filter1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = splitting_filter1.c; sourceTree = ""; }; + 691E039521A4FD7500F838EF /* levinson_durbin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = levinson_durbin.c; sourceTree = ""; }; + 691E039621A4FD7500F838EF /* downsample_fast_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = downsample_fast_neon.c; sourceTree = ""; }; + 691E039721A4FD7500F838EF /* dot_product_with_scale.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dot_product_with_scale.cc; sourceTree = ""; }; + 691E039821A4FD7500F838EF /* auto_corr_to_refl_coef.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = auto_corr_to_refl_coef.c; sourceTree = ""; }; + 691E039921A4FD7500F838EF /* resample_by_2_internal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_by_2_internal.c; sourceTree = ""; }; + 691E039B21A4FD7500F838EF /* energy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = energy.c; sourceTree = ""; }; + 691E039C21A4FD7500F838EF /* sqrt_of_one_minus_x_squared.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sqrt_of_one_minus_x_squared.c; sourceTree = ""; }; + 691E039D21A4FD7500F838EF /* downsample_fast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = downsample_fast.c; sourceTree = ""; }; + 691E039E21A4FD7500F838EF /* filter_ar_fast_q12.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ar_fast_q12.c; sourceTree = ""; }; + 691E039F21A4FD7500F838EF /* spl_init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_init.c; sourceTree = ""; }; + 691E03A021A4FD7500F838EF /* lpc_to_refl_coef.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_to_refl_coef.c; sourceTree = ""; }; + 691E03A121A4FD7500F838EF /* cross_correlation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cross_correlation.c; sourceTree = ""; }; + 691E03A321A4FD7500F838EF /* signal_processing_library.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = signal_processing_library.h; sourceTree = ""; }; + 691E03A421A4FD7500F838EF /* real_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = real_fft.h; sourceTree = ""; }; + 691E03A521A4FD7500F838EF /* spl_inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl.h; sourceTree = ""; }; + 691E03A621A4FD7500F838EF /* spl_inl_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl_armv7.h; sourceTree = ""; }; + 691E03A721A4FD7500F838EF /* division_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = division_operations.c; sourceTree = ""; }; + 691E03A821A4FD7500F838EF /* auto_correlation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = auto_correlation.c; sourceTree = ""; }; + 691E03A921A4FD7500F838EF /* get_scaling_square.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = get_scaling_square.c; sourceTree = ""; }; + 691E03AA21A4FD7500F838EF /* min_max_operations_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = min_max_operations_neon.c; sourceTree = ""; }; + 691E03AB21A4FD7500F838EF /* dot_product_with_scale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dot_product_with_scale.h; sourceTree = ""; }; + 691E03AC21A4FD7500F838EF /* resample_by_2_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resample_by_2_internal.h; sourceTree = ""; }; + 691E03AD21A4FD7500F838EF /* resample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample.c; sourceTree = ""; }; + 691E03AE21A4FD7500F838EF /* cross_correlation_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cross_correlation_neon.c; sourceTree = ""; }; + 691E03AF21A4FD7500F838EF /* min_max_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = min_max_operations.c; sourceTree = ""; }; + 691E03B021A4FD7500F838EF /* refl_coef_to_lpc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = refl_coef_to_lpc.c; sourceTree = ""; }; + 691E03B121A4FD7500F838EF /* filter_ar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ar.c; sourceTree = ""; }; + 691E03B221A4FD7500F838EF /* vector_scaling_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vector_scaling_operations.c; sourceTree = ""; }; + 691E03B321A4FD7500F838EF /* resample_fractional.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_fractional.c; sourceTree = ""; }; + 691E03B421A4FD7500F838EF /* real_fft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = real_fft.c; sourceTree = ""; }; + 691E03B521A4FD7500F838EF /* ilbc_specific_functions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ilbc_specific_functions.c; sourceTree = ""; }; + 691E03B621A4FD7500F838EF /* complex_bit_reverse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = complex_bit_reverse.c; sourceTree = ""; }; + 691E03B721A4FD7500F838EF /* randomization_functions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = randomization_functions.c; sourceTree = ""; }; + 691E03B921A4FD7500F838EF /* copy_set_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = copy_set_operations.c; sourceTree = ""; }; + 691E03BA21A4FD7500F838EF /* resample_by_2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_by_2.c; sourceTree = ""; }; + 691E03BB21A4FD7500F838EF /* get_hanning_window.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = get_hanning_window.c; sourceTree = ""; }; + 691E03BC21A4FD7500F838EF /* resample_48khz.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_48khz.c; sourceTree = ""; }; + 691E03BD21A4FD7500F838EF /* spl_inl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_inl.c; sourceTree = ""; }; + 691E03BE21A4FD7500F838EF /* spl_sqrt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_sqrt.c; sourceTree = ""; }; + 691E03BF21A4FD7500F838EF /* wav_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wav_header.h; sourceTree = ""; }; + 691E03C121A4FD7500F838EF /* vad_sp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vad_sp.c; sourceTree = ""; }; + 691E03C221A4FD7500F838EF /* vad.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vad.cc; sourceTree = ""; }; + 691E03C321A4FD7500F838EF /* webrtc_vad.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = webrtc_vad.c; sourceTree = ""; }; + 691E03C421A4FD7500F838EF /* vad_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_core.h; sourceTree = ""; }; + 691E03C621A4FD7500F838EF /* vad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad.h; sourceTree = ""; }; + 691E03C721A4FD7500F838EF /* webrtc_vad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = webrtc_vad.h; sourceTree = ""; }; + 691E03C821A4FD7500F838EF /* vad_gmm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_gmm.h; sourceTree = ""; }; + 691E03C921A4FD7500F838EF /* vad_filterbank.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vad_filterbank.c; sourceTree = ""; }; + 691E03CA21A4FD7500F838EF /* vad_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vad_core.c; sourceTree = ""; }; + 691E03CB21A4FD7500F838EF /* vad_sp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_sp.h; sourceTree = ""; }; + 691E03CC21A4FD7500F838EF /* vad_filterbank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_filterbank.h; sourceTree = ""; }; + 691E03CD21A4FD7500F838EF /* vad_gmm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vad_gmm.c; sourceTree = ""; }; + 691E03D021A4FD7500F838EF /* audio_frame.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_frame.cc; sourceTree = ""; }; + 691E03D121A4FD7500F838EF /* echo_canceller3_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_canceller3_config.h; sourceTree = ""; }; + 691E03D221A4FD7500F838EF /* echo_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_control.h; sourceTree = ""; }; + 691E03D321A4FD7500F838EF /* audio_frame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_frame.h; sourceTree = ""; }; + 691E03D421A4FD7500F838EF /* echo_canceller3_config.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_canceller3_config.cc; sourceTree = ""; }; + 691E03D521A4FD7500F838EF /* echo_canceller3_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_canceller3_factory.h; sourceTree = ""; }; + 691E03D621A4FD7500F838EF /* echo_canceller3_factory.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_canceller3_factory.cc; sourceTree = ""; }; + 691E03D721A4FD7500F838EF /* array_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = array_view.h; sourceTree = ""; }; + 691E03DB21A4FD7500F838EF /* rnn_vad_weights.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rnn_vad_weights.cc; sourceTree = ""; }; + 691E03DC21A4FD7500F838EF /* rnn_activations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rnn_activations.h; sourceTree = ""; }; + 691E03DD21A4FD7500F838EF /* kiss_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kiss_fft.h; sourceTree = ""; }; + 691E03DE21A4FD7500F838EF /* kiss_fft.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = kiss_fft.cc; sourceTree = ""; }; + 691E03DF21A4FD7500F838EF /* rnn_vad_weights.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rnn_vad_weights.h; sourceTree = ""; }; + 691E03E221A4FD7500F838EF /* field_trial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = field_trial.h; sourceTree = ""; }; + 691E03E321A4FD7500F838EF /* cpu_features_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu_features_wrapper.h; sourceTree = ""; }; + 691E03E421A4FD7500F838EF /* asm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asm_defines.h; sourceTree = ""; }; + 691E03E521A4FD7500F838EF /* metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = metrics.h; sourceTree = ""; }; + 691E03E621A4FD7500F838EF /* compile_assert_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compile_assert_c.h; sourceTree = ""; }; + 691E03E821A4FD7500F838EF /* field_trial.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = field_trial.cc; sourceTree = ""; }; + 691E03E921A4FD7500F838EF /* metrics.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = metrics.cc; sourceTree = ""; }; + 691E03EA21A4FD7500F838EF /* cpu_features.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpu_features.cc; sourceTree = ""; }; + 691E03EE21A4FD7500F838EF /* fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft.h; sourceTree = ""; }; + 691E03EF21A4FD7500F838EF /* fft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fft.c; sourceTree = ""; }; + 691E03F321A4FD7500F838EF /* bandwidth_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bandwidth_info.h; sourceTree = ""; }; + 691E03F621A4FD7500F838EF /* isac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = isac.h; sourceTree = ""; }; + 691E03F821A4FD7500F838EF /* pitch_estimator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pitch_estimator.c; sourceTree = ""; }; + 691E03F921A4FD7500F838EF /* lpc_shape_swb16_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_shape_swb16_tables.c; sourceTree = ""; }; + 691E03FA21A4FD7500F838EF /* pitch_gain_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pitch_gain_tables.c; sourceTree = ""; }; + 691E03FB21A4FD7500F838EF /* arith_routines_logist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = arith_routines_logist.c; sourceTree = ""; }; + 691E03FC21A4FD7500F838EF /* os_specific_inline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = os_specific_inline.h; sourceTree = ""; }; + 691E03FD21A4FD7500F838EF /* filterbanks.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filterbanks.c; sourceTree = ""; }; + 691E03FE21A4FD7500F838EF /* entropy_coding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = entropy_coding.h; sourceTree = ""; }; + 691E03FF21A4FD7500F838EF /* isac_vad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = isac_vad.h; sourceTree = ""; }; + 691E040021A4FD7500F838EF /* settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = settings.h; sourceTree = ""; }; + 691E040121A4FD7500F838EF /* transform.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = transform.c; sourceTree = ""; }; + 691E040221A4FD7500F838EF /* lpc_shape_swb12_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lpc_shape_swb12_tables.h; sourceTree = ""; }; + 691E040321A4FD7500F838EF /* arith_routines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arith_routines.h; sourceTree = ""; }; + 691E040421A4FD7500F838EF /* crc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crc.h; sourceTree = ""; }; + 691E040521A4FD7500F838EF /* pitch_filter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pitch_filter.c; sourceTree = ""; }; + 691E040621A4FD7500F838EF /* encode_lpc_swb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = encode_lpc_swb.c; sourceTree = ""; }; + 691E040721A4FD7500F838EF /* filter_functions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_functions.c; sourceTree = ""; }; + 691E040821A4FD7500F838EF /* decode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = decode.c; sourceTree = ""; }; + 691E040921A4FD7500F838EF /* lattice.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lattice.c; sourceTree = ""; }; + 691E040A21A4FD7500F838EF /* intialize.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = intialize.c; sourceTree = ""; }; + 691E040B21A4FD7500F838EF /* lpc_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_tables.c; sourceTree = ""; }; + 691E040C21A4FD7500F838EF /* lpc_gain_swb_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_gain_swb_tables.c; sourceTree = ""; }; + 691E040D21A4FD7500F838EF /* bandwidth_estimator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bandwidth_estimator.c; sourceTree = ""; }; + 691E040E21A4FD7500F838EF /* isac_float_type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = isac_float_type.h; sourceTree = ""; }; + 691E040F21A4FD7500F838EF /* pitch_lag_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_lag_tables.h; sourceTree = ""; }; + 691E041021A4FD7500F838EF /* encode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = encode.c; sourceTree = ""; }; + 691E041121A4FD7500F838EF /* lpc_analysis.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_analysis.c; sourceTree = ""; }; + 691E041221A4FD7500F838EF /* spectrum_ar_model_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spectrum_ar_model_tables.h; sourceTree = ""; }; + 691E041321A4FD7500F838EF /* arith_routines_hist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = arith_routines_hist.c; sourceTree = ""; }; + 691E041421A4FD7500F838EF /* codec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = codec.h; sourceTree = ""; }; + 691E041521A4FD7500F838EF /* pitch_gain_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_gain_tables.h; sourceTree = ""; }; + 691E041621A4FD7500F838EF /* lpc_shape_swb16_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lpc_shape_swb16_tables.h; sourceTree = ""; }; + 691E041721A4FD7500F838EF /* pitch_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_estimator.h; sourceTree = ""; }; + 691E041821A4FD7500F838EF /* entropy_coding.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = entropy_coding.c; sourceTree = ""; }; + 691E041921A4FD7500F838EF /* isac_vad.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = isac_vad.c; sourceTree = ""; }; + 691E041A21A4FD7500F838EF /* structs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = structs.h; sourceTree = ""; }; + 691E041B21A4FD7500F838EF /* filter_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filter_functions.h; sourceTree = ""; }; + 691E041C21A4FD7500F838EF /* encode_lpc_swb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = encode_lpc_swb.h; sourceTree = ""; }; + 691E041D21A4FD7500F838EF /* pitch_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_filter.h; sourceTree = ""; }; + 691E041E21A4FD7500F838EF /* arith_routines.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = arith_routines.c; sourceTree = ""; }; + 691E041F21A4FD7500F838EF /* crc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = crc.c; sourceTree = ""; }; + 691E042021A4FD7500F838EF /* lpc_shape_swb12_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_shape_swb12_tables.c; sourceTree = ""; }; + 691E042121A4FD7500F838EF /* lpc_analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lpc_analysis.h; sourceTree = ""; }; + 691E042221A4FD7500F838EF /* decode_bwe.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = decode_bwe.c; sourceTree = ""; }; + 691E042321A4FD7500F838EF /* spectrum_ar_model_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spectrum_ar_model_tables.c; sourceTree = ""; }; + 691E042421A4FD7500F838EF /* bandwidth_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bandwidth_estimator.h; sourceTree = ""; }; + 691E042521A4FD7500F838EF /* pitch_lag_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pitch_lag_tables.c; sourceTree = ""; }; + 691E042621A4FD7500F838EF /* isac.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = isac.c; sourceTree = ""; }; + 691E042721A4FD7500F838EF /* lpc_gain_swb_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lpc_gain_swb_tables.h; sourceTree = ""; }; + 691E042821A4FD7500F838EF /* lpc_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lpc_tables.h; sourceTree = ""; }; + 691E042A21A4FD7500F838EF /* rms_level.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rms_level.cc; sourceTree = ""; }; + 691E042C21A4FD7500F838EF /* moving_max.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = moving_max.h; sourceTree = ""; }; + 691E042D21A4FD7600F838EF /* circular_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = circular_buffer.h; sourceTree = ""; }; + 691E042E21A4FD7600F838EF /* normalized_covariance_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = normalized_covariance_estimator.h; sourceTree = ""; }; + 691E042F21A4FD7600F838EF /* normalized_covariance_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = normalized_covariance_estimator.cc; sourceTree = ""; }; + 691E043021A4FD7600F838EF /* moving_max.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moving_max.cc; sourceTree = ""; }; + 691E043121A4FD7600F838EF /* circular_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = circular_buffer.cc; sourceTree = ""; }; + 691E043221A4FD7600F838EF /* mean_variance_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mean_variance_estimator.cc; sourceTree = ""; }; + 691E043321A4FD7600F838EF /* mean_variance_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mean_variance_estimator.h; sourceTree = ""; }; + 691E043421A4FD7600F838EF /* gain_control_for_experimental_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_control_for_experimental_agc.h; sourceTree = ""; }; + 691E043521A4FD7600F838EF /* splitting_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = splitting_filter.cc; sourceTree = ""; }; + 691E043621A4FD7600F838EF /* gain_control_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gain_control_impl.cc; sourceTree = ""; }; + 691E043721A4FD7600F838EF /* rms_level.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rms_level.h; sourceTree = ""; }; + 691E043D21A4FD7600F838EF /* ns_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ns_core.h; sourceTree = ""; }; + 691E043E21A4FD7600F838EF /* nsx_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core.c; sourceTree = ""; }; + 691E043F21A4FD7600F838EF /* noise_suppression_x.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = noise_suppression_x.c; sourceTree = ""; }; + 691E044021A4FD7600F838EF /* nsx_core_c.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core_c.c; sourceTree = ""; }; + 691E044121A4FD7600F838EF /* defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = defines.h; sourceTree = ""; }; + 691E044221A4FD7600F838EF /* noise_suppression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_suppression.h; sourceTree = ""; }; + 691E044321A4FD7600F838EF /* ns_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ns_core.c; sourceTree = ""; }; + 691E044421A4FD7600F838EF /* nsx_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsx_core.h; sourceTree = ""; }; + 691E044521A4FD7600F838EF /* windows_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = windows_private.h; sourceTree = ""; }; + 691E044621A4FD7600F838EF /* noise_suppression_x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_suppression_x.h; sourceTree = ""; }; + 691E044721A4FD7600F838EF /* nsx_core_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core_neon.c; sourceTree = ""; }; + 691E044821A4FD7600F838EF /* noise_suppression.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = noise_suppression.c; sourceTree = ""; }; + 691E044921A4FD7600F838EF /* nsx_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsx_defines.h; sourceTree = ""; }; + 691E044A21A4FD7600F838EF /* residual_echo_detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = residual_echo_detector.h; sourceTree = ""; }; + 691E044B21A4FD7600F838EF /* audio_processing_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_processing_impl.h; sourceTree = ""; }; + 691E044C21A4FD7600F838EF /* audio_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_buffer.cc; sourceTree = ""; }; + 691E044D21A4FD7600F838EF /* typing_detection.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = typing_detection.cc; sourceTree = ""; }; + 691E044E21A4FD7600F838EF /* render_queue_item_verifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_queue_item_verifier.h; sourceTree = ""; }; + 691E045121A4FD7600F838EF /* audio_generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_generator.h; sourceTree = ""; }; + 691E045221A4FD7600F838EF /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; + 691E045321A4FD7600F838EF /* audio_frame_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_frame_view.h; sourceTree = ""; }; + 691E045421A4FD7600F838EF /* mock_audio_processing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mock_audio_processing.h; sourceTree = ""; }; + 691E045521A4FD7600F838EF /* gain_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_control.h; sourceTree = ""; }; + 691E045621A4FD7600F838EF /* audio_generator_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_generator_factory.h; sourceTree = ""; }; + 691E045721A4FD7600F838EF /* audio_processing_statistics.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_processing_statistics.cc; sourceTree = ""; }; + 691E045821A4FD7600F838EF /* audio_generator_factory.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_generator_factory.cc; sourceTree = ""; }; + 691E045921A4FD7600F838EF /* aec_dump.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_dump.cc; sourceTree = ""; }; + 691E045A21A4FD7600F838EF /* aec_dump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_dump.h; sourceTree = ""; }; + 691E045B21A4FD7600F838EF /* audio_processing_statistics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_processing_statistics.h; sourceTree = ""; }; + 691E045C21A4FD7600F838EF /* audio_processing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_processing.h; sourceTree = ""; }; + 691E045D21A4FD7600F838EF /* audio_processing.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_processing.cc; sourceTree = ""; }; + 691E045E21A4FD7600F838EF /* config.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = config.cc; sourceTree = ""; }; + 691E046021A4FD7600F838EF /* interpolated_gain_curve.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interpolated_gain_curve.h; sourceTree = ""; }; + 691E046121A4FD7600F838EF /* biquad_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = biquad_filter.h; sourceTree = ""; }; + 691E046221A4FD7600F838EF /* interpolated_gain_curve.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = interpolated_gain_curve.cc; sourceTree = ""; }; + 691E046321A4FD7600F838EF /* agc2_common.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agc2_common.cc; sourceTree = ""; }; + 691E046421A4FD7600F838EF /* agc2_testing_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agc2_testing_common.h; sourceTree = ""; }; + 691E046521A4FD7600F838EF /* adaptive_mode_level_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adaptive_mode_level_estimator.h; sourceTree = ""; }; + 691E046621A4FD7600F838EF /* gain_applier.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gain_applier.cc; sourceTree = ""; }; + 691E046721A4FD7600F838EF /* signal_classifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = signal_classifier.h; sourceTree = ""; }; + 691E046821A4FD7600F838EF /* adaptive_agc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = adaptive_agc.cc; sourceTree = ""; }; + 691E046921A4FD7600F838EF /* adaptive_digital_gain_applier.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = adaptive_digital_gain_applier.cc; sourceTree = ""; }; + 691E046A21A4FD7600F838EF /* limiter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = limiter.cc; sourceTree = ""; }; + 691E046B21A4FD7600F838EF /* saturation_protector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = saturation_protector.cc; sourceTree = ""; }; + 691E046C21A4FD7600F838EF /* vector_float_frame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vector_float_frame.h; sourceTree = ""; }; + 691E046E21A4FD7600F838EF /* spectral_features_internal.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spectral_features_internal.cc; sourceTree = ""; }; + 691E046F21A4FD7600F838EF /* sequence_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sequence_buffer.h; sourceTree = ""; }; + 691E047021A4FD7600F838EF /* rnn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rnn.h; sourceTree = ""; }; + 691E047121A4FD7600F838EF /* rnn.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rnn.cc; sourceTree = ""; }; + 691E047221A4FD7600F838EF /* test_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = test_utils.h; sourceTree = ""; }; + 691E047321A4FD7600F838EF /* pitch_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_info.h; sourceTree = ""; }; + 691E047421A4FD7600F838EF /* lp_residual.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lp_residual.h; sourceTree = ""; }; + 691E047521A4FD7600F838EF /* ring_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ring_buffer.h; sourceTree = ""; }; + 691E047621A4FD7600F838EF /* pitch_search_internal.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pitch_search_internal.cc; sourceTree = ""; }; + 691E047721A4FD7600F838EF /* symmetric_matrix_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = symmetric_matrix_buffer.h; sourceTree = ""; }; + 691E047821A4FD7600F838EF /* spectral_features.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spectral_features.h; sourceTree = ""; }; + 691E047921A4FD7600F838EF /* features_extraction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = features_extraction.h; sourceTree = ""; }; + 691E047A21A4FD7600F838EF /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; + 691E047B21A4FD7600F838EF /* spectral_features_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spectral_features_internal.h; sourceTree = ""; }; + 691E047C21A4FD7600F838EF /* fft_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft_util.h; sourceTree = ""; }; + 691E047D21A4FD7600F838EF /* spectral_features.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spectral_features.cc; sourceTree = ""; }; + 691E047E21A4FD7600F838EF /* pitch_search_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_search_internal.h; sourceTree = ""; }; + 691E047F21A4FD7600F838EF /* pitch_search.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pitch_search.cc; sourceTree = ""; }; + 691E048021A4FD7600F838EF /* pitch_search.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_search.h; sourceTree = ""; }; + 691E048121A4FD7600F838EF /* features_extraction.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = features_extraction.cc; sourceTree = ""; }; + 691E048221A4FD7600F838EF /* fft_util.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fft_util.cc; sourceTree = ""; }; + 691E048321A4FD7600F838EF /* lp_residual.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lp_residual.cc; sourceTree = ""; }; + 691E048421A4FD7600F838EF /* fixed_gain_controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fixed_gain_controller.h; sourceTree = ""; }; + 691E048521A4FD7600F838EF /* adaptive_mode_level_estimator_agc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = adaptive_mode_level_estimator_agc.cc; sourceTree = ""; }; + 691E048621A4FD7600F838EF /* vector_float_frame.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vector_float_frame.cc; sourceTree = ""; }; + 691E048721A4FD7600F838EF /* down_sampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = down_sampler.h; sourceTree = ""; }; + 691E048821A4FD7600F838EF /* noise_level_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = noise_level_estimator.cc; sourceTree = ""; }; + 691E048921A4FD7600F838EF /* agc2_testing_common.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agc2_testing_common.cc; sourceTree = ""; }; + 691E048A21A4FD7600F838EF /* fixed_digital_level_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fixed_digital_level_estimator.cc; sourceTree = ""; }; + 691E048B21A4FD7600F838EF /* fixed_gain_controller.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fixed_gain_controller.cc; sourceTree = ""; }; + 691E048C21A4FD7600F838EF /* saturation_protector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = saturation_protector.h; sourceTree = ""; }; + 691E048D21A4FD7600F838EF /* vad_with_level.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vad_with_level.cc; sourceTree = ""; }; + 691E048E21A4FD7600F838EF /* limiter_db_gain_curve.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = limiter_db_gain_curve.cc; sourceTree = ""; }; + 691E048F21A4FD7600F838EF /* agc2_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agc2_common.h; sourceTree = ""; }; + 691E049021A4FD7600F838EF /* adaptive_mode_level_estimator_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adaptive_mode_level_estimator_agc.h; sourceTree = ""; }; + 691E049121A4FD7600F838EF /* adaptive_digital_gain_applier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adaptive_digital_gain_applier.h; sourceTree = ""; }; + 691E049221A4FD7600F838EF /* vad_with_level.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_with_level.h; sourceTree = ""; }; + 691E049321A4FD7600F838EF /* limiter_db_gain_curve.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = limiter_db_gain_curve.h; sourceTree = ""; }; + 691E049421A4FD7600F838EF /* fixed_digital_level_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fixed_digital_level_estimator.h; sourceTree = ""; }; + 691E049521A4FD7600F838EF /* adaptive_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adaptive_agc.h; sourceTree = ""; }; + 691E049621A4FD7600F838EF /* gain_applier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_applier.h; sourceTree = ""; }; + 691E049721A4FD7600F838EF /* down_sampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = down_sampler.cc; sourceTree = ""; }; + 691E049821A4FD7600F838EF /* noise_level_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_level_estimator.h; sourceTree = ""; }; + 691E049921A4FD7600F838EF /* signal_classifier.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = signal_classifier.cc; sourceTree = ""; }; + 691E049A21A4FD7600F838EF /* noise_spectrum_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = noise_spectrum_estimator.cc; sourceTree = ""; }; + 691E049B21A4FD7600F838EF /* compute_interpolated_gain_curve.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compute_interpolated_gain_curve.cc; sourceTree = ""; }; + 691E049C21A4FD7600F838EF /* compute_interpolated_gain_curve.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compute_interpolated_gain_curve.h; sourceTree = ""; }; + 691E049D21A4FD7600F838EF /* biquad_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = biquad_filter.cc; sourceTree = ""; }; + 691E049E21A4FD7600F838EF /* noise_spectrum_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_spectrum_estimator.h; sourceTree = ""; }; + 691E049F21A4FD7600F838EF /* limiter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = limiter.h; sourceTree = ""; }; + 691E04A021A4FD7600F838EF /* adaptive_mode_level_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = adaptive_mode_level_estimator.cc; sourceTree = ""; }; + 691E04A221A4FD7600F838EF /* moving_moments.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moving_moments.cc; sourceTree = ""; }; + 691E04A321A4FD7600F838EF /* transient_detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transient_detector.h; sourceTree = ""; }; + 691E04A421A4FD7600F838EF /* wpd_tree.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wpd_tree.cc; sourceTree = ""; }; + 691E04A521A4FD7600F838EF /* transient_suppressor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transient_suppressor.h; sourceTree = ""; }; + 691E04A621A4FD7600F838EF /* daubechies_8_wavelet_coeffs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = daubechies_8_wavelet_coeffs.h; sourceTree = ""; }; + 691E04A721A4FD7600F838EF /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; + 691E04A821A4FD7600F838EF /* wpd_node.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wpd_node.h; sourceTree = ""; }; + 691E04A921A4FD7600F838EF /* moving_moments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = moving_moments.h; sourceTree = ""; }; + 691E04AA21A4FD7600F838EF /* wpd_tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wpd_tree.h; sourceTree = ""; }; + 691E04AB21A4FD7600F838EF /* wpd_node.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wpd_node.cc; sourceTree = ""; }; + 691E04AC21A4FD7600F838EF /* transient_suppressor.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transient_suppressor.cc; sourceTree = ""; }; + 691E04AD21A4FD7600F838EF /* transient_detector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transient_detector.cc; sourceTree = ""; }; + 691E04AE21A4FD7600F838EF /* dyadic_decimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dyadic_decimator.h; sourceTree = ""; }; + 691E04AF21A4FD7600F838EF /* low_cut_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = low_cut_filter.cc; sourceTree = ""; }; + 691E04B021A4FD7600F838EF /* noise_suppression_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_suppression_impl.h; sourceTree = ""; }; + 691E04B121A4FD7600F838EF /* level_estimator_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = level_estimator_impl.cc; sourceTree = ""; }; + 691E04B221A4FD7600F838EF /* three_band_filter_bank.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = three_band_filter_bank.cc; sourceTree = ""; }; + 691E04B421A4FD7600F838EF /* echo_cancellation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_cancellation.cc; sourceTree = ""; }; + 691E04B521A4FD7600F838EF /* aec_resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_resampler.h; sourceTree = ""; }; + 691E04B621A4FD7600F838EF /* aec_resampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_resampler.cc; sourceTree = ""; }; + 691E04B721A4FD7600F838EF /* echo_cancellation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_cancellation.h; sourceTree = ""; }; + 691E04B821A4FD7600F838EF /* aec_core.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core.cc; sourceTree = ""; }; + 691E04B921A4FD7600F838EF /* aec_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_core.h; sourceTree = ""; }; + 691E04BA21A4FD7600F838EF /* aec_core_optimized_methods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_core_optimized_methods.h; sourceTree = ""; }; + 691E04BB21A4FD7600F838EF /* aec_core_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core_neon.cc; sourceTree = ""; }; + 691E04BC21A4FD7600F838EF /* aec_core_sse2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core_sse2.cc; sourceTree = ""; }; + 691E04BD21A4FD7600F838EF /* aec_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_common.h; sourceTree = ""; }; + 691E04BE21A4FD7600F838EF /* voice_detection_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = voice_detection_impl.h; sourceTree = ""; }; + 691E04BF21A4FD7600F838EF /* voice_detection_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = voice_detection_impl.cc; sourceTree = ""; }; + 691E04C021A4FD7600F838EF /* echo_cancellation_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_cancellation_impl.cc; sourceTree = ""; }; + 691E04C121A4FD7600F838EF /* gain_control_for_experimental_agc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gain_control_for_experimental_agc.cc; sourceTree = ""; }; + 691E04C321A4FD7600F838EF /* agc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agc.cc; sourceTree = ""; }; + 691E04C421A4FD7600F838EF /* loudness_histogram.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loudness_histogram.cc; sourceTree = ""; }; + 691E04C521A4FD7600F838EF /* agc_manager_direct.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agc_manager_direct.cc; sourceTree = ""; }; + 691E04C721A4FD7600F838EF /* analog_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = analog_agc.h; sourceTree = ""; }; + 691E04C821A4FD7600F838EF /* gain_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_control.h; sourceTree = ""; }; + 691E04C921A4FD7600F838EF /* digital_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = digital_agc.h; sourceTree = ""; }; + 691E04CA21A4FD7600F838EF /* analog_agc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = analog_agc.c; sourceTree = ""; }; + 691E04CB21A4FD7600F838EF /* digital_agc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = digital_agc.c; sourceTree = ""; }; + 691E04CC21A4FD7600F838EF /* utility.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = utility.cc; sourceTree = ""; }; + 691E04CD21A4FD7600F838EF /* mock_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mock_agc.h; sourceTree = ""; }; + 691E04CE21A4FD7600F838EF /* loudness_histogram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loudness_histogram.h; sourceTree = ""; }; + 691E04CF21A4FD7600F838EF /* gain_map_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_map_internal.h; sourceTree = ""; }; + 691E04D021A4FD7600F838EF /* utility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utility.h; sourceTree = ""; }; + 691E04D121A4FD7600F838EF /* agc_manager_direct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agc_manager_direct.h; sourceTree = ""; }; + 691E04D221A4FD7600F838EF /* agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agc.h; sourceTree = ""; }; + 691E04D321A4FD7600F838EF /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; + 691E04D421A4FD7600F838EF /* audio_processing_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_processing_impl.cc; sourceTree = ""; }; + 691E04D521A4FD7600F838EF /* audio_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_buffer.h; sourceTree = ""; }; + 691E04D621A4FD7600F838EF /* echo_control_mobile_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_control_mobile_impl.h; sourceTree = ""; }; + 691E04D721A4FD7600F838EF /* splitting_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = splitting_filter.h; sourceTree = ""; }; + 691E04D821A4FD7600F838EF /* low_cut_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = low_cut_filter.h; sourceTree = ""; }; + 691E04DA21A4FD7600F838EF /* file_audio_generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file_audio_generator.h; sourceTree = ""; }; + 691E04DB21A4FD7600F838EF /* file_audio_generator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_audio_generator.cc; sourceTree = ""; }; + 691E04DC21A4FD7600F838EF /* gain_controller2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gain_controller2.cc; sourceTree = ""; }; + 691E04DD21A4FD7600F838EF /* three_band_filter_bank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = three_band_filter_bank.h; sourceTree = ""; }; + 691E04DE21A4FD7600F838EF /* residual_echo_detector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = residual_echo_detector.cc; sourceTree = ""; }; + 691E04DF21A4FD7600F838EF /* echo_cancellation_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_cancellation_impl.h; sourceTree = ""; }; + 691E04E021A4FD7600F838EF /* noise_suppression_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = noise_suppression_impl.cc; sourceTree = ""; }; + 691E04E121A4FD7600F838EF /* level_estimator_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = level_estimator_impl.h; sourceTree = ""; }; + 691E04E221A4FD7600F838EF /* gain_controller2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_controller2.h; sourceTree = ""; }; + 691E04E421A4FD7600F838EF /* aecm_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aecm_core.h; sourceTree = ""; }; + 691E04E521A4FD7600F838EF /* aecm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aecm_defines.h; sourceTree = ""; }; + 691E04E621A4FD7600F838EF /* aecm_core.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core.cc; sourceTree = ""; }; + 691E04E721A4FD7600F838EF /* aecm_core_c.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core_c.cc; sourceTree = ""; }; + 691E04E821A4FD7600F838EF /* aecm_core_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core_neon.cc; sourceTree = ""; }; + 691E04E921A4FD7600F838EF /* echo_control_mobile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_control_mobile.h; sourceTree = ""; }; + 691E04EA21A4FD7600F838EF /* echo_control_mobile.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_control_mobile.cc; sourceTree = ""; }; + 691E04EC21A4FD7600F838EF /* render_reverb_model.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_reverb_model.cc; sourceTree = ""; }; + 691E04ED21A4FD7600F838EF /* downsampled_render_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = downsampled_render_buffer.h; sourceTree = ""; }; + 691E04EE21A4FD7600F838EF /* subtractor_output_analyzer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = subtractor_output_analyzer.h; sourceTree = ""; }; + 691E04EF21A4FD7600F838EF /* reverb_model_fallback.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reverb_model_fallback.cc; sourceTree = ""; }; + 691E04F021A4FD7600F838EF /* residual_echo_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = residual_echo_estimator.h; sourceTree = ""; }; + 691E04F121A4FD7600F838EF /* shadow_filter_update_gain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shadow_filter_update_gain.h; sourceTree = ""; }; + 691E04F221A4FD7600F838EF /* echo_remover_metrics.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_remover_metrics.cc; sourceTree = ""; }; + 691E04F321A4FD7600F838EF /* matched_filter_lag_aggregator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = matched_filter_lag_aggregator.cc; sourceTree = ""; }; + 691E04F421A4FD7600F838EF /* render_delay_buffer2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_delay_buffer2.cc; sourceTree = ""; }; + 691E04F521A4FD7600F838EF /* aec_state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_state.h; sourceTree = ""; }; + 691E04F621A4FD7600F838EF /* suppression_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = suppression_filter.h; sourceTree = ""; }; + 691E04F721A4FD7600F838EF /* echo_path_variability.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_path_variability.cc; sourceTree = ""; }; + 691E04F821A4FD7600F838EF /* frame_blocker.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = frame_blocker.cc; sourceTree = ""; }; + 691E04F921A4FD7600F838EF /* subtractor.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = subtractor.cc; sourceTree = ""; }; + 691E04FA21A4FD7600F838EF /* block_delay_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_delay_buffer.h; sourceTree = ""; }; + 691E04FB21A4FD7600F838EF /* adaptive_fir_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adaptive_fir_filter.h; sourceTree = ""; }; + 691E04FC21A4FD7600F838EF /* cascaded_biquad_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cascaded_biquad_filter.h; sourceTree = ""; }; + 691E04FD21A4FD7600F838EF /* matched_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = matched_filter.h; sourceTree = ""; }; + 691E04FE21A4FD7600F838EF /* subtractor_output.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = subtractor_output.h; sourceTree = ""; }; + 691E04FF21A4FD7600F838EF /* render_signal_analyzer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_signal_analyzer.h; sourceTree = ""; }; + 691E050021A4FD7600F838EF /* aec3_fft.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec3_fft.cc; sourceTree = ""; }; + 691E050121A4FD7600F838EF /* aec3_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec3_fft.h; sourceTree = ""; }; + 691E050221A4FD7600F838EF /* echo_remover_metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_remover_metrics.h; sourceTree = ""; }; + 691E050321A4FD7600F838EF /* fullband_erle_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fullband_erle_estimator.cc; sourceTree = ""; }; + 691E050421A4FD7600F838EF /* suppression_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = suppression_filter.cc; sourceTree = ""; }; + 691E050521A4FD7600F838EF /* block_processor.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_processor.cc; sourceTree = ""; }; + 691E050621A4FD7600F838EF /* filter_analyzer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filter_analyzer.h; sourceTree = ""; }; + 691E050721A4FD7600F838EF /* subtractor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = subtractor.h; sourceTree = ""; }; + 691E050821A4FD7600F838EF /* echo_path_delay_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_path_delay_estimator.h; sourceTree = ""; }; + 691E050921A4FD7600F838EF /* subband_erle_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = subband_erle_estimator.cc; sourceTree = ""; }; + 691E050A21A4FD7600F838EF /* render_delay_controller_metrics.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_delay_controller_metrics.cc; sourceTree = ""; }; + 691E050B21A4FD7600F838EF /* render_delay_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_delay_buffer.cc; sourceTree = ""; }; + 691E050C21A4FD7600F838EF /* block_processor_metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_processor_metrics.h; sourceTree = ""; }; + 691E050D21A4FD7600F838EF /* vector_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vector_buffer.cc; sourceTree = ""; }; + 691E050E21A4FD7600F838EF /* erl_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = erl_estimator.cc; sourceTree = ""; }; + 691E050F21A4FD7600F838EF /* aec_state.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_state.cc; sourceTree = ""; }; + 691E051021A4FD7600F838EF /* adaptive_fir_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = adaptive_fir_filter.cc; sourceTree = ""; }; + 691E051121A4FD7600F838EF /* fft_data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft_data.h; sourceTree = ""; }; + 691E051221A4FD7600F838EF /* render_delay_controller.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_delay_controller.cc; sourceTree = ""; }; + 691E051321A4FD7600F838EF /* skew_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = skew_estimator.cc; sourceTree = ""; }; + 691E051421A4FD7600F838EF /* render_delay_controller_metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_delay_controller_metrics.h; sourceTree = ""; }; + 691E051521A4FD7600F838EF /* comfort_noise_generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = comfort_noise_generator.h; sourceTree = ""; }; + 691E051621A4FD7600F838EF /* echo_path_delay_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_path_delay_estimator.cc; sourceTree = ""; }; + 691E051721A4FD7600F838EF /* erl_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = erl_estimator.h; sourceTree = ""; }; + 691E051821A4FD7600F838EF /* echo_remover.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_remover.h; sourceTree = ""; }; + 691E051921A4FD7600F838EF /* block_framer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_framer.cc; sourceTree = ""; }; + 691E051A21A4FD7600F838EF /* erle_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = erle_estimator.cc; sourceTree = ""; }; + 691E051B21A4FD7600F838EF /* reverb_model.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reverb_model.cc; sourceTree = ""; }; + 691E051C21A4FD7600F838EF /* cascaded_biquad_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cascaded_biquad_filter.cc; sourceTree = ""; }; + 691E051D21A4FD7600F838EF /* matrix_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = matrix_buffer.h; sourceTree = ""; }; + 691E051E21A4FD7600F838EF /* render_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_buffer.cc; sourceTree = ""; }; + 691E051F21A4FD7600F838EF /* reverb_model_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reverb_model_estimator.h; sourceTree = ""; }; + 691E052021A4FD7600F838EF /* subtractor_output.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = subtractor_output.cc; sourceTree = ""; }; + 691E052121A4FD7600F838EF /* stationarity_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stationarity_estimator.cc; sourceTree = ""; }; + 691E052221A4FD7600F838EF /* render_signal_analyzer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_signal_analyzer.cc; sourceTree = ""; }; + 691E052321A4FD7600F838EF /* echo_path_variability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_path_variability.h; sourceTree = ""; }; + 691E052421A4FD7600F838EF /* moving_average.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = moving_average.h; sourceTree = ""; }; + 691E052521A4FD7600F838EF /* render_reverb_model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_reverb_model.h; sourceTree = ""; }; + 691E052621A4FD7600F838EF /* subtractor_output_analyzer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = subtractor_output_analyzer.cc; sourceTree = ""; }; + 691E052721A4FD7600F838EF /* suppression_gain.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = suppression_gain.cc; sourceTree = ""; }; + 691E052821A4FD7600F838EF /* echo_audibility.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_audibility.cc; sourceTree = ""; }; + 691E052921A4FD7600F838EF /* block_processor_metrics.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_processor_metrics.cc; sourceTree = ""; }; + 691E052A21A4FD7600F838EF /* render_delay_controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_delay_controller.h; sourceTree = ""; }; + 691E052B21A4FD7600F838EF /* suppression_gain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = suppression_gain.h; sourceTree = ""; }; + 691E052C21A4FD7600F838EF /* moving_average.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moving_average.cc; sourceTree = ""; }; + 691E052D21A4FD7600F838EF /* erle_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = erle_estimator.h; sourceTree = ""; }; + 691E052E21A4FD7600F838EF /* subband_erle_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = subband_erle_estimator.h; sourceTree = ""; }; + 691E052F21A4FD7600F838EF /* reverb_model_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reverb_model_estimator.cc; sourceTree = ""; }; + 691E053021A4FD7600F838EF /* aec3_common.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec3_common.cc; sourceTree = ""; }; + 691E053121A4FD7600F838EF /* residual_echo_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = residual_echo_estimator.cc; sourceTree = ""; }; + 691E053221A4FD7600F838EF /* block_processor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_processor.h; sourceTree = ""; }; + 691E053321A4FD7600F838EF /* fullband_erle_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fullband_erle_estimator.h; sourceTree = ""; }; + 691E053421A4FD7600F838EF /* matched_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = matched_filter.cc; sourceTree = ""; }; + 691E053521A4FD7600F838EF /* stationarity_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stationarity_estimator.h; sourceTree = ""; }; + 691E053621A4FD7600F838EF /* echo_canceller3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_canceller3.h; sourceTree = ""; }; + 691E053721A4FD7600F838EF /* skew_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = skew_estimator.h; sourceTree = ""; }; + 691E053821A4FD7600F838EF /* reverb_decay_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reverb_decay_estimator.cc; sourceTree = ""; }; + 691E053921A4FD7600F838EF /* render_delay_controller2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_delay_controller2.cc; sourceTree = ""; }; + 691E053A21A4FD7600F838EF /* render_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_buffer.h; sourceTree = ""; }; + 691E053B21A4FD7600F838EF /* suppression_gain_limiter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = suppression_gain_limiter.cc; sourceTree = ""; }; + 691E053C21A4FD7600F838EF /* main_filter_update_gain.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main_filter_update_gain.cc; sourceTree = ""; }; + 691E053D21A4FD7600F838EF /* echo_remover.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_remover.cc; sourceTree = ""; }; + 691E053E21A4FD7600F838EF /* reverb_model_fallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reverb_model_fallback.h; sourceTree = ""; }; + 691E053F21A4FD7600F838EF /* downsampled_render_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = downsampled_render_buffer.cc; sourceTree = ""; }; + 691E054021A4FD7600F838EF /* vector_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vector_buffer.h; sourceTree = ""; }; + 691E054121A4FD7600F838EF /* matrix_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = matrix_buffer.cc; sourceTree = ""; }; + 691E054221A4FD7600F838EF /* reverb_frequency_response.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reverb_frequency_response.h; sourceTree = ""; }; + 691E054321A4FD7600F838EF /* echo_audibility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_audibility.h; sourceTree = ""; }; + 691E054421A4FD7600F838EF /* fft_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft_buffer.h; sourceTree = ""; }; + 691E054521A4FD7600F838EF /* block_processor2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_processor2.cc; sourceTree = ""; }; + 691E054621A4FD7600F838EF /* echo_canceller3.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_canceller3.cc; sourceTree = ""; }; + 691E054721A4FD7600F838EF /* block_delay_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_delay_buffer.cc; sourceTree = ""; }; + 691E054821A4FD7600F838EF /* aec3_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec3_common.h; sourceTree = ""; }; + 691E054921A4FD7600F838EF /* fft_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fft_buffer.cc; sourceTree = ""; }; + 691E054A21A4FD7600F838EF /* vector_math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vector_math.h; sourceTree = ""; }; + 691E054B21A4FD7600F838EF /* decimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decimator.h; sourceTree = ""; }; + 691E054C21A4FD7600F838EF /* frame_blocker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = frame_blocker.h; sourceTree = ""; }; + 691E054D21A4FD7600F838EF /* block_framer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_framer.h; sourceTree = ""; }; + 691E054E21A4FD7600F838EF /* suppression_gain_limiter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = suppression_gain_limiter.h; sourceTree = ""; }; + 691E054F21A4FD7600F838EF /* delay_estimate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimate.h; sourceTree = ""; }; + 691E055021A4FD7600F838EF /* comfort_noise_generator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = comfort_noise_generator.cc; sourceTree = ""; }; + 691E055121A4FD7600F838EF /* reverb_model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reverb_model.h; sourceTree = ""; }; + 691E055221A4FD7600F838EF /* main_filter_update_gain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = main_filter_update_gain.h; sourceTree = ""; }; + 691E055321A4FD7600F838EF /* matched_filter_lag_aggregator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = matched_filter_lag_aggregator.h; sourceTree = ""; }; + 691E055421A4FD7600F838EF /* shadow_filter_update_gain.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shadow_filter_update_gain.cc; sourceTree = ""; }; + 691E055521A4FD7600F838EF /* filter_analyzer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filter_analyzer.cc; sourceTree = ""; }; + 691E055621A4FD7600F838EF /* reverb_decay_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reverb_decay_estimator.h; sourceTree = ""; }; + 691E055721A4FD7600F838EF /* reverb_frequency_response.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reverb_frequency_response.cc; sourceTree = ""; }; + 691E055821A4FD7600F838EF /* decimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = decimator.cc; sourceTree = ""; }; + 691E055921A4FD7600F838EF /* render_delay_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_delay_buffer.h; sourceTree = ""; }; + 691E055A21A4FD7600F838EF /* echo_control_mobile_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_control_mobile_impl.cc; sourceTree = ""; }; + 691E055B21A4FD7600F838EF /* gain_control_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_control_impl.h; sourceTree = ""; }; + 691E055C21A4FD7600F838EF /* typing_detection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typing_detection.h; sourceTree = ""; }; + 691E055E21A4FD7600F838EF /* apm_data_dumper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = apm_data_dumper.cc; sourceTree = ""; }; + 691E055F21A4FD7600F838EF /* apm_data_dumper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apm_data_dumper.h; sourceTree = ""; }; + 691E056121A4FD7600F838EF /* voice_activity_detector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = voice_activity_detector.cc; sourceTree = ""; }; + 691E056221A4FD7600F838EF /* standalone_vad.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = standalone_vad.cc; sourceTree = ""; }; + 691E056321A4FD7600F838EF /* vad_audio_proc_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_audio_proc_internal.h; sourceTree = ""; }; + 691E056421A4FD7600F838EF /* pitch_internal.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pitch_internal.cc; sourceTree = ""; }; + 691E056521A4FD7600F838EF /* vad_circular_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vad_circular_buffer.cc; sourceTree = ""; }; + 691E056621A4FD7600F838EF /* vad_circular_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_circular_buffer.h; sourceTree = ""; }; + 691E056721A4FD7600F838EF /* pitch_based_vad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_based_vad.h; sourceTree = ""; }; + 691E056821A4FD7600F838EF /* vad_audio_proc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vad_audio_proc.cc; sourceTree = ""; }; + 691E056921A4FD7600F838EF /* pole_zero_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pole_zero_filter.cc; sourceTree = ""; }; + 691E056A21A4FD7600F838EF /* pole_zero_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pole_zero_filter.h; sourceTree = ""; }; + 691E056B21A4FD7600F838EF /* pitch_based_vad.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pitch_based_vad.cc; sourceTree = ""; }; + 691E056C21A4FD7600F838EF /* gmm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gmm.h; sourceTree = ""; }; + 691E056D21A4FD7600F838EF /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; + 691E056E21A4FD7600F838EF /* vad_audio_proc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vad_audio_proc.h; sourceTree = ""; }; + 691E056F21A4FD7600F838EF /* voice_gmm_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = voice_gmm_tables.h; sourceTree = ""; }; + 691E057021A4FD7600F838EF /* noise_gmm_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_gmm_tables.h; sourceTree = ""; }; + 691E057121A4FD7600F838EF /* pitch_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch_internal.h; sourceTree = ""; }; + 691E057221A4FD7600F838EF /* gmm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gmm.cc; sourceTree = ""; }; + 691E057321A4FD7600F838EF /* standalone_vad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = standalone_vad.h; sourceTree = ""; }; + 691E057421A4FD7600F838EF /* voice_activity_detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = voice_activity_detector.h; sourceTree = ""; }; + 691E057621A4FD7600F838EF /* ooura_fft_tables_neon_sse2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft_tables_neon_sse2.h; sourceTree = ""; }; + 691E057721A4FD7600F838EF /* delay_estimator_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator_internal.h; sourceTree = ""; }; + 691E057821A4FD7600F838EF /* ooura_fft.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft.cc; sourceTree = ""; }; + 691E057921A4FD7600F838EF /* ooura_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft.h; sourceTree = ""; }; + 691E057A21A4FD7600F838EF /* delay_estimator_wrapper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = delay_estimator_wrapper.cc; sourceTree = ""; }; + 691E057B21A4FD7600F838EF /* ooura_fft_sse2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft_sse2.cc; sourceTree = ""; }; + 691E057C21A4FD7600F838EF /* delay_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = delay_estimator.cc; sourceTree = ""; }; + 691E057D21A4FD7600F838EF /* block_mean_calculator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_mean_calculator.h; sourceTree = ""; }; + 691E057E21A4FD7600F838EF /* ooura_fft_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft_neon.cc; sourceTree = ""; }; + 691E057F21A4FD7600F838EF /* block_mean_calculator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_mean_calculator.cc; sourceTree = ""; }; + 691E058021A4FD7600F838EF /* delay_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator.h; sourceTree = ""; }; + 691E058121A4FD7600F838EF /* ooura_fft_tables_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft_tables_common.h; sourceTree = ""; }; + 691E058221A4FD7600F838EF /* delay_estimator_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator_wrapper.h; sourceTree = ""; }; + 691E058421A4FD7600F838EF /* string_to_number.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_to_number.h; sourceTree = ""; }; + 691E058521A4FD7600F838EF /* constructormagic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constructormagic.h; sourceTree = ""; }; + 691E058621A4FD7600F838EF /* race_checker.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = race_checker.cc; sourceTree = ""; }; + 691E058821A4FD7600F838EF /* string_builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_builder.h; sourceTree = ""; }; + 691E058921A4FD7600F838EF /* string_builder.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = string_builder.cc; sourceTree = ""; }; + 691E058A21A4FD7600F838EF /* event_tracer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = event_tracer.h; sourceTree = ""; }; + 691E058B21A4FD7600F838EF /* stringencode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringencode.h; sourceTree = ""; }; + 691E058D21A4FD7600F838EF /* aligned_malloc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aligned_malloc.cc; sourceTree = ""; }; + 691E058E21A4FD7600F838EF /* aligned_malloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aligned_malloc.h; sourceTree = ""; }; + 691E058F21A4FD7600F838EF /* timeutils.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = timeutils.cc; sourceTree = ""; }; + 691E059021A4FD7600F838EF /* event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = event.h; sourceTree = ""; }; + 691E059121A4FD7600F838EF /* logging_mac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = logging_mac.mm; sourceTree = ""; }; + 691E059221A4FD7600F838EF /* ignore_wundef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ignore_wundef.h; sourceTree = ""; }; + 691E059321A4FD7600F838EF /* stringutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringutils.h; sourceTree = ""; }; + 691E059421A4FD7600F838EF /* arraysize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arraysize.h; sourceTree = ""; }; + 691E059521A4FD7600F838EF /* platform_file.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = platform_file.cc; sourceTree = ""; }; + 691E059621A4FD7600F838EF /* swap_queue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = swap_queue.h; sourceTree = ""; }; + 691E059721A4FD7600F838EF /* string_to_number.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = string_to_number.cc; sourceTree = ""; }; + 691E059821A4FD7600F838EF /* trace_event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = trace_event.h; sourceTree = ""; }; + 691E059921A4FD7600F838EF /* checks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = checks.h; sourceTree = ""; }; + 691E059A21A4FD7600F838EF /* deprecation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = deprecation.h; sourceTree = ""; }; + 691E059B21A4FD7600F838EF /* thread_checker_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = thread_checker_impl.cc; sourceTree = ""; }; + 691E059C21A4FD7600F838EF /* sanitizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sanitizer.h; sourceTree = ""; }; + 691E059D21A4FD7600F838EF /* scoped_ref_ptr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scoped_ref_ptr.h; sourceTree = ""; }; + 691E059E21A4FD7600F838EF /* logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logging.h; sourceTree = ""; }; + 691E059F21A4FD7600F838EF /* timeutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timeutils.h; sourceTree = ""; }; + 691E05A021A4FD7600F838EF /* atomicops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = atomicops.h; sourceTree = ""; }; + 691E05A121A4FD7600F838EF /* stringencode.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringencode.cc; sourceTree = ""; }; + 691E05A221A4FD7600F838EF /* stringutils.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringutils.cc; sourceTree = ""; }; + 691E05A321A4FD7600F838EF /* checks.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = checks.cc; sourceTree = ""; }; + 691E05A521A4FD7600F838EF /* safe_minmax.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_minmax.h; sourceTree = ""; }; + 691E05A621A4FD7600F838EF /* safe_conversions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_conversions.h; sourceTree = ""; }; + 691E05A721A4FD7600F838EF /* safe_conversions_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_conversions_impl.h; sourceTree = ""; }; + 691E05A821A4FD7600F838EF /* safe_compare.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_compare.h; sourceTree = ""; }; + 691E05AA21A4FD7600F838EF /* unused.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unused.h; sourceTree = ""; }; + 691E05AB21A4FD7600F838EF /* inline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline.h; sourceTree = ""; }; + 691E05AC21A4FD7600F838EF /* ignore_warnings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ignore_warnings.h; sourceTree = ""; }; + 691E05AD21A4FD7600F838EF /* asm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asm_defines.h; sourceTree = ""; }; + 691E05AE21A4FD7600F838EF /* rtc_export.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rtc_export.h; sourceTree = ""; }; + 691E05AF21A4FD7600F838EF /* arch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arch.h; sourceTree = ""; }; + 691E05B021A4FD7600F838EF /* platform_thread.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = platform_thread.cc; sourceTree = ""; }; + 691E05B121A4FD7600F838EF /* platform_thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_thread.h; sourceTree = ""; }; + 691E05B221A4FD7600F838EF /* logging_webrtc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = logging_webrtc.cc; sourceTree = ""; }; + 691E05B321A4FD7600F838EF /* platform_thread_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_thread_types.h; sourceTree = ""; }; + 691E05B421A4FD7600F838EF /* protobuf_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = protobuf_utils.h; sourceTree = ""; }; + 691E05B521A4FD7600F838EF /* thread_annotations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread_annotations.h; sourceTree = ""; }; + 691E05B621A4FD7600F838EF /* gtest_prod_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest_prod_util.h; sourceTree = ""; }; + 691E05B721A4FD7600F838EF /* function_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function_view.h; sourceTree = ""; }; + 691E05B821A4FD7600F838EF /* criticalsection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = criticalsection.h; sourceTree = ""; }; + 691E05B921A4FD7600F838EF /* criticalsection.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = criticalsection.cc; sourceTree = ""; }; + 691E05BA21A4FD7600F838EF /* platform_thread_types.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = platform_thread_types.cc; sourceTree = ""; }; + 691E05BB21A4FD7600F838EF /* refcount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = refcount.h; sourceTree = ""; }; + 691E05BC21A4FD7600F838EF /* event.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = event.cc; sourceTree = ""; }; + 691E05BD21A4FD7600F838EF /* thread_checker_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread_checker_impl.h; sourceTree = ""; }; + 691E05BE21A4FD7600F838EF /* event_tracer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = event_tracer.cc; sourceTree = ""; }; + 691E05BF21A4FD7600F838EF /* compile_assert_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compile_assert_c.h; sourceTree = ""; }; + 691E05C021A4FD7600F838EF /* type_traits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type_traits.h; sourceTree = ""; }; + 691E05C121A4FD7600F838EF /* platform_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_file.h; sourceTree = ""; }; + 691E05C221A4FD7600F838EF /* refcounter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = refcounter.h; sourceTree = ""; }; + 691E05C321A4FD7600F838EF /* logging_mac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logging_mac.h; sourceTree = ""; }; + 691E05C421A4FD7600F838EF /* thread_checker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread_checker.h; sourceTree = ""; }; + 691E05C521A4FD7600F838EF /* race_checker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = race_checker.h; sourceTree = ""; }; + 691E05C621A4FD7600F838EF /* refcountedobject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = refcountedobject.h; sourceTree = ""; }; 692AB8881E6759DD00706ACC /* AudioInput.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AudioInput.cpp; path = audio/AudioInput.cpp; sourceTree = SOURCE_ROOT; }; 692AB8891E6759DD00706ACC /* AudioInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AudioInput.h; path = audio/AudioInput.h; sourceTree = SOURCE_ROOT; }; 692AB88A1E6759DD00706ACC /* AudioOutput.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AudioOutput.cpp; path = audio/AudioOutput.cpp; sourceTree = SOURCE_ROOT; }; @@ -299,6 +1020,10 @@ 692AB91C1E675F7000706ACC /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 692AB91D1E675F7000706ACC /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; 692AB91E1E675F7000706ACC /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; + 694DE89C219F2265009C09A7 /* VideoRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoRenderer.h; sourceTree = ""; }; + 694DE89D219F2265009C09A7 /* VideoRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VideoRenderer.cpp; sourceTree = ""; }; + 694DE89E219F2265009C09A7 /* VideoSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VideoSource.cpp; sourceTree = ""; }; + 694DE89F219F2265009C09A7 /* VideoSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoSource.h; sourceTree = ""; }; 695B20601EBD39FF00E31757 /* DarwinSpecific.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DarwinSpecific.h; path = os/darwin/DarwinSpecific.h; sourceTree = SOURCE_ROOT; }; 6971220D20C8107E00971C2C /* PacketReassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PacketReassembler.cpp; sourceTree = SOURCE_ROOT; }; 6971220E20C8107F00971C2C /* PacketReassembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketReassembler.h; sourceTree = SOURCE_ROOT; }; @@ -315,137 +1040,7 @@ 697B6FDC2136E673004C8E54 /* utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; 697B6FDD2136F01E004C8E54 /* MockReflector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockReflector.h; sourceTree = ""; }; 697B6FDE2136F01E004C8E54 /* MockReflector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = MockReflector.cpp; sourceTree = ""; }; - 69A6DE231E96149300000E69 /* array_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = array_view.h; sourceTree = ""; }; - 69A6DE241E96149300000E69 /* atomicops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = atomicops.h; sourceTree = ""; }; - 69A6DE251E96149300000E69 /* basictypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = basictypes.h; sourceTree = ""; }; - 69A6DE261E96149300000E69 /* checks.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = checks.cc; sourceTree = ""; }; - 69A6DE271E96149300000E69 /* checks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = checks.h; sourceTree = ""; }; - 69A6DE281E96149300000E69 /* constructormagic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constructormagic.h; sourceTree = ""; }; - 69A6DE291E96149300000E69 /* safe_compare.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_compare.h; sourceTree = ""; }; - 69A6DE2A1E96149300000E69 /* safe_conversions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_conversions.h; sourceTree = ""; }; - 69A6DE2B1E96149300000E69 /* safe_conversions_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_conversions_impl.h; sourceTree = ""; }; - 69A6DE2C1E96149300000E69 /* sanitizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sanitizer.h; sourceTree = ""; }; - 69A6DE2D1E96149300000E69 /* stringutils.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringutils.cc; sourceTree = ""; }; - 69A6DE2E1E96149300000E69 /* stringutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringutils.h; sourceTree = ""; }; - 69A6DE2F1E96149300000E69 /* type_traits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type_traits.h; sourceTree = ""; }; - 69A6DE311E96149300000E69 /* audio_util.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_util.cc; sourceTree = ""; }; - 69A6DE321E96149300000E69 /* channel_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = channel_buffer.cc; sourceTree = ""; }; - 69A6DE331E96149300000E69 /* channel_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = channel_buffer.h; sourceTree = ""; }; - 69A6DE341E96149300000E69 /* fft4g.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fft4g.c; sourceTree = ""; }; - 69A6DE351E96149300000E69 /* fft4g.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft4g.h; sourceTree = ""; }; - 69A6DE371E96149300000E69 /* audio_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_util.h; sourceTree = ""; }; - 69A6DE381E96149300000E69 /* ring_buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ring_buffer.c; sourceTree = ""; }; - 69A6DE391E96149300000E69 /* ring_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ring_buffer.h; sourceTree = ""; }; - 69A6DE3B1E96149300000E69 /* auto_corr_to_refl_coef.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = auto_corr_to_refl_coef.c; sourceTree = ""; }; - 69A6DE3C1E96149300000E69 /* auto_correlation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = auto_correlation.c; sourceTree = ""; }; - 69A6DE3D1E96149300000E69 /* complex_bit_reverse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = complex_bit_reverse.c; sourceTree = ""; }; - 69A6DE3F1E96149300000E69 /* complex_fft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = complex_fft.c; sourceTree = ""; }; - 69A6DE401E96149300000E69 /* complex_fft_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = complex_fft_tables.h; sourceTree = ""; }; - 69A6DE411E96149300000E69 /* copy_set_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = copy_set_operations.c; sourceTree = ""; }; - 69A6DE421E96149300000E69 /* cross_correlation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cross_correlation.c; sourceTree = ""; }; - 69A6DE431E96149300000E69 /* cross_correlation_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cross_correlation_neon.c; sourceTree = ""; }; - 69A6DE441E96149300000E69 /* division_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = division_operations.c; sourceTree = ""; }; - 69A6DE451E96149300000E69 /* dot_product_with_scale.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dot_product_with_scale.c; sourceTree = ""; }; - 69A6DE461E96149300000E69 /* downsample_fast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = downsample_fast.c; sourceTree = ""; }; - 69A6DE471E96149300000E69 /* downsample_fast_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = downsample_fast_neon.c; sourceTree = ""; }; - 69A6DE481E96149300000E69 /* energy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = energy.c; sourceTree = ""; }; - 69A6DE491E96149300000E69 /* filter_ar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ar.c; sourceTree = ""; }; - 69A6DE4A1E96149300000E69 /* filter_ar_fast_q12.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ar_fast_q12.c; sourceTree = ""; }; - 69A6DE4C1E96149300000E69 /* filter_ma_fast_q12.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ma_fast_q12.c; sourceTree = ""; }; - 69A6DE4D1E96149300000E69 /* get_hanning_window.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = get_hanning_window.c; sourceTree = ""; }; - 69A6DE4E1E96149300000E69 /* get_scaling_square.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = get_scaling_square.c; sourceTree = ""; }; - 69A6DE4F1E96149300000E69 /* ilbc_specific_functions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ilbc_specific_functions.c; sourceTree = ""; }; - 69A6DE511E96149300000E69 /* real_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = real_fft.h; sourceTree = ""; }; - 69A6DE521E96149300000E69 /* signal_processing_library.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = signal_processing_library.h; sourceTree = ""; }; - 69A6DE531E96149300000E69 /* spl_inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl.h; sourceTree = ""; }; - 69A6DE541E96149300000E69 /* spl_inl_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl_armv7.h; sourceTree = ""; }; - 69A6DE551E96149300000E69 /* spl_inl_mips.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl_mips.h; sourceTree = ""; }; - 69A6DE561E96149300000E69 /* levinson_durbin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = levinson_durbin.c; sourceTree = ""; }; - 69A6DE571E96149300000E69 /* lpc_to_refl_coef.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_to_refl_coef.c; sourceTree = ""; }; - 69A6DE581E96149300000E69 /* min_max_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = min_max_operations.c; sourceTree = ""; }; - 69A6DE591E96149300000E69 /* min_max_operations_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = min_max_operations_neon.c; sourceTree = ""; }; - 69A6DE5A1E96149300000E69 /* randomization_functions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = randomization_functions.c; sourceTree = ""; }; - 69A6DE5B1E96149300000E69 /* real_fft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = real_fft.c; sourceTree = ""; }; - 69A6DE5C1E96149300000E69 /* refl_coef_to_lpc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = refl_coef_to_lpc.c; sourceTree = ""; }; - 69A6DE5D1E96149300000E69 /* resample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample.c; sourceTree = ""; }; - 69A6DE5E1E96149300000E69 /* resample_48khz.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_48khz.c; sourceTree = ""; }; - 69A6DE5F1E96149300000E69 /* resample_by_2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_by_2.c; sourceTree = ""; }; - 69A6DE601E96149300000E69 /* resample_by_2_internal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_by_2_internal.c; sourceTree = ""; }; - 69A6DE611E96149300000E69 /* resample_by_2_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resample_by_2_internal.h; sourceTree = ""; }; - 69A6DE621E96149300000E69 /* resample_fractional.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_fractional.c; sourceTree = ""; }; - 69A6DE631E96149300000E69 /* spl_init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_init.c; sourceTree = ""; }; - 69A6DE641E96149300000E69 /* spl_inl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_inl.c; sourceTree = ""; }; - 69A6DE651E96149300000E69 /* spl_sqrt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_sqrt.c; sourceTree = ""; }; - 69A6DE661E96149300000E69 /* spl_sqrt_floor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_sqrt_floor.c; sourceTree = ""; }; - 69A6DE681E96149300000E69 /* splitting_filter_impl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = splitting_filter_impl.c; sourceTree = ""; }; - 69A6DE691E96149300000E69 /* sqrt_of_one_minus_x_squared.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sqrt_of_one_minus_x_squared.c; sourceTree = ""; }; - 69A6DE6A1E96149300000E69 /* vector_scaling_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vector_scaling_operations.c; sourceTree = ""; }; - 69A6DE6B1E96149300000E69 /* sparse_fir_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sparse_fir_filter.cc; sourceTree = ""; }; - 69A6DE6C1E96149300000E69 /* sparse_fir_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sparse_fir_filter.h; sourceTree = ""; }; - 69A6DE6D1E96149300000E69 /* wav_file.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wav_file.cc; sourceTree = ""; }; - 69A6DE6E1E96149300000E69 /* wav_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wav_file.h; sourceTree = ""; }; - 69A6DE6F1E96149300000E69 /* wav_header.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wav_header.cc; sourceTree = ""; }; - 69A6DE701E96149300000E69 /* wav_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wav_header.h; sourceTree = ""; }; - 69A6DE741E96149300000E69 /* aec_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aec_common.h; path = webrtc_dsp/webrtc/modules/audio_processing/aec/aec_common.h; sourceTree = SOURCE_ROOT; }; - 69A6DE751E96149300000E69 /* aec_core.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = aec_core.cc; path = webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core.cc; sourceTree = SOURCE_ROOT; }; - 69A6DE761E96149300000E69 /* aec_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aec_core.h; path = webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core.h; sourceTree = SOURCE_ROOT; }; - 69A6DE771E96149300000E69 /* aec_core_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = aec_core_neon.cc; path = webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_neon.cc; sourceTree = SOURCE_ROOT; }; - 69A6DE781E96149300000E69 /* aec_core_optimized_methods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aec_core_optimized_methods.h; path = webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_optimized_methods.h; sourceTree = SOURCE_ROOT; }; - 69A6DE791E96149300000E69 /* aec_core_sse2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = aec_core_sse2.cc; path = webrtc_dsp/webrtc/modules/audio_processing/aec/aec_core_sse2.cc; sourceTree = SOURCE_ROOT; }; - 69A6DE7A1E96149300000E69 /* aec_resampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = aec_resampler.cc; path = webrtc_dsp/webrtc/modules/audio_processing/aec/aec_resampler.cc; sourceTree = SOURCE_ROOT; }; - 69A6DE7B1E96149300000E69 /* aec_resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aec_resampler.h; path = webrtc_dsp/webrtc/modules/audio_processing/aec/aec_resampler.h; sourceTree = SOURCE_ROOT; }; - 69A6DE7C1E96149300000E69 /* echo_cancellation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = echo_cancellation.cc; path = webrtc_dsp/webrtc/modules/audio_processing/aec/echo_cancellation.cc; sourceTree = SOURCE_ROOT; }; - 69A6DE7D1E96149300000E69 /* echo_cancellation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = echo_cancellation.h; path = webrtc_dsp/webrtc/modules/audio_processing/aec/echo_cancellation.h; sourceTree = SOURCE_ROOT; }; - 69A6DE7F1E96149300000E69 /* aecm_core.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = aecm_core.cc; path = webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core.cc; sourceTree = SOURCE_ROOT; }; - 69A6DE801E96149300000E69 /* aecm_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aecm_core.h; path = webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core.h; sourceTree = SOURCE_ROOT; }; - 69A6DE811E96149300000E69 /* aecm_core_c.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = aecm_core_c.cc; path = webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core_c.cc; sourceTree = SOURCE_ROOT; }; - 69A6DE821E96149300000E69 /* aecm_core_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = aecm_core_neon.cc; path = webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_core_neon.cc; sourceTree = SOURCE_ROOT; }; - 69A6DE831E96149300000E69 /* aecm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aecm_defines.h; path = webrtc_dsp/webrtc/modules/audio_processing/aecm/aecm_defines.h; sourceTree = SOURCE_ROOT; }; - 69A6DE841E96149300000E69 /* echo_control_mobile.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = echo_control_mobile.cc; path = webrtc_dsp/webrtc/modules/audio_processing/aecm/echo_control_mobile.cc; sourceTree = SOURCE_ROOT; }; - 69A6DE851E96149300000E69 /* echo_control_mobile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = echo_control_mobile.h; path = webrtc_dsp/webrtc/modules/audio_processing/aecm/echo_control_mobile.h; sourceTree = SOURCE_ROOT; }; - 69A6DE881E96149300000E69 /* analog_agc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = analog_agc.c; path = webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/analog_agc.c; sourceTree = SOURCE_ROOT; }; - 69A6DE891E96149300000E69 /* analog_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = analog_agc.h; path = webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/analog_agc.h; sourceTree = SOURCE_ROOT; }; - 69A6DE8A1E96149300000E69 /* digital_agc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = digital_agc.c; path = webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/digital_agc.c; sourceTree = SOURCE_ROOT; }; - 69A6DE8B1E96149300000E69 /* digital_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = digital_agc.h; path = webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/digital_agc.h; sourceTree = SOURCE_ROOT; }; - 69A6DE8C1E96149300000E69 /* gain_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gain_control.h; path = webrtc_dsp/webrtc/modules/audio_processing/agc/legacy/gain_control.h; sourceTree = SOURCE_ROOT; }; - 69A6DE8E1E96149300000E69 /* apm_data_dumper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = apm_data_dumper.cc; path = webrtc_dsp/webrtc/modules/audio_processing/logging/apm_data_dumper.cc; sourceTree = SOURCE_ROOT; }; - 69A6DE8F1E96149300000E69 /* apm_data_dumper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = apm_data_dumper.h; path = webrtc_dsp/webrtc/modules/audio_processing/logging/apm_data_dumper.h; sourceTree = SOURCE_ROOT; }; - 69A6DE911E96149300000E69 /* defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = defines.h; path = webrtc_dsp/webrtc/modules/audio_processing/ns/defines.h; sourceTree = SOURCE_ROOT; }; - 69A6DE921E96149300000E69 /* noise_suppression.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = noise_suppression.c; path = webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression.c; sourceTree = SOURCE_ROOT; }; - 69A6DE931E96149300000E69 /* noise_suppression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = noise_suppression.h; path = webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression.h; sourceTree = SOURCE_ROOT; }; - 69A6DE941E96149300000E69 /* noise_suppression_x.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = noise_suppression_x.c; path = webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression_x.c; sourceTree = SOURCE_ROOT; }; - 69A6DE951E96149300000E69 /* noise_suppression_x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = noise_suppression_x.h; path = webrtc_dsp/webrtc/modules/audio_processing/ns/noise_suppression_x.h; sourceTree = SOURCE_ROOT; }; - 69A6DE961E96149300000E69 /* ns_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ns_core.c; path = webrtc_dsp/webrtc/modules/audio_processing/ns/ns_core.c; sourceTree = SOURCE_ROOT; }; - 69A6DE971E96149300000E69 /* ns_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ns_core.h; path = webrtc_dsp/webrtc/modules/audio_processing/ns/ns_core.h; sourceTree = SOURCE_ROOT; }; - 69A6DE981E96149300000E69 /* nsx_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = nsx_core.c; path = webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core.c; sourceTree = SOURCE_ROOT; }; - 69A6DE991E96149300000E69 /* nsx_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = nsx_core.h; path = webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core.h; sourceTree = SOURCE_ROOT; }; - 69A6DE9A1E96149300000E69 /* nsx_core_c.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = nsx_core_c.c; path = webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core_c.c; sourceTree = SOURCE_ROOT; }; - 69A6DE9B1E96149300000E69 /* nsx_core_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = nsx_core_neon.c; path = webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_core_neon.c; sourceTree = SOURCE_ROOT; }; - 69A6DE9C1E96149300000E69 /* nsx_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = nsx_defines.h; path = webrtc_dsp/webrtc/modules/audio_processing/ns/nsx_defines.h; sourceTree = SOURCE_ROOT; }; - 69A6DE9D1E96149300000E69 /* windows_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = windows_private.h; path = webrtc_dsp/webrtc/modules/audio_processing/ns/windows_private.h; sourceTree = SOURCE_ROOT; }; - 69A6DE9E1E96149300000E69 /* splitting_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = splitting_filter.cc; path = webrtc_dsp/webrtc/modules/audio_processing/splitting_filter.cc; sourceTree = SOURCE_ROOT; }; - 69A6DE9F1E96149300000E69 /* splitting_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = splitting_filter.h; path = webrtc_dsp/webrtc/modules/audio_processing/splitting_filter.h; sourceTree = SOURCE_ROOT; }; - 69A6DEA01E96149300000E69 /* three_band_filter_bank.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = three_band_filter_bank.cc; path = webrtc_dsp/webrtc/modules/audio_processing/three_band_filter_bank.cc; sourceTree = SOURCE_ROOT; }; - 69A6DEA11E96149300000E69 /* three_band_filter_bank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = three_band_filter_bank.h; path = webrtc_dsp/webrtc/modules/audio_processing/three_band_filter_bank.h; sourceTree = SOURCE_ROOT; }; - 69A6DEA31E96149300000E69 /* block_mean_calculator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = block_mean_calculator.cc; path = webrtc_dsp/webrtc/modules/audio_processing/utility/block_mean_calculator.cc; sourceTree = SOURCE_ROOT; }; - 69A6DEA41E96149300000E69 /* block_mean_calculator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = block_mean_calculator.h; path = webrtc_dsp/webrtc/modules/audio_processing/utility/block_mean_calculator.h; sourceTree = SOURCE_ROOT; }; - 69A6DEA51E96149300000E69 /* delay_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = delay_estimator.cc; path = webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator.cc; sourceTree = SOURCE_ROOT; }; - 69A6DEA61E96149300000E69 /* delay_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = delay_estimator.h; path = webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator.h; sourceTree = SOURCE_ROOT; }; - 69A6DEA71E96149300000E69 /* delay_estimator_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = delay_estimator_internal.h; path = webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_internal.h; sourceTree = SOURCE_ROOT; }; - 69A6DEA81E96149300000E69 /* delay_estimator_wrapper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = delay_estimator_wrapper.cc; path = webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_wrapper.cc; sourceTree = SOURCE_ROOT; }; - 69A6DEA91E96149300000E69 /* delay_estimator_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = delay_estimator_wrapper.h; path = webrtc_dsp/webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h; sourceTree = SOURCE_ROOT; }; - 69A6DEAA1E96149300000E69 /* ooura_fft.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ooura_fft.cc; path = webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft.cc; sourceTree = SOURCE_ROOT; }; - 69A6DEAB1E96149300000E69 /* ooura_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ooura_fft.h; path = webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft.h; sourceTree = SOURCE_ROOT; }; - 69A6DEAC1E96149300000E69 /* ooura_fft_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ooura_fft_neon.cc; path = webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_neon.cc; sourceTree = SOURCE_ROOT; }; - 69A6DEAD1E96149300000E69 /* ooura_fft_sse2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ooura_fft_sse2.cc; path = webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc; sourceTree = SOURCE_ROOT; }; - 69A6DEAE1E96149300000E69 /* ooura_fft_tables_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ooura_fft_tables_common.h; path = webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_tables_common.h; sourceTree = SOURCE_ROOT; }; - 69A6DEAF1E96149300000E69 /* ooura_fft_tables_neon_sse2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ooura_fft_tables_neon_sse2.h; path = webrtc_dsp/webrtc/modules/audio_processing/utility/ooura_fft_tables_neon_sse2.h; sourceTree = SOURCE_ROOT; }; - 69A6DEB21E96149300000E69 /* asm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = asm_defines.h; path = webrtc_dsp/webrtc/system_wrappers/include/asm_defines.h; sourceTree = SOURCE_ROOT; }; - 69A6DEB31E96149300000E69 /* compile_assert_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = compile_assert_c.h; path = webrtc_dsp/webrtc/system_wrappers/include/compile_assert_c.h; sourceTree = SOURCE_ROOT; }; - 69A6DEB41E96149300000E69 /* cpu_features_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cpu_features_wrapper.h; path = webrtc_dsp/webrtc/system_wrappers/include/cpu_features_wrapper.h; sourceTree = SOURCE_ROOT; }; - 69A6DEB51E96149300000E69 /* metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = metrics.h; path = webrtc_dsp/webrtc/system_wrappers/include/metrics.h; sourceTree = SOURCE_ROOT; }; - 69A6DEB71E96149300000E69 /* cpu_features.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cpu_features.cc; path = webrtc_dsp/webrtc/system_wrappers/source/cpu_features.cc; sourceTree = SOURCE_ROOT; }; - 69A6DEB81E96149300000E69 /* typedefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = typedefs.h; path = webrtc_dsp/webrtc/typedefs.h; sourceTree = SOURCE_ROOT; }; + 69A2076421AF6289003AC4F9 /* json11.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = json11.cpp; sourceTree = ""; }; 69A6DF3F1E9614B700000E69 /* AudioInputAudioUnitOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AudioInputAudioUnitOSX.cpp; path = os/darwin/AudioInputAudioUnitOSX.cpp; sourceTree = SOURCE_ROOT; }; 69A6DF401E9614B700000E69 /* AudioInputAudioUnitOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AudioInputAudioUnitOSX.h; path = os/darwin/AudioInputAudioUnitOSX.h; sourceTree = SOURCE_ROOT; }; 69A6DF411E9614B700000E69 /* AudioOutputAudioUnitOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AudioOutputAudioUnitOSX.cpp; path = os/darwin/AudioOutputAudioUnitOSX.cpp; sourceTree = SOURCE_ROOT; }; @@ -492,6 +1087,1122 @@ path = posix; sourceTree = ""; }; + 691E032F21A4FD7500F838EF /* absl */ = { + isa = PBXGroup; + children = ( + 691E033021A4FD7500F838EF /* strings */, + 691E033821A4FD7500F838EF /* types */, + 691E033D21A4FD7500F838EF /* memory */, + 691E033F21A4FD7500F838EF /* meta */, + 691E034121A4FD7500F838EF /* algorithm */, + 691E034321A4FD7500F838EF /* container */, + 691E034521A4FD7500F838EF /* base */, + 691E035621A4FD7500F838EF /* utility */, + ); + path = absl; + sourceTree = ""; + }; + 691E033021A4FD7500F838EF /* strings */ = { + isa = PBXGroup; + children = ( + 691E033121A4FD7500F838EF /* internal */, + 691E033421A4FD7500F838EF /* string_view.cc */, + 691E033521A4FD7500F838EF /* ascii.h */, + 691E033621A4FD7500F838EF /* ascii.cc */, + 691E033721A4FD7500F838EF /* string_view.h */, + ); + path = strings; + sourceTree = ""; + }; + 691E033121A4FD7500F838EF /* internal */ = { + isa = PBXGroup; + children = ( + 691E033221A4FD7500F838EF /* memutil.h */, + 691E033321A4FD7500F838EF /* memutil.cc */, + ); + path = internal; + sourceTree = ""; + }; + 691E033821A4FD7500F838EF /* types */ = { + isa = PBXGroup; + children = ( + 691E033921A4FD7500F838EF /* optional.h */, + 691E033A21A4FD7500F838EF /* bad_optional_access.h */, + 691E033B21A4FD7500F838EF /* bad_optional_access.cc */, + 691E033C21A4FD7500F838EF /* optional.cc */, + ); + path = types; + sourceTree = ""; + }; + 691E033D21A4FD7500F838EF /* memory */ = { + isa = PBXGroup; + children = ( + 691E033E21A4FD7500F838EF /* memory.h */, + ); + path = memory; + sourceTree = ""; + }; + 691E033F21A4FD7500F838EF /* meta */ = { + isa = PBXGroup; + children = ( + 691E034021A4FD7500F838EF /* type_traits.h */, + ); + path = meta; + sourceTree = ""; + }; + 691E034121A4FD7500F838EF /* algorithm */ = { + isa = PBXGroup; + children = ( + 691E034221A4FD7500F838EF /* algorithm.h */, + ); + path = algorithm; + sourceTree = ""; + }; + 691E034321A4FD7500F838EF /* container */ = { + isa = PBXGroup; + children = ( + 691E034421A4FD7500F838EF /* inlined_vector.h */, + ); + path = container; + sourceTree = ""; + }; + 691E034521A4FD7500F838EF /* base */ = { + isa = PBXGroup; + children = ( + 691E034621A4FD7500F838EF /* policy_checks.h */, + 691E034721A4FD7500F838EF /* port.h */, + 691E034821A4FD7500F838EF /* config.h */, + 691E034921A4FD7500F838EF /* internal */, + 691E035221A4FD7500F838EF /* attributes.h */, + 691E035321A4FD7500F838EF /* macros.h */, + 691E035421A4FD7500F838EF /* optimization.h */, + 691E035521A4FD7500F838EF /* log_severity.h */, + ); + path = base; + sourceTree = ""; + }; + 691E034921A4FD7500F838EF /* internal */ = { + isa = PBXGroup; + children = ( + 691E034A21A4FD7500F838EF /* raw_logging.cc */, + 691E034B21A4FD7500F838EF /* throw_delegate.cc */, + 691E034C21A4FD7500F838EF /* invoke.h */, + 691E034D21A4FD7500F838EF /* inline_variable.h */, + 691E034E21A4FD7500F838EF /* atomic_hook.h */, + 691E034F21A4FD7500F838EF /* identity.h */, + 691E035021A4FD7500F838EF /* raw_logging.h */, + 691E035121A4FD7500F838EF /* throw_delegate.h */, + ); + path = internal; + sourceTree = ""; + }; + 691E035621A4FD7500F838EF /* utility */ = { + isa = PBXGroup; + children = ( + 691E035721A4FD7500F838EF /* utility.h */, + ); + path = utility; + sourceTree = ""; + }; + 691E035821A4FD7500F838EF /* common_audio */ = { + isa = PBXGroup; + children = ( + 691E035921A4FD7500F838EF /* mocks */, + 691E035B21A4FD7500F838EF /* wav_file.h */, + 691E035C21A4FD7500F838EF /* window_generator.cc */, + 691E035D21A4FD7500F838EF /* channel_buffer.cc */, + 691E035E21A4FD7500F838EF /* fir_filter_factory.cc */, + 691E035F21A4FD7500F838EF /* sparse_fir_filter.h */, + 691E036021A4FD7500F838EF /* fir_filter_sse.h */, + 691E036121A4FD7500F838EF /* window_generator.h */, + 691E036221A4FD7500F838EF /* ring_buffer.h */, + 691E036321A4FD7500F838EF /* fir_filter.h */, + 691E036421A4FD7500F838EF /* include */, + 691E036621A4FD7500F838EF /* wav_header.cc */, + 691E036721A4FD7500F838EF /* real_fourier_ooura.cc */, + 691E036821A4FD7500F838EF /* fir_filter_neon.cc */, + 691E036921A4FD7500F838EF /* audio_util.cc */, + 691E036A21A4FD7500F838EF /* real_fourier_ooura.h */, + 691E036B21A4FD7500F838EF /* fir_filter_sse.cc */, + 691E036C21A4FD7500F838EF /* smoothing_filter.h */, + 691E036D21A4FD7500F838EF /* resampler */, + 691E037B21A4FD7500F838EF /* fir_filter_factory.h */, + 691E037C21A4FD7500F838EF /* audio_converter.h */, + 691E037D21A4FD7500F838EF /* wav_file.cc */, + 691E037E21A4FD7500F838EF /* third_party */, + 691E038621A4FD7500F838EF /* audio_converter.cc */, + 691E038721A4FD7500F838EF /* real_fourier.cc */, + 691E038821A4FD7500F838EF /* channel_buffer.h */, + 691E038921A4FD7500F838EF /* real_fourier.h */, + 691E038A21A4FD7500F838EF /* sparse_fir_filter.cc */, + 691E038B21A4FD7500F838EF /* fir_filter_neon.h */, + 691E038C21A4FD7500F838EF /* smoothing_filter.cc */, + 691E038D21A4FD7500F838EF /* fir_filter_c.cc */, + 691E038E21A4FD7500F838EF /* ring_buffer.c */, + 691E038F21A4FD7500F838EF /* fir_filter_c.h */, + 691E039021A4FD7500F838EF /* signal_processing */, + 691E03BF21A4FD7500F838EF /* wav_header.h */, + 691E03C021A4FD7500F838EF /* vad */, + ); + path = common_audio; + sourceTree = ""; + }; + 691E035921A4FD7500F838EF /* mocks */ = { + isa = PBXGroup; + children = ( + 691E035A21A4FD7500F838EF /* mock_smoothing_filter.h */, + ); + path = mocks; + sourceTree = ""; + }; + 691E036421A4FD7500F838EF /* include */ = { + isa = PBXGroup; + children = ( + 691E036521A4FD7500F838EF /* audio_util.h */, + ); + path = include; + sourceTree = ""; + }; + 691E036D21A4FD7500F838EF /* resampler */ = { + isa = PBXGroup; + children = ( + 691E036E21A4FD7500F838EF /* sinc_resampler_neon.cc */, + 691E036F21A4FD7500F838EF /* push_sinc_resampler.cc */, + 691E037021A4FD7500F838EF /* sinc_resampler.h */, + 691E037121A4FD7500F838EF /* resampler.cc */, + 691E037221A4FD7500F838EF /* sinc_resampler_sse.cc */, + 691E037321A4FD7500F838EF /* include */, + 691E037621A4FD7500F838EF /* push_sinc_resampler.h */, + 691E037721A4FD7500F838EF /* push_resampler.cc */, + 691E037821A4FD7500F838EF /* sinusoidal_linear_chirp_source.h */, + 691E037921A4FD7500F838EF /* sinc_resampler.cc */, + 691E037A21A4FD7500F838EF /* sinusoidal_linear_chirp_source.cc */, + ); + path = resampler; + sourceTree = ""; + }; + 691E037321A4FD7500F838EF /* include */ = { + isa = PBXGroup; + children = ( + 691E037421A4FD7500F838EF /* push_resampler.h */, + 691E037521A4FD7500F838EF /* resampler.h */, + ); + path = include; + sourceTree = ""; + }; + 691E037E21A4FD7500F838EF /* third_party */ = { + isa = PBXGroup; + children = ( + 691E037F21A4FD7500F838EF /* spl_sqrt_floor */, + 691E038321A4FD7500F838EF /* fft4g */, + ); + path = third_party; + sourceTree = ""; + }; + 691E037F21A4FD7500F838EF /* spl_sqrt_floor */ = { + isa = PBXGroup; + children = ( + 691E038021A4FD7500F838EF /* spl_sqrt_floor.c */, + 691E038221A4FD7500F838EF /* spl_sqrt_floor.h */, + ); + path = spl_sqrt_floor; + sourceTree = ""; + }; + 691E038321A4FD7500F838EF /* fft4g */ = { + isa = PBXGroup; + children = ( + 691E038421A4FD7500F838EF /* fft4g.c */, + 691E038521A4FD7500F838EF /* fft4g.h */, + ); + path = fft4g; + sourceTree = ""; + }; + 691E039021A4FD7500F838EF /* signal_processing */ = { + isa = PBXGroup; + children = ( + 691E039121A4FD7500F838EF /* complex_fft_tables.h */, + 691E039221A4FD7500F838EF /* complex_fft.c */, + 691E039321A4FD7500F838EF /* filter_ma_fast_q12.c */, + 691E039421A4FD7500F838EF /* splitting_filter1.c */, + 691E039521A4FD7500F838EF /* levinson_durbin.c */, + 691E039621A4FD7500F838EF /* downsample_fast_neon.c */, + 691E039721A4FD7500F838EF /* dot_product_with_scale.cc */, + 691E039821A4FD7500F838EF /* auto_corr_to_refl_coef.c */, + 691E039921A4FD7500F838EF /* resample_by_2_internal.c */, + 691E039B21A4FD7500F838EF /* energy.c */, + 691E039C21A4FD7500F838EF /* sqrt_of_one_minus_x_squared.c */, + 691E039D21A4FD7500F838EF /* downsample_fast.c */, + 691E039E21A4FD7500F838EF /* filter_ar_fast_q12.c */, + 691E039F21A4FD7500F838EF /* spl_init.c */, + 691E03A021A4FD7500F838EF /* lpc_to_refl_coef.c */, + 691E03A121A4FD7500F838EF /* cross_correlation.c */, + 691E03A221A4FD7500F838EF /* include */, + 691E03A721A4FD7500F838EF /* division_operations.c */, + 691E03A821A4FD7500F838EF /* auto_correlation.c */, + 691E03A921A4FD7500F838EF /* get_scaling_square.c */, + 691E03AA21A4FD7500F838EF /* min_max_operations_neon.c */, + 691E03AB21A4FD7500F838EF /* dot_product_with_scale.h */, + 691E03AC21A4FD7500F838EF /* resample_by_2_internal.h */, + 691E03AD21A4FD7500F838EF /* resample.c */, + 691E03AE21A4FD7500F838EF /* cross_correlation_neon.c */, + 691E03AF21A4FD7500F838EF /* min_max_operations.c */, + 691E03B021A4FD7500F838EF /* refl_coef_to_lpc.c */, + 691E03B121A4FD7500F838EF /* filter_ar.c */, + 691E03B221A4FD7500F838EF /* vector_scaling_operations.c */, + 691E03B321A4FD7500F838EF /* resample_fractional.c */, + 691E03B421A4FD7500F838EF /* real_fft.c */, + 691E03B521A4FD7500F838EF /* ilbc_specific_functions.c */, + 691E03B621A4FD7500F838EF /* complex_bit_reverse.c */, + 691E03B721A4FD7500F838EF /* randomization_functions.c */, + 691E03B921A4FD7500F838EF /* copy_set_operations.c */, + 691E03BA21A4FD7500F838EF /* resample_by_2.c */, + 691E03BB21A4FD7500F838EF /* get_hanning_window.c */, + 691E03BC21A4FD7500F838EF /* resample_48khz.c */, + 691E03BD21A4FD7500F838EF /* spl_inl.c */, + 691E03BE21A4FD7500F838EF /* spl_sqrt.c */, + ); + path = signal_processing; + sourceTree = ""; + }; + 691E03A221A4FD7500F838EF /* include */ = { + isa = PBXGroup; + children = ( + 691E03A321A4FD7500F838EF /* signal_processing_library.h */, + 691E03A421A4FD7500F838EF /* real_fft.h */, + 691E03A521A4FD7500F838EF /* spl_inl.h */, + 691E03A621A4FD7500F838EF /* spl_inl_armv7.h */, + ); + path = include; + sourceTree = ""; + }; + 691E03C021A4FD7500F838EF /* vad */ = { + isa = PBXGroup; + children = ( + 691E03C121A4FD7500F838EF /* vad_sp.c */, + 691E03C221A4FD7500F838EF /* vad.cc */, + 691E03C321A4FD7500F838EF /* webrtc_vad.c */, + 691E03C421A4FD7500F838EF /* vad_core.h */, + 691E03C521A4FD7500F838EF /* include */, + 691E03C821A4FD7500F838EF /* vad_gmm.h */, + 691E03C921A4FD7500F838EF /* vad_filterbank.c */, + 691E03CA21A4FD7500F838EF /* vad_core.c */, + 691E03CB21A4FD7500F838EF /* vad_sp.h */, + 691E03CC21A4FD7500F838EF /* vad_filterbank.h */, + 691E03CD21A4FD7500F838EF /* vad_gmm.c */, + ); + path = vad; + sourceTree = ""; + }; + 691E03C521A4FD7500F838EF /* include */ = { + isa = PBXGroup; + children = ( + 691E03C621A4FD7500F838EF /* vad.h */, + 691E03C721A4FD7500F838EF /* webrtc_vad.h */, + ); + path = include; + sourceTree = ""; + }; + 691E03CE21A4FD7500F838EF /* api */ = { + isa = PBXGroup; + children = ( + 691E03CF21A4FD7500F838EF /* audio */, + 691E03D721A4FD7500F838EF /* array_view.h */, + ); + path = api; + sourceTree = ""; + }; + 691E03CF21A4FD7500F838EF /* audio */ = { + isa = PBXGroup; + children = ( + 691E03D021A4FD7500F838EF /* audio_frame.cc */, + 691E03D121A4FD7500F838EF /* echo_canceller3_config.h */, + 691E03D221A4FD7500F838EF /* echo_control.h */, + 691E03D321A4FD7500F838EF /* audio_frame.h */, + 691E03D421A4FD7500F838EF /* echo_canceller3_config.cc */, + 691E03D521A4FD7500F838EF /* echo_canceller3_factory.h */, + 691E03D621A4FD7500F838EF /* echo_canceller3_factory.cc */, + ); + path = audio; + sourceTree = ""; + }; + 691E03D821A4FD7500F838EF /* third_party */ = { + isa = PBXGroup; + children = ( + 691E03D921A4FD7500F838EF /* rnnoise */, + ); + path = third_party; + sourceTree = ""; + }; + 691E03D921A4FD7500F838EF /* rnnoise */ = { + isa = PBXGroup; + children = ( + 691E03DA21A4FD7500F838EF /* src */, + ); + path = rnnoise; + sourceTree = ""; + }; + 691E03DA21A4FD7500F838EF /* src */ = { + isa = PBXGroup; + children = ( + 691E03DB21A4FD7500F838EF /* rnn_vad_weights.cc */, + 691E03DC21A4FD7500F838EF /* rnn_activations.h */, + 691E03DD21A4FD7500F838EF /* kiss_fft.h */, + 691E03DE21A4FD7500F838EF /* kiss_fft.cc */, + 691E03DF21A4FD7500F838EF /* rnn_vad_weights.h */, + ); + path = src; + sourceTree = ""; + }; + 691E03E021A4FD7500F838EF /* system_wrappers */ = { + isa = PBXGroup; + children = ( + 691E03E121A4FD7500F838EF /* include */, + 691E03E721A4FD7500F838EF /* source */, + ); + path = system_wrappers; + sourceTree = ""; + }; + 691E03E121A4FD7500F838EF /* include */ = { + isa = PBXGroup; + children = ( + 691E03E221A4FD7500F838EF /* field_trial.h */, + 691E03E321A4FD7500F838EF /* cpu_features_wrapper.h */, + 691E03E421A4FD7500F838EF /* asm_defines.h */, + 691E03E521A4FD7500F838EF /* metrics.h */, + 691E03E621A4FD7500F838EF /* compile_assert_c.h */, + ); + path = include; + sourceTree = ""; + }; + 691E03E721A4FD7500F838EF /* source */ = { + isa = PBXGroup; + children = ( + 691E03E821A4FD7500F838EF /* field_trial.cc */, + 691E03E921A4FD7500F838EF /* metrics.cc */, + 691E03EA21A4FD7500F838EF /* cpu_features.cc */, + ); + path = source; + sourceTree = ""; + }; + 691E03EB21A4FD7500F838EF /* modules */ = { + isa = PBXGroup; + children = ( + 691E03EC21A4FD7500F838EF /* third_party */, + 691E03F021A4FD7500F838EF /* audio_coding */, + 691E042921A4FD7500F838EF /* audio_processing */, + ); + path = modules; + sourceTree = ""; + }; + 691E03EC21A4FD7500F838EF /* third_party */ = { + isa = PBXGroup; + children = ( + 691E03ED21A4FD7500F838EF /* fft */, + ); + path = third_party; + sourceTree = ""; + }; + 691E03ED21A4FD7500F838EF /* fft */ = { + isa = PBXGroup; + children = ( + 691E03EE21A4FD7500F838EF /* fft.h */, + 691E03EF21A4FD7500F838EF /* fft.c */, + ); + path = fft; + sourceTree = ""; + }; + 691E03F021A4FD7500F838EF /* audio_coding */ = { + isa = PBXGroup; + children = ( + 691E03F121A4FD7500F838EF /* codecs */, + ); + path = audio_coding; + sourceTree = ""; + }; + 691E03F121A4FD7500F838EF /* codecs */ = { + isa = PBXGroup; + children = ( + 691E03F221A4FD7500F838EF /* isac */, + ); + path = codecs; + sourceTree = ""; + }; + 691E03F221A4FD7500F838EF /* isac */ = { + isa = PBXGroup; + children = ( + 691E03F321A4FD7500F838EF /* bandwidth_info.h */, + 691E03F421A4FD7500F838EF /* main */, + ); + path = isac; + sourceTree = ""; + }; + 691E03F421A4FD7500F838EF /* main */ = { + isa = PBXGroup; + children = ( + 691E03F521A4FD7500F838EF /* include */, + 691E03F721A4FD7500F838EF /* source */, + ); + path = main; + sourceTree = ""; + }; + 691E03F521A4FD7500F838EF /* include */ = { + isa = PBXGroup; + children = ( + 691E03F621A4FD7500F838EF /* isac.h */, + ); + path = include; + sourceTree = ""; + }; + 691E03F721A4FD7500F838EF /* source */ = { + isa = PBXGroup; + children = ( + 691E03F821A4FD7500F838EF /* pitch_estimator.c */, + 691E03F921A4FD7500F838EF /* lpc_shape_swb16_tables.c */, + 691E03FA21A4FD7500F838EF /* pitch_gain_tables.c */, + 691E03FB21A4FD7500F838EF /* arith_routines_logist.c */, + 691E03FC21A4FD7500F838EF /* os_specific_inline.h */, + 691E03FD21A4FD7500F838EF /* filterbanks.c */, + 691E03FE21A4FD7500F838EF /* entropy_coding.h */, + 691E03FF21A4FD7500F838EF /* isac_vad.h */, + 691E040021A4FD7500F838EF /* settings.h */, + 691E040121A4FD7500F838EF /* transform.c */, + 691E040221A4FD7500F838EF /* lpc_shape_swb12_tables.h */, + 691E040321A4FD7500F838EF /* arith_routines.h */, + 691E040421A4FD7500F838EF /* crc.h */, + 691E040521A4FD7500F838EF /* pitch_filter.c */, + 691E040621A4FD7500F838EF /* encode_lpc_swb.c */, + 691E040721A4FD7500F838EF /* filter_functions.c */, + 691E040821A4FD7500F838EF /* decode.c */, + 691E040921A4FD7500F838EF /* lattice.c */, + 691E040A21A4FD7500F838EF /* intialize.c */, + 691E040B21A4FD7500F838EF /* lpc_tables.c */, + 691E040C21A4FD7500F838EF /* lpc_gain_swb_tables.c */, + 691E040D21A4FD7500F838EF /* bandwidth_estimator.c */, + 691E040E21A4FD7500F838EF /* isac_float_type.h */, + 691E040F21A4FD7500F838EF /* pitch_lag_tables.h */, + 691E041021A4FD7500F838EF /* encode.c */, + 691E041121A4FD7500F838EF /* lpc_analysis.c */, + 691E041221A4FD7500F838EF /* spectrum_ar_model_tables.h */, + 691E041321A4FD7500F838EF /* arith_routines_hist.c */, + 691E041421A4FD7500F838EF /* codec.h */, + 691E041521A4FD7500F838EF /* pitch_gain_tables.h */, + 691E041621A4FD7500F838EF /* lpc_shape_swb16_tables.h */, + 691E041721A4FD7500F838EF /* pitch_estimator.h */, + 691E041821A4FD7500F838EF /* entropy_coding.c */, + 691E041921A4FD7500F838EF /* isac_vad.c */, + 691E041A21A4FD7500F838EF /* structs.h */, + 691E041B21A4FD7500F838EF /* filter_functions.h */, + 691E041C21A4FD7500F838EF /* encode_lpc_swb.h */, + 691E041D21A4FD7500F838EF /* pitch_filter.h */, + 691E041E21A4FD7500F838EF /* arith_routines.c */, + 691E041F21A4FD7500F838EF /* crc.c */, + 691E042021A4FD7500F838EF /* lpc_shape_swb12_tables.c */, + 691E042121A4FD7500F838EF /* lpc_analysis.h */, + 691E042221A4FD7500F838EF /* decode_bwe.c */, + 691E042321A4FD7500F838EF /* spectrum_ar_model_tables.c */, + 691E042421A4FD7500F838EF /* bandwidth_estimator.h */, + 691E042521A4FD7500F838EF /* pitch_lag_tables.c */, + 691E042621A4FD7500F838EF /* isac.c */, + 691E042721A4FD7500F838EF /* lpc_gain_swb_tables.h */, + 691E042821A4FD7500F838EF /* lpc_tables.h */, + ); + path = source; + sourceTree = ""; + }; + 691E042921A4FD7500F838EF /* audio_processing */ = { + isa = PBXGroup; + children = ( + 691E042A21A4FD7500F838EF /* rms_level.cc */, + 691E042B21A4FD7500F838EF /* echo_detector */, + 691E043421A4FD7600F838EF /* gain_control_for_experimental_agc.h */, + 691E043521A4FD7600F838EF /* splitting_filter.cc */, + 691E043621A4FD7600F838EF /* gain_control_impl.cc */, + 691E043721A4FD7600F838EF /* rms_level.h */, + 691E043821A4FD7600F838EF /* test */, + 691E043C21A4FD7600F838EF /* ns */, + 691E044A21A4FD7600F838EF /* residual_echo_detector.h */, + 691E044B21A4FD7600F838EF /* audio_processing_impl.h */, + 691E044C21A4FD7600F838EF /* audio_buffer.cc */, + 691E044D21A4FD7600F838EF /* typing_detection.cc */, + 691E044E21A4FD7600F838EF /* render_queue_item_verifier.h */, + 691E044F21A4FD7600F838EF /* aec_dump */, + 691E045021A4FD7600F838EF /* include */, + 691E045F21A4FD7600F838EF /* agc2 */, + 691E04A121A4FD7600F838EF /* transient */, + 691E04AF21A4FD7600F838EF /* low_cut_filter.cc */, + 691E04B021A4FD7600F838EF /* noise_suppression_impl.h */, + 691E04B121A4FD7600F838EF /* level_estimator_impl.cc */, + 691E04B221A4FD7600F838EF /* three_band_filter_bank.cc */, + 691E04B321A4FD7600F838EF /* aec */, + 691E04BE21A4FD7600F838EF /* voice_detection_impl.h */, + 691E04BF21A4FD7600F838EF /* voice_detection_impl.cc */, + 691E04C021A4FD7600F838EF /* echo_cancellation_impl.cc */, + 691E04C121A4FD7600F838EF /* gain_control_for_experimental_agc.cc */, + 691E04C221A4FD7600F838EF /* agc */, + 691E04D321A4FD7600F838EF /* common.h */, + 691E04D421A4FD7600F838EF /* audio_processing_impl.cc */, + 691E04D521A4FD7600F838EF /* audio_buffer.h */, + 691E04D621A4FD7600F838EF /* echo_control_mobile_impl.h */, + 691E04D721A4FD7600F838EF /* splitting_filter.h */, + 691E04D821A4FD7600F838EF /* low_cut_filter.h */, + 691E04D921A4FD7600F838EF /* audio_generator */, + 691E04DC21A4FD7600F838EF /* gain_controller2.cc */, + 691E04DD21A4FD7600F838EF /* three_band_filter_bank.h */, + 691E04DE21A4FD7600F838EF /* residual_echo_detector.cc */, + 691E04DF21A4FD7600F838EF /* echo_cancellation_impl.h */, + 691E04E021A4FD7600F838EF /* noise_suppression_impl.cc */, + 691E04E121A4FD7600F838EF /* level_estimator_impl.h */, + 691E04E221A4FD7600F838EF /* gain_controller2.h */, + 691E04E321A4FD7600F838EF /* aecm */, + 691E04EB21A4FD7600F838EF /* aec3 */, + 691E055A21A4FD7600F838EF /* echo_control_mobile_impl.cc */, + 691E055B21A4FD7600F838EF /* gain_control_impl.h */, + 691E055C21A4FD7600F838EF /* typing_detection.h */, + 691E055D21A4FD7600F838EF /* logging */, + 691E056021A4FD7600F838EF /* vad */, + 691E057521A4FD7600F838EF /* utility */, + ); + path = audio_processing; + sourceTree = ""; + }; + 691E042B21A4FD7500F838EF /* echo_detector */ = { + isa = PBXGroup; + children = ( + 691E042C21A4FD7500F838EF /* moving_max.h */, + 691E042D21A4FD7600F838EF /* circular_buffer.h */, + 691E042E21A4FD7600F838EF /* normalized_covariance_estimator.h */, + 691E042F21A4FD7600F838EF /* normalized_covariance_estimator.cc */, + 691E043021A4FD7600F838EF /* moving_max.cc */, + 691E043121A4FD7600F838EF /* circular_buffer.cc */, + 691E043221A4FD7600F838EF /* mean_variance_estimator.cc */, + 691E043321A4FD7600F838EF /* mean_variance_estimator.h */, + ); + path = echo_detector; + sourceTree = ""; + }; + 691E043821A4FD7600F838EF /* test */ = { + isa = PBXGroup; + children = ( + 691E043921A4FD7600F838EF /* android */, + ); + path = test; + sourceTree = ""; + }; + 691E043921A4FD7600F838EF /* android */ = { + isa = PBXGroup; + children = ( + 691E043A21A4FD7600F838EF /* apmtest */, + ); + path = android; + sourceTree = ""; + }; + 691E043A21A4FD7600F838EF /* apmtest */ = { + isa = PBXGroup; + children = ( + 691E043B21A4FD7600F838EF /* jni */, + ); + path = apmtest; + sourceTree = ""; + }; + 691E043B21A4FD7600F838EF /* jni */ = { + isa = PBXGroup; + children = ( + ); + path = jni; + sourceTree = ""; + }; + 691E043C21A4FD7600F838EF /* ns */ = { + isa = PBXGroup; + children = ( + 691E043D21A4FD7600F838EF /* ns_core.h */, + 691E043E21A4FD7600F838EF /* nsx_core.c */, + 691E043F21A4FD7600F838EF /* noise_suppression_x.c */, + 691E044021A4FD7600F838EF /* nsx_core_c.c */, + 691E044121A4FD7600F838EF /* defines.h */, + 691E044221A4FD7600F838EF /* noise_suppression.h */, + 691E044321A4FD7600F838EF /* ns_core.c */, + 691E044421A4FD7600F838EF /* nsx_core.h */, + 691E044521A4FD7600F838EF /* windows_private.h */, + 691E044621A4FD7600F838EF /* noise_suppression_x.h */, + 691E044721A4FD7600F838EF /* nsx_core_neon.c */, + 691E044821A4FD7600F838EF /* noise_suppression.c */, + 691E044921A4FD7600F838EF /* nsx_defines.h */, + ); + path = ns; + sourceTree = ""; + }; + 691E044F21A4FD7600F838EF /* aec_dump */ = { + isa = PBXGroup; + children = ( + ); + path = aec_dump; + sourceTree = ""; + }; + 691E045021A4FD7600F838EF /* include */ = { + isa = PBXGroup; + children = ( + 691E045121A4FD7600F838EF /* audio_generator.h */, + 691E045221A4FD7600F838EF /* config.h */, + 691E045321A4FD7600F838EF /* audio_frame_view.h */, + 691E045421A4FD7600F838EF /* mock_audio_processing.h */, + 691E045521A4FD7600F838EF /* gain_control.h */, + 691E045621A4FD7600F838EF /* audio_generator_factory.h */, + 691E045721A4FD7600F838EF /* audio_processing_statistics.cc */, + 691E045821A4FD7600F838EF /* audio_generator_factory.cc */, + 691E045921A4FD7600F838EF /* aec_dump.cc */, + 691E045A21A4FD7600F838EF /* aec_dump.h */, + 691E045B21A4FD7600F838EF /* audio_processing_statistics.h */, + 691E045C21A4FD7600F838EF /* audio_processing.h */, + 691E045D21A4FD7600F838EF /* audio_processing.cc */, + 691E045E21A4FD7600F838EF /* config.cc */, + ); + path = include; + sourceTree = ""; + }; + 691E045F21A4FD7600F838EF /* agc2 */ = { + isa = PBXGroup; + children = ( + 691E046021A4FD7600F838EF /* interpolated_gain_curve.h */, + 691E046121A4FD7600F838EF /* biquad_filter.h */, + 691E046221A4FD7600F838EF /* interpolated_gain_curve.cc */, + 691E046321A4FD7600F838EF /* agc2_common.cc */, + 691E046421A4FD7600F838EF /* agc2_testing_common.h */, + 691E046521A4FD7600F838EF /* adaptive_mode_level_estimator.h */, + 691E046621A4FD7600F838EF /* gain_applier.cc */, + 691E046721A4FD7600F838EF /* signal_classifier.h */, + 691E046821A4FD7600F838EF /* adaptive_agc.cc */, + 691E046921A4FD7600F838EF /* adaptive_digital_gain_applier.cc */, + 691E046A21A4FD7600F838EF /* limiter.cc */, + 691E046B21A4FD7600F838EF /* saturation_protector.cc */, + 691E046C21A4FD7600F838EF /* vector_float_frame.h */, + 691E046D21A4FD7600F838EF /* rnn_vad */, + 691E048421A4FD7600F838EF /* fixed_gain_controller.h */, + 691E048521A4FD7600F838EF /* adaptive_mode_level_estimator_agc.cc */, + 691E048621A4FD7600F838EF /* vector_float_frame.cc */, + 691E048721A4FD7600F838EF /* down_sampler.h */, + 691E048821A4FD7600F838EF /* noise_level_estimator.cc */, + 691E048921A4FD7600F838EF /* agc2_testing_common.cc */, + 691E048A21A4FD7600F838EF /* fixed_digital_level_estimator.cc */, + 691E048B21A4FD7600F838EF /* fixed_gain_controller.cc */, + 691E048C21A4FD7600F838EF /* saturation_protector.h */, + 691E048D21A4FD7600F838EF /* vad_with_level.cc */, + 691E048E21A4FD7600F838EF /* limiter_db_gain_curve.cc */, + 691E048F21A4FD7600F838EF /* agc2_common.h */, + 691E049021A4FD7600F838EF /* adaptive_mode_level_estimator_agc.h */, + 691E049121A4FD7600F838EF /* adaptive_digital_gain_applier.h */, + 691E049221A4FD7600F838EF /* vad_with_level.h */, + 691E049321A4FD7600F838EF /* limiter_db_gain_curve.h */, + 691E049421A4FD7600F838EF /* fixed_digital_level_estimator.h */, + 691E049521A4FD7600F838EF /* adaptive_agc.h */, + 691E049621A4FD7600F838EF /* gain_applier.h */, + 691E049721A4FD7600F838EF /* down_sampler.cc */, + 691E049821A4FD7600F838EF /* noise_level_estimator.h */, + 691E049921A4FD7600F838EF /* signal_classifier.cc */, + 691E049A21A4FD7600F838EF /* noise_spectrum_estimator.cc */, + 691E049B21A4FD7600F838EF /* compute_interpolated_gain_curve.cc */, + 691E049C21A4FD7600F838EF /* compute_interpolated_gain_curve.h */, + 691E049D21A4FD7600F838EF /* biquad_filter.cc */, + 691E049E21A4FD7600F838EF /* noise_spectrum_estimator.h */, + 691E049F21A4FD7600F838EF /* limiter.h */, + 691E04A021A4FD7600F838EF /* adaptive_mode_level_estimator.cc */, + ); + path = agc2; + sourceTree = ""; + }; + 691E046D21A4FD7600F838EF /* rnn_vad */ = { + isa = PBXGroup; + children = ( + 691E046E21A4FD7600F838EF /* spectral_features_internal.cc */, + 691E046F21A4FD7600F838EF /* sequence_buffer.h */, + 691E047021A4FD7600F838EF /* rnn.h */, + 691E047121A4FD7600F838EF /* rnn.cc */, + 691E047221A4FD7600F838EF /* test_utils.h */, + 691E047321A4FD7600F838EF /* pitch_info.h */, + 691E047421A4FD7600F838EF /* lp_residual.h */, + 691E047521A4FD7600F838EF /* ring_buffer.h */, + 691E047621A4FD7600F838EF /* pitch_search_internal.cc */, + 691E047721A4FD7600F838EF /* symmetric_matrix_buffer.h */, + 691E047821A4FD7600F838EF /* spectral_features.h */, + 691E047921A4FD7600F838EF /* features_extraction.h */, + 691E047A21A4FD7600F838EF /* common.h */, + 691E047B21A4FD7600F838EF /* spectral_features_internal.h */, + 691E047C21A4FD7600F838EF /* fft_util.h */, + 691E047D21A4FD7600F838EF /* spectral_features.cc */, + 691E047E21A4FD7600F838EF /* pitch_search_internal.h */, + 691E047F21A4FD7600F838EF /* pitch_search.cc */, + 691E048021A4FD7600F838EF /* pitch_search.h */, + 691E048121A4FD7600F838EF /* features_extraction.cc */, + 691E048221A4FD7600F838EF /* fft_util.cc */, + 691E048321A4FD7600F838EF /* lp_residual.cc */, + ); + path = rnn_vad; + sourceTree = ""; + }; + 691E04A121A4FD7600F838EF /* transient */ = { + isa = PBXGroup; + children = ( + 691E04A221A4FD7600F838EF /* moving_moments.cc */, + 691E04A321A4FD7600F838EF /* transient_detector.h */, + 691E04A421A4FD7600F838EF /* wpd_tree.cc */, + 691E04A521A4FD7600F838EF /* transient_suppressor.h */, + 691E04A621A4FD7600F838EF /* daubechies_8_wavelet_coeffs.h */, + 691E04A721A4FD7600F838EF /* common.h */, + 691E04A821A4FD7600F838EF /* wpd_node.h */, + 691E04A921A4FD7600F838EF /* moving_moments.h */, + 691E04AA21A4FD7600F838EF /* wpd_tree.h */, + 691E04AB21A4FD7600F838EF /* wpd_node.cc */, + 691E04AC21A4FD7600F838EF /* transient_suppressor.cc */, + 691E04AD21A4FD7600F838EF /* transient_detector.cc */, + 691E04AE21A4FD7600F838EF /* dyadic_decimator.h */, + ); + path = transient; + sourceTree = ""; + }; + 691E04B321A4FD7600F838EF /* aec */ = { + isa = PBXGroup; + children = ( + 691E04B421A4FD7600F838EF /* echo_cancellation.cc */, + 691E04B521A4FD7600F838EF /* aec_resampler.h */, + 691E04B621A4FD7600F838EF /* aec_resampler.cc */, + 691E04B721A4FD7600F838EF /* echo_cancellation.h */, + 691E04B821A4FD7600F838EF /* aec_core.cc */, + 691E04B921A4FD7600F838EF /* aec_core.h */, + 691E04BA21A4FD7600F838EF /* aec_core_optimized_methods.h */, + 691E04BB21A4FD7600F838EF /* aec_core_neon.cc */, + 691E04BC21A4FD7600F838EF /* aec_core_sse2.cc */, + 691E04BD21A4FD7600F838EF /* aec_common.h */, + ); + path = aec; + sourceTree = ""; + }; + 691E04C221A4FD7600F838EF /* agc */ = { + isa = PBXGroup; + children = ( + 691E04C321A4FD7600F838EF /* agc.cc */, + 691E04C421A4FD7600F838EF /* loudness_histogram.cc */, + 691E04C521A4FD7600F838EF /* agc_manager_direct.cc */, + 691E04C621A4FD7600F838EF /* legacy */, + 691E04CC21A4FD7600F838EF /* utility.cc */, + 691E04CD21A4FD7600F838EF /* mock_agc.h */, + 691E04CE21A4FD7600F838EF /* loudness_histogram.h */, + 691E04CF21A4FD7600F838EF /* gain_map_internal.h */, + 691E04D021A4FD7600F838EF /* utility.h */, + 691E04D121A4FD7600F838EF /* agc_manager_direct.h */, + 691E04D221A4FD7600F838EF /* agc.h */, + ); + path = agc; + sourceTree = ""; + }; + 691E04C621A4FD7600F838EF /* legacy */ = { + isa = PBXGroup; + children = ( + 691E04C721A4FD7600F838EF /* analog_agc.h */, + 691E04C821A4FD7600F838EF /* gain_control.h */, + 691E04C921A4FD7600F838EF /* digital_agc.h */, + 691E04CA21A4FD7600F838EF /* analog_agc.c */, + 691E04CB21A4FD7600F838EF /* digital_agc.c */, + ); + path = legacy; + sourceTree = ""; + }; + 691E04D921A4FD7600F838EF /* audio_generator */ = { + isa = PBXGroup; + children = ( + 691E04DA21A4FD7600F838EF /* file_audio_generator.h */, + 691E04DB21A4FD7600F838EF /* file_audio_generator.cc */, + ); + path = audio_generator; + sourceTree = ""; + }; + 691E04E321A4FD7600F838EF /* aecm */ = { + isa = PBXGroup; + children = ( + 691E04E421A4FD7600F838EF /* aecm_core.h */, + 691E04E521A4FD7600F838EF /* aecm_defines.h */, + 691E04E621A4FD7600F838EF /* aecm_core.cc */, + 691E04E721A4FD7600F838EF /* aecm_core_c.cc */, + 691E04E821A4FD7600F838EF /* aecm_core_neon.cc */, + 691E04E921A4FD7600F838EF /* echo_control_mobile.h */, + 691E04EA21A4FD7600F838EF /* echo_control_mobile.cc */, + ); + path = aecm; + sourceTree = ""; + }; + 691E04EB21A4FD7600F838EF /* aec3 */ = { + isa = PBXGroup; + children = ( + 691E04EC21A4FD7600F838EF /* render_reverb_model.cc */, + 691E04ED21A4FD7600F838EF /* downsampled_render_buffer.h */, + 691E04EE21A4FD7600F838EF /* subtractor_output_analyzer.h */, + 691E04EF21A4FD7600F838EF /* reverb_model_fallback.cc */, + 691E04F021A4FD7600F838EF /* residual_echo_estimator.h */, + 691E04F121A4FD7600F838EF /* shadow_filter_update_gain.h */, + 691E04F221A4FD7600F838EF /* echo_remover_metrics.cc */, + 691E04F321A4FD7600F838EF /* matched_filter_lag_aggregator.cc */, + 691E04F421A4FD7600F838EF /* render_delay_buffer2.cc */, + 691E04F521A4FD7600F838EF /* aec_state.h */, + 691E04F621A4FD7600F838EF /* suppression_filter.h */, + 691E04F721A4FD7600F838EF /* echo_path_variability.cc */, + 691E04F821A4FD7600F838EF /* frame_blocker.cc */, + 691E04F921A4FD7600F838EF /* subtractor.cc */, + 691E04FA21A4FD7600F838EF /* block_delay_buffer.h */, + 691E04FB21A4FD7600F838EF /* adaptive_fir_filter.h */, + 691E04FC21A4FD7600F838EF /* cascaded_biquad_filter.h */, + 691E04FD21A4FD7600F838EF /* matched_filter.h */, + 691E04FE21A4FD7600F838EF /* subtractor_output.h */, + 691E04FF21A4FD7600F838EF /* render_signal_analyzer.h */, + 691E050021A4FD7600F838EF /* aec3_fft.cc */, + 691E050121A4FD7600F838EF /* aec3_fft.h */, + 691E050221A4FD7600F838EF /* echo_remover_metrics.h */, + 691E050321A4FD7600F838EF /* fullband_erle_estimator.cc */, + 691E050421A4FD7600F838EF /* suppression_filter.cc */, + 691E050521A4FD7600F838EF /* block_processor.cc */, + 691E050621A4FD7600F838EF /* filter_analyzer.h */, + 691E050721A4FD7600F838EF /* subtractor.h */, + 691E050821A4FD7600F838EF /* echo_path_delay_estimator.h */, + 691E050921A4FD7600F838EF /* subband_erle_estimator.cc */, + 691E050A21A4FD7600F838EF /* render_delay_controller_metrics.cc */, + 691E050B21A4FD7600F838EF /* render_delay_buffer.cc */, + 691E050C21A4FD7600F838EF /* block_processor_metrics.h */, + 691E050D21A4FD7600F838EF /* vector_buffer.cc */, + 691E050E21A4FD7600F838EF /* erl_estimator.cc */, + 691E050F21A4FD7600F838EF /* aec_state.cc */, + 691E051021A4FD7600F838EF /* adaptive_fir_filter.cc */, + 691E051121A4FD7600F838EF /* fft_data.h */, + 691E051221A4FD7600F838EF /* render_delay_controller.cc */, + 691E051321A4FD7600F838EF /* skew_estimator.cc */, + 691E051421A4FD7600F838EF /* render_delay_controller_metrics.h */, + 691E051521A4FD7600F838EF /* comfort_noise_generator.h */, + 691E051621A4FD7600F838EF /* echo_path_delay_estimator.cc */, + 691E051721A4FD7600F838EF /* erl_estimator.h */, + 691E051821A4FD7600F838EF /* echo_remover.h */, + 691E051921A4FD7600F838EF /* block_framer.cc */, + 691E051A21A4FD7600F838EF /* erle_estimator.cc */, + 691E051B21A4FD7600F838EF /* reverb_model.cc */, + 691E051C21A4FD7600F838EF /* cascaded_biquad_filter.cc */, + 691E051D21A4FD7600F838EF /* matrix_buffer.h */, + 691E051E21A4FD7600F838EF /* render_buffer.cc */, + 691E051F21A4FD7600F838EF /* reverb_model_estimator.h */, + 691E052021A4FD7600F838EF /* subtractor_output.cc */, + 691E052121A4FD7600F838EF /* stationarity_estimator.cc */, + 691E052221A4FD7600F838EF /* render_signal_analyzer.cc */, + 691E052321A4FD7600F838EF /* echo_path_variability.h */, + 691E052421A4FD7600F838EF /* moving_average.h */, + 691E052521A4FD7600F838EF /* render_reverb_model.h */, + 691E052621A4FD7600F838EF /* subtractor_output_analyzer.cc */, + 691E052721A4FD7600F838EF /* suppression_gain.cc */, + 691E052821A4FD7600F838EF /* echo_audibility.cc */, + 691E052921A4FD7600F838EF /* block_processor_metrics.cc */, + 691E052A21A4FD7600F838EF /* render_delay_controller.h */, + 691E052B21A4FD7600F838EF /* suppression_gain.h */, + 691E052C21A4FD7600F838EF /* moving_average.cc */, + 691E052D21A4FD7600F838EF /* erle_estimator.h */, + 691E052E21A4FD7600F838EF /* subband_erle_estimator.h */, + 691E052F21A4FD7600F838EF /* reverb_model_estimator.cc */, + 691E053021A4FD7600F838EF /* aec3_common.cc */, + 691E053121A4FD7600F838EF /* residual_echo_estimator.cc */, + 691E053221A4FD7600F838EF /* block_processor.h */, + 691E053321A4FD7600F838EF /* fullband_erle_estimator.h */, + 691E053421A4FD7600F838EF /* matched_filter.cc */, + 691E053521A4FD7600F838EF /* stationarity_estimator.h */, + 691E053621A4FD7600F838EF /* echo_canceller3.h */, + 691E053721A4FD7600F838EF /* skew_estimator.h */, + 691E053821A4FD7600F838EF /* reverb_decay_estimator.cc */, + 691E053921A4FD7600F838EF /* render_delay_controller2.cc */, + 691E053A21A4FD7600F838EF /* render_buffer.h */, + 691E053B21A4FD7600F838EF /* suppression_gain_limiter.cc */, + 691E053C21A4FD7600F838EF /* main_filter_update_gain.cc */, + 691E053D21A4FD7600F838EF /* echo_remover.cc */, + 691E053E21A4FD7600F838EF /* reverb_model_fallback.h */, + 691E053F21A4FD7600F838EF /* downsampled_render_buffer.cc */, + 691E054021A4FD7600F838EF /* vector_buffer.h */, + 691E054121A4FD7600F838EF /* matrix_buffer.cc */, + 691E054221A4FD7600F838EF /* reverb_frequency_response.h */, + 691E054321A4FD7600F838EF /* echo_audibility.h */, + 691E054421A4FD7600F838EF /* fft_buffer.h */, + 691E054521A4FD7600F838EF /* block_processor2.cc */, + 691E054621A4FD7600F838EF /* echo_canceller3.cc */, + 691E054721A4FD7600F838EF /* block_delay_buffer.cc */, + 691E054821A4FD7600F838EF /* aec3_common.h */, + 691E054921A4FD7600F838EF /* fft_buffer.cc */, + 691E054A21A4FD7600F838EF /* vector_math.h */, + 691E054B21A4FD7600F838EF /* decimator.h */, + 691E054C21A4FD7600F838EF /* frame_blocker.h */, + 691E054D21A4FD7600F838EF /* block_framer.h */, + 691E054E21A4FD7600F838EF /* suppression_gain_limiter.h */, + 691E054F21A4FD7600F838EF /* delay_estimate.h */, + 691E055021A4FD7600F838EF /* comfort_noise_generator.cc */, + 691E055121A4FD7600F838EF /* reverb_model.h */, + 691E055221A4FD7600F838EF /* main_filter_update_gain.h */, + 691E055321A4FD7600F838EF /* matched_filter_lag_aggregator.h */, + 691E055421A4FD7600F838EF /* shadow_filter_update_gain.cc */, + 691E055521A4FD7600F838EF /* filter_analyzer.cc */, + 691E055621A4FD7600F838EF /* reverb_decay_estimator.h */, + 691E055721A4FD7600F838EF /* reverb_frequency_response.cc */, + 691E055821A4FD7600F838EF /* decimator.cc */, + 691E055921A4FD7600F838EF /* render_delay_buffer.h */, + ); + path = aec3; + sourceTree = ""; + }; + 691E055D21A4FD7600F838EF /* logging */ = { + isa = PBXGroup; + children = ( + 691E055E21A4FD7600F838EF /* apm_data_dumper.cc */, + 691E055F21A4FD7600F838EF /* apm_data_dumper.h */, + ); + path = logging; + sourceTree = ""; + }; + 691E056021A4FD7600F838EF /* vad */ = { + isa = PBXGroup; + children = ( + 691E056121A4FD7600F838EF /* voice_activity_detector.cc */, + 691E056221A4FD7600F838EF /* standalone_vad.cc */, + 691E056321A4FD7600F838EF /* vad_audio_proc_internal.h */, + 691E056421A4FD7600F838EF /* pitch_internal.cc */, + 691E056521A4FD7600F838EF /* vad_circular_buffer.cc */, + 691E056621A4FD7600F838EF /* vad_circular_buffer.h */, + 691E056721A4FD7600F838EF /* pitch_based_vad.h */, + 691E056821A4FD7600F838EF /* vad_audio_proc.cc */, + 691E056921A4FD7600F838EF /* pole_zero_filter.cc */, + 691E056A21A4FD7600F838EF /* pole_zero_filter.h */, + 691E056B21A4FD7600F838EF /* pitch_based_vad.cc */, + 691E056C21A4FD7600F838EF /* gmm.h */, + 691E056D21A4FD7600F838EF /* common.h */, + 691E056E21A4FD7600F838EF /* vad_audio_proc.h */, + 691E056F21A4FD7600F838EF /* voice_gmm_tables.h */, + 691E057021A4FD7600F838EF /* noise_gmm_tables.h */, + 691E057121A4FD7600F838EF /* pitch_internal.h */, + 691E057221A4FD7600F838EF /* gmm.cc */, + 691E057321A4FD7600F838EF /* standalone_vad.h */, + 691E057421A4FD7600F838EF /* voice_activity_detector.h */, + ); + path = vad; + sourceTree = ""; + }; + 691E057521A4FD7600F838EF /* utility */ = { + isa = PBXGroup; + children = ( + 691E057621A4FD7600F838EF /* ooura_fft_tables_neon_sse2.h */, + 691E057721A4FD7600F838EF /* delay_estimator_internal.h */, + 691E057821A4FD7600F838EF /* ooura_fft.cc */, + 691E057921A4FD7600F838EF /* ooura_fft.h */, + 691E057A21A4FD7600F838EF /* delay_estimator_wrapper.cc */, + 691E057B21A4FD7600F838EF /* ooura_fft_sse2.cc */, + 691E057C21A4FD7600F838EF /* delay_estimator.cc */, + 691E057D21A4FD7600F838EF /* block_mean_calculator.h */, + 691E057E21A4FD7600F838EF /* ooura_fft_neon.cc */, + 691E057F21A4FD7600F838EF /* block_mean_calculator.cc */, + 691E058021A4FD7600F838EF /* delay_estimator.h */, + 691E058121A4FD7600F838EF /* ooura_fft_tables_common.h */, + 691E058221A4FD7600F838EF /* delay_estimator_wrapper.h */, + ); + path = utility; + sourceTree = ""; + }; + 691E058321A4FD7600F838EF /* rtc_base */ = { + isa = PBXGroup; + children = ( + 691E058421A4FD7600F838EF /* string_to_number.h */, + 691E058521A4FD7600F838EF /* constructormagic.h */, + 691E058621A4FD7600F838EF /* race_checker.cc */, + 691E058721A4FD7600F838EF /* strings */, + 691E058A21A4FD7600F838EF /* event_tracer.h */, + 691E058B21A4FD7600F838EF /* stringencode.h */, + 691E058C21A4FD7600F838EF /* memory */, + 691E058F21A4FD7600F838EF /* timeutils.cc */, + 691E059021A4FD7600F838EF /* event.h */, + 691E059121A4FD7600F838EF /* logging_mac.mm */, + 691E059221A4FD7600F838EF /* ignore_wundef.h */, + 691E059321A4FD7600F838EF /* stringutils.h */, + 691E059421A4FD7600F838EF /* arraysize.h */, + 691E059521A4FD7600F838EF /* platform_file.cc */, + 691E059621A4FD7600F838EF /* swap_queue.h */, + 691E059721A4FD7600F838EF /* string_to_number.cc */, + 691E059821A4FD7600F838EF /* trace_event.h */, + 691E059921A4FD7600F838EF /* checks.h */, + 691E059A21A4FD7600F838EF /* deprecation.h */, + 691E059B21A4FD7600F838EF /* thread_checker_impl.cc */, + 691E059C21A4FD7600F838EF /* sanitizer.h */, + 691E059D21A4FD7600F838EF /* scoped_ref_ptr.h */, + 691E059E21A4FD7600F838EF /* logging.h */, + 691E059F21A4FD7600F838EF /* timeutils.h */, + 691E05A021A4FD7600F838EF /* atomicops.h */, + 691E05A121A4FD7600F838EF /* stringencode.cc */, + 691E05A221A4FD7600F838EF /* stringutils.cc */, + 691E05A321A4FD7600F838EF /* checks.cc */, + 691E05A421A4FD7600F838EF /* numerics */, + 691E05A921A4FD7600F838EF /* system */, + 691E05B021A4FD7600F838EF /* platform_thread.cc */, + 691E05B121A4FD7600F838EF /* platform_thread.h */, + 691E05B221A4FD7600F838EF /* logging_webrtc.cc */, + 691E05B321A4FD7600F838EF /* platform_thread_types.h */, + 691E05B421A4FD7600F838EF /* protobuf_utils.h */, + 691E05B521A4FD7600F838EF /* thread_annotations.h */, + 691E05B621A4FD7600F838EF /* gtest_prod_util.h */, + 691E05B721A4FD7600F838EF /* function_view.h */, + 691E05B821A4FD7600F838EF /* criticalsection.h */, + 691E05B921A4FD7600F838EF /* criticalsection.cc */, + 691E05BA21A4FD7600F838EF /* platform_thread_types.cc */, + 691E05BB21A4FD7600F838EF /* refcount.h */, + 691E05BC21A4FD7600F838EF /* event.cc */, + 691E05BD21A4FD7600F838EF /* thread_checker_impl.h */, + 691E05BE21A4FD7600F838EF /* event_tracer.cc */, + 691E05BF21A4FD7600F838EF /* compile_assert_c.h */, + 691E05C021A4FD7600F838EF /* type_traits.h */, + 691E05C121A4FD7600F838EF /* platform_file.h */, + 691E05C221A4FD7600F838EF /* refcounter.h */, + 691E05C321A4FD7600F838EF /* logging_mac.h */, + 691E05C421A4FD7600F838EF /* thread_checker.h */, + 691E05C521A4FD7600F838EF /* race_checker.h */, + 691E05C621A4FD7600F838EF /* refcountedobject.h */, + ); + path = rtc_base; + sourceTree = ""; + }; + 691E058721A4FD7600F838EF /* strings */ = { + isa = PBXGroup; + children = ( + 691E058821A4FD7600F838EF /* string_builder.h */, + 691E058921A4FD7600F838EF /* string_builder.cc */, + ); + path = strings; + sourceTree = ""; + }; + 691E058C21A4FD7600F838EF /* memory */ = { + isa = PBXGroup; + children = ( + 691E058D21A4FD7600F838EF /* aligned_malloc.cc */, + 691E058E21A4FD7600F838EF /* aligned_malloc.h */, + ); + path = memory; + sourceTree = ""; + }; + 691E05A421A4FD7600F838EF /* numerics */ = { + isa = PBXGroup; + children = ( + 691E05A521A4FD7600F838EF /* safe_minmax.h */, + 691E05A621A4FD7600F838EF /* safe_conversions.h */, + 691E05A721A4FD7600F838EF /* safe_conversions_impl.h */, + 691E05A821A4FD7600F838EF /* safe_compare.h */, + ); + path = numerics; + sourceTree = ""; + }; + 691E05A921A4FD7600F838EF /* system */ = { + isa = PBXGroup; + children = ( + 691E05AA21A4FD7600F838EF /* unused.h */, + 691E05AB21A4FD7600F838EF /* inline.h */, + 691E05AC21A4FD7600F838EF /* ignore_warnings.h */, + 691E05AD21A4FD7600F838EF /* asm_defines.h */, + 691E05AE21A4FD7600F838EF /* rtc_export.h */, + 691E05AF21A4FD7600F838EF /* arch.h */, + ); + path = system; + sourceTree = ""; + }; 692AB8861E6759BF00706ACC /* libtgvoip */ = { isa = PBXGroup; children = ( @@ -509,6 +2220,7 @@ 692AB8A71E6759DD00706ACC /* Info.plist */, 692AB8A81E6759DD00706ACC /* JitterBuffer.cpp */, 692AB8A91E6759DD00706ACC /* JitterBuffer.h */, + 69A2076421AF6289003AC4F9 /* json11.cpp */, 6915307A1E6B5BAB004F643F /* logging.cpp */, 692AB8AA1E6759DD00706ACC /* logging.h */, 692AB8AB1E6759DD00706ACC /* MediaStreamItf.cpp */, @@ -530,6 +2242,7 @@ 692AB8C91E6759DD00706ACC /* VoIPServerConfig.cpp */, 692AB8CA1E6759DD00706ACC /* VoIPServerConfig.h */, 697B6FDC2136E673004C8E54 /* utils.h */, + 694DE89B219F2265009C09A7 /* video */, 69A6DE201E96149300000E69 /* webrtc_dsp */, ); name = libtgvoip; @@ -606,6 +2319,17 @@ name = Products; sourceTree = ""; }; + 694DE89B219F2265009C09A7 /* video */ = { + isa = PBXGroup; + children = ( + 694DE89C219F2265009C09A7 /* VideoRenderer.h */, + 694DE89D219F2265009C09A7 /* VideoRenderer.cpp */, + 694DE89E219F2265009C09A7 /* VideoSource.cpp */, + 694DE89F219F2265009C09A7 /* VideoSource.h */, + ); + path = video; + sourceTree = ""; + }; 697B6FC52136DBA4004C8E54 /* tests */ = { isa = PBXGroup; children = ( @@ -620,292 +2344,18 @@ 69A6DE201E96149300000E69 /* webrtc_dsp */ = { isa = PBXGroup; children = ( - 69A6DE211E96149300000E69 /* webrtc */, + 691E032F21A4FD7500F838EF /* absl */, + 691E03CE21A4FD7500F838EF /* api */, + 691E035821A4FD7500F838EF /* common_audio */, + 691E03EB21A4FD7500F838EF /* modules */, + 691E058321A4FD7600F838EF /* rtc_base */, + 691E03E021A4FD7500F838EF /* system_wrappers */, + 691E03D821A4FD7500F838EF /* third_party */, + 691E032E21A4FD7500F838EF /* typedefs.h */, ); path = webrtc_dsp; sourceTree = SOURCE_ROOT; }; - 69A6DE211E96149300000E69 /* webrtc */ = { - isa = PBXGroup; - children = ( - 69A6DE221E96149300000E69 /* base */, - 69A6DE301E96149300000E69 /* common_audio */, - 69A6DE711E96149300000E69 /* modules */, - 69A6DEB01E96149300000E69 /* system_wrappers */, - 69A6DEB81E96149300000E69 /* typedefs.h */, - ); - path = webrtc; - sourceTree = ""; - }; - 69A6DE221E96149300000E69 /* base */ = { - isa = PBXGroup; - children = ( - 69A6DE231E96149300000E69 /* array_view.h */, - 69A6DE241E96149300000E69 /* atomicops.h */, - 69A6DE251E96149300000E69 /* basictypes.h */, - 69A6DE261E96149300000E69 /* checks.cc */, - 69A6DE271E96149300000E69 /* checks.h */, - 69A6DE281E96149300000E69 /* constructormagic.h */, - 69A6DE291E96149300000E69 /* safe_compare.h */, - 69A6DE2A1E96149300000E69 /* safe_conversions.h */, - 69A6DE2B1E96149300000E69 /* safe_conversions_impl.h */, - 69A6DE2C1E96149300000E69 /* sanitizer.h */, - 69A6DE2D1E96149300000E69 /* stringutils.cc */, - 69A6DE2E1E96149300000E69 /* stringutils.h */, - 69A6DE2F1E96149300000E69 /* type_traits.h */, - ); - path = base; - sourceTree = ""; - }; - 69A6DE301E96149300000E69 /* common_audio */ = { - isa = PBXGroup; - children = ( - 69A6DE311E96149300000E69 /* audio_util.cc */, - 69A6DE321E96149300000E69 /* channel_buffer.cc */, - 69A6DE331E96149300000E69 /* channel_buffer.h */, - 69A6DE341E96149300000E69 /* fft4g.c */, - 69A6DE351E96149300000E69 /* fft4g.h */, - 69A6DE361E96149300000E69 /* include */, - 69A6DE381E96149300000E69 /* ring_buffer.c */, - 69A6DE391E96149300000E69 /* ring_buffer.h */, - 69A6DE3A1E96149300000E69 /* signal_processing */, - 69A6DE6B1E96149300000E69 /* sparse_fir_filter.cc */, - 69A6DE6C1E96149300000E69 /* sparse_fir_filter.h */, - 69A6DE6D1E96149300000E69 /* wav_file.cc */, - 69A6DE6E1E96149300000E69 /* wav_file.h */, - 69A6DE6F1E96149300000E69 /* wav_header.cc */, - 69A6DE701E96149300000E69 /* wav_header.h */, - ); - path = common_audio; - sourceTree = ""; - }; - 69A6DE361E96149300000E69 /* include */ = { - isa = PBXGroup; - children = ( - 69A6DE371E96149300000E69 /* audio_util.h */, - ); - path = include; - sourceTree = ""; - }; - 69A6DE3A1E96149300000E69 /* signal_processing */ = { - isa = PBXGroup; - children = ( - 69A6DE3B1E96149300000E69 /* auto_corr_to_refl_coef.c */, - 69A6DE3C1E96149300000E69 /* auto_correlation.c */, - 69A6DE3D1E96149300000E69 /* complex_bit_reverse.c */, - 69A6DE3F1E96149300000E69 /* complex_fft.c */, - 69A6DE401E96149300000E69 /* complex_fft_tables.h */, - 69A6DE411E96149300000E69 /* copy_set_operations.c */, - 69A6DE421E96149300000E69 /* cross_correlation.c */, - 69A6DE431E96149300000E69 /* cross_correlation_neon.c */, - 69A6DE441E96149300000E69 /* division_operations.c */, - 69A6DE451E96149300000E69 /* dot_product_with_scale.c */, - 69A6DE461E96149300000E69 /* downsample_fast.c */, - 69A6DE471E96149300000E69 /* downsample_fast_neon.c */, - 69A6DE481E96149300000E69 /* energy.c */, - 69A6DE491E96149300000E69 /* filter_ar.c */, - 69A6DE4A1E96149300000E69 /* filter_ar_fast_q12.c */, - 69A6DE4C1E96149300000E69 /* filter_ma_fast_q12.c */, - 69A6DE4D1E96149300000E69 /* get_hanning_window.c */, - 69A6DE4E1E96149300000E69 /* get_scaling_square.c */, - 69A6DE4F1E96149300000E69 /* ilbc_specific_functions.c */, - 69A6DE501E96149300000E69 /* include */, - 69A6DE561E96149300000E69 /* levinson_durbin.c */, - 69A6DE571E96149300000E69 /* lpc_to_refl_coef.c */, - 69A6DE581E96149300000E69 /* min_max_operations.c */, - 69A6DE591E96149300000E69 /* min_max_operations_neon.c */, - 69A6DE5A1E96149300000E69 /* randomization_functions.c */, - 69A6DE5B1E96149300000E69 /* real_fft.c */, - 69A6DE5C1E96149300000E69 /* refl_coef_to_lpc.c */, - 69A6DE5D1E96149300000E69 /* resample.c */, - 69A6DE5E1E96149300000E69 /* resample_48khz.c */, - 69A6DE5F1E96149300000E69 /* resample_by_2.c */, - 69A6DE601E96149300000E69 /* resample_by_2_internal.c */, - 69A6DE611E96149300000E69 /* resample_by_2_internal.h */, - 69A6DE621E96149300000E69 /* resample_fractional.c */, - 69A6DE631E96149300000E69 /* spl_init.c */, - 69A6DE641E96149300000E69 /* spl_inl.c */, - 69A6DE651E96149300000E69 /* spl_sqrt.c */, - 69A6DE661E96149300000E69 /* spl_sqrt_floor.c */, - 69A6DE681E96149300000E69 /* splitting_filter_impl.c */, - 69A6DE691E96149300000E69 /* sqrt_of_one_minus_x_squared.c */, - 69A6DE6A1E96149300000E69 /* vector_scaling_operations.c */, - ); - path = signal_processing; - sourceTree = ""; - }; - 69A6DE501E96149300000E69 /* include */ = { - isa = PBXGroup; - children = ( - 69A6DE511E96149300000E69 /* real_fft.h */, - 69A6DE521E96149300000E69 /* signal_processing_library.h */, - 69A6DE531E96149300000E69 /* spl_inl.h */, - 69A6DE541E96149300000E69 /* spl_inl_armv7.h */, - 69A6DE551E96149300000E69 /* spl_inl_mips.h */, - ); - path = include; - sourceTree = ""; - }; - 69A6DE711E96149300000E69 /* modules */ = { - isa = PBXGroup; - children = ( - 69A6DE721E96149300000E69 /* audio_processing */, - ); - name = modules; - path = webrtc_dsp/webrtc/modules; - sourceTree = SOURCE_ROOT; - }; - 69A6DE721E96149300000E69 /* audio_processing */ = { - isa = PBXGroup; - children = ( - 69A6DE731E96149300000E69 /* aec */, - 69A6DE7E1E96149300000E69 /* aecm */, - 69A6DE861E96149300000E69 /* agc */, - 69A6DE8D1E96149300000E69 /* logging */, - 69A6DE901E96149300000E69 /* ns */, - 69A6DE9E1E96149300000E69 /* splitting_filter.cc */, - 69A6DE9F1E96149300000E69 /* splitting_filter.h */, - 69A6DEA01E96149300000E69 /* three_band_filter_bank.cc */, - 69A6DEA11E96149300000E69 /* three_band_filter_bank.h */, - 69A6DEA21E96149300000E69 /* utility */, - ); - path = audio_processing; - sourceTree = ""; - }; - 69A6DE731E96149300000E69 /* aec */ = { - isa = PBXGroup; - children = ( - 69A6DE741E96149300000E69 /* aec_common.h */, - 69A6DE751E96149300000E69 /* aec_core.cc */, - 69A6DE761E96149300000E69 /* aec_core.h */, - 69A6DE771E96149300000E69 /* aec_core_neon.cc */, - 69A6DE781E96149300000E69 /* aec_core_optimized_methods.h */, - 69A6DE791E96149300000E69 /* aec_core_sse2.cc */, - 69A6DE7A1E96149300000E69 /* aec_resampler.cc */, - 69A6DE7B1E96149300000E69 /* aec_resampler.h */, - 69A6DE7C1E96149300000E69 /* echo_cancellation.cc */, - 69A6DE7D1E96149300000E69 /* echo_cancellation.h */, - ); - name = aec; - path = webrtc_dsp/webrtc/modules/audio_processing/aec; - sourceTree = SOURCE_ROOT; - }; - 69A6DE7E1E96149300000E69 /* aecm */ = { - isa = PBXGroup; - children = ( - 69A6DE7F1E96149300000E69 /* aecm_core.cc */, - 69A6DE801E96149300000E69 /* aecm_core.h */, - 69A6DE811E96149300000E69 /* aecm_core_c.cc */, - 69A6DE821E96149300000E69 /* aecm_core_neon.cc */, - 69A6DE831E96149300000E69 /* aecm_defines.h */, - 69A6DE841E96149300000E69 /* echo_control_mobile.cc */, - 69A6DE851E96149300000E69 /* echo_control_mobile.h */, - ); - name = aecm; - path = webrtc_dsp/webrtc/modules/audio_processing/aecm; - sourceTree = SOURCE_ROOT; - }; - 69A6DE861E96149300000E69 /* agc */ = { - isa = PBXGroup; - children = ( - 69A6DE871E96149300000E69 /* legacy */, - ); - name = agc; - path = webrtc_dsp/webrtc/modules/audio_processing/agc; - sourceTree = SOURCE_ROOT; - }; - 69A6DE871E96149300000E69 /* legacy */ = { - isa = PBXGroup; - children = ( - 69A6DE881E96149300000E69 /* analog_agc.c */, - 69A6DE891E96149300000E69 /* analog_agc.h */, - 69A6DE8A1E96149300000E69 /* digital_agc.c */, - 69A6DE8B1E96149300000E69 /* digital_agc.h */, - 69A6DE8C1E96149300000E69 /* gain_control.h */, - ); - path = legacy; - sourceTree = ""; - }; - 69A6DE8D1E96149300000E69 /* logging */ = { - isa = PBXGroup; - children = ( - 69A6DE8E1E96149300000E69 /* apm_data_dumper.cc */, - 69A6DE8F1E96149300000E69 /* apm_data_dumper.h */, - ); - name = logging; - path = webrtc_dsp/webrtc/modules/audio_processing/logging; - sourceTree = SOURCE_ROOT; - }; - 69A6DE901E96149300000E69 /* ns */ = { - isa = PBXGroup; - children = ( - 69A6DE911E96149300000E69 /* defines.h */, - 69A6DE921E96149300000E69 /* noise_suppression.c */, - 69A6DE931E96149300000E69 /* noise_suppression.h */, - 69A6DE941E96149300000E69 /* noise_suppression_x.c */, - 69A6DE951E96149300000E69 /* noise_suppression_x.h */, - 69A6DE961E96149300000E69 /* ns_core.c */, - 69A6DE971E96149300000E69 /* ns_core.h */, - 69A6DE981E96149300000E69 /* nsx_core.c */, - 69A6DE991E96149300000E69 /* nsx_core.h */, - 69A6DE9A1E96149300000E69 /* nsx_core_c.c */, - 69A6DE9B1E96149300000E69 /* nsx_core_neon.c */, - 69A6DE9C1E96149300000E69 /* nsx_defines.h */, - 69A6DE9D1E96149300000E69 /* windows_private.h */, - ); - name = ns; - path = webrtc_dsp/webrtc/modules/audio_processing/ns; - sourceTree = SOURCE_ROOT; - }; - 69A6DEA21E96149300000E69 /* utility */ = { - isa = PBXGroup; - children = ( - 69A6DEA31E96149300000E69 /* block_mean_calculator.cc */, - 69A6DEA41E96149300000E69 /* block_mean_calculator.h */, - 69A6DEA51E96149300000E69 /* delay_estimator.cc */, - 69A6DEA61E96149300000E69 /* delay_estimator.h */, - 69A6DEA71E96149300000E69 /* delay_estimator_internal.h */, - 69A6DEA81E96149300000E69 /* delay_estimator_wrapper.cc */, - 69A6DEA91E96149300000E69 /* delay_estimator_wrapper.h */, - 69A6DEAA1E96149300000E69 /* ooura_fft.cc */, - 69A6DEAB1E96149300000E69 /* ooura_fft.h */, - 69A6DEAC1E96149300000E69 /* ooura_fft_neon.cc */, - 69A6DEAD1E96149300000E69 /* ooura_fft_sse2.cc */, - 69A6DEAE1E96149300000E69 /* ooura_fft_tables_common.h */, - 69A6DEAF1E96149300000E69 /* ooura_fft_tables_neon_sse2.h */, - ); - name = utility; - path = webrtc_dsp/webrtc/modules/audio_processing/utility; - sourceTree = SOURCE_ROOT; - }; - 69A6DEB01E96149300000E69 /* system_wrappers */ = { - isa = PBXGroup; - children = ( - 69A6DEB11E96149300000E69 /* include */, - 69A6DEB61E96149300000E69 /* source */, - ); - path = system_wrappers; - sourceTree = ""; - }; - 69A6DEB11E96149300000E69 /* include */ = { - isa = PBXGroup; - children = ( - 69A6DEB21E96149300000E69 /* asm_defines.h */, - 69A6DEB31E96149300000E69 /* compile_assert_c.h */, - 69A6DEB41E96149300000E69 /* cpu_features_wrapper.h */, - 69A6DEB51E96149300000E69 /* metrics.h */, - ); - path = include; - sourceTree = ""; - }; - 69A6DEB61E96149300000E69 /* source */ = { - isa = PBXGroup; - children = ( - 69A6DEB71E96149300000E69 /* cpu_features.cc */, - ); - path = source; - sourceTree = ""; - }; 69F8422C1E67540700C110F7 = { isa = PBXGroup; children = ( @@ -932,90 +2382,8 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 69A6DF181E96149300000E69 /* gain_control.h in Headers */, - 69A6DF231E96149300000E69 /* nsx_core.h in Headers */, - 692AB9011E6759DD00706ACC /* threading.h in Headers */, - 697B6FD32136E18A004C8E54 /* AudioUnitIO.h in Headers */, - 69A6DF2B1E96149300000E69 /* three_band_filter_bank.h in Headers */, - 692AB8EA1E6759DD00706ACC /* MediaStreamItf.h in Headers */, - 69A6DF3E1E96149300000E69 /* typedefs.h in Headers */, - 69A6DF001E96149300000E69 /* wav_file.h in Headers */, - 692AB8EE1E6759DD00706ACC /* OpusEncoder.h in Headers */, - 692AB8CE1E6759DD00706ACC /* AudioOutput.h in Headers */, - 69A6DF321E96149300000E69 /* delay_estimator_wrapper.h in Headers */, - 69A6DEBD1E96149300000E69 /* checks.h in Headers */, - 69A6DF1B1E96149300000E69 /* defines.h in Headers */, - 69A6DEF31E96149300000E69 /* resample_by_2_internal.h in Headers */, - 69A6DF341E96149300000E69 /* ooura_fft.h in Headers */, - 69A6DEBA1E96149300000E69 /* atomicops.h in Headers */, - 69A6DF0A1E96149300000E69 /* aec_resampler.h in Headers */, - 695B20621EBD39FF00E31757 /* DarwinSpecific.h in Headers */, - 69A6DEE51E96149300000E69 /* spl_inl.h in Headers */, - 69A6DF3B1E96149300000E69 /* cpu_features_wrapper.h in Headers */, - 69A6DF211E96149300000E69 /* ns_core.h in Headers */, - 69A6DF051E96149300000E69 /* aec_core.h in Headers */, - 6976FD0420F6A7060019939E /* MessageThread.h in Headers */, - 69A6DF441E9614B700000E69 /* AudioInputAudioUnitOSX.h in Headers */, - 692AB8D91E6759DD00706ACC /* CongestionControl.h in Headers */, - 69A6DF031E96149300000E69 /* aec_common.h in Headers */, - 69A6DEBE1E96149300000E69 /* constructormagic.h in Headers */, - 69A6DED31E96149300000E69 /* complex_fft_tables.h in Headers */, - 69A6DF021E96149300000E69 /* wav_header.h in Headers */, - 69A6DECB1E96149300000E69 /* audio_util.h in Headers */, - 692AB8CC1E6759DD00706ACC /* AudioInput.h in Headers */, - 69A6DEC51E96149300000E69 /* type_traits.h in Headers */, - 692AB8EC1E6759DD00706ACC /* OpusDecoder.h in Headers */, - 692AB8E81E6759DD00706ACC /* logging.h in Headers */, - 69A6DF3A1E96149300000E69 /* compile_assert_c.h in Headers */, - 69A6DF071E96149300000E69 /* aec_core_optimized_methods.h in Headers */, - 69A6DEC81E96149300000E69 /* channel_buffer.h in Headers */, - 692AB8D41E6759DD00706ACC /* PrivateDefines.h in Headers */, 692AB9051E6759DD00706ACC /* VoIPServerConfig.h in Headers */, - 69A6DF461E9614B700000E69 /* AudioOutputAudioUnitOSX.h in Headers */, 692AB9031E6759DD00706ACC /* VoIPController.h in Headers */, - 69A6DEB91E96149300000E69 /* array_view.h in Headers */, - 692AB8D01E6759DD00706ACC /* BlockingQueue.h in Headers */, - 69EBC7962136D2A9003CFE90 /* Resampler.h in Headers */, - 69A6DECD1E96149300000E69 /* ring_buffer.h in Headers */, - 69A6DEE61E96149300000E69 /* spl_inl_armv7.h in Headers */, - 69A6DF171E96149300000E69 /* digital_agc.h in Headers */, - 69A6DF0C1E96149300000E69 /* echo_cancellation.h in Headers */, - 69A6DEFE1E96149300000E69 /* sparse_fir_filter.h in Headers */, - 69A6DEC21E96149300000E69 /* sanitizer.h in Headers */, - 69A6DF151E96149300000E69 /* analog_agc.h in Headers */, - 69A6DF381E96149300000E69 /* ooura_fft_tables_neon_sse2.h in Headers */, - 69A6DF271E96149300000E69 /* windows_private.h in Headers */, - 69A6DF291E96149300000E69 /* splitting_filter.h in Headers */, - 692AB8DB1E6759DD00706ACC /* EchoCanceller.h in Headers */, - 69A6DF391E96149300000E69 /* asm_defines.h in Headers */, - 690725C31EBBD5F2005D860B /* NetworkSocket.h in Headers */, - 69A6DF1D1E96149300000E69 /* noise_suppression.h in Headers */, - 69A6DEBF1E96149300000E69 /* safe_compare.h in Headers */, - 69A6DF111E96149300000E69 /* aecm_defines.h in Headers */, - 69A6DEE31E96149300000E69 /* real_fft.h in Headers */, - 69A6DECA1E96149300000E69 /* fft4g.h in Headers */, - 69A6DF2D1E96149300000E69 /* block_mean_calculator.h in Headers */, - 69A6DF3C1E96149300000E69 /* metrics.h in Headers */, - 69A6DF0E1E96149300000E69 /* aecm_core.h in Headers */, - 69A6DF2F1E96149300000E69 /* delay_estimator.h in Headers */, - 69A6DEC41E96149300000E69 /* stringutils.h in Headers */, - 69A6DF1F1E96149300000E69 /* noise_suppression_x.h in Headers */, - 692AB8E71E6759DD00706ACC /* JitterBuffer.h in Headers */, - 690725BF1EBBD5DE005D860B /* NetworkSocketPosix.h in Headers */, - 69A6DF131E96149300000E69 /* echo_control_mobile.h in Headers */, - 69A6DEE41E96149300000E69 /* signal_processing_library.h in Headers */, - 697B6FDB2136E2D9004C8E54 /* AudioIOCallback.h in Headers */, - 69A6DF1A1E96149300000E69 /* apm_data_dumper.h in Headers */, - 692AB8D21E6759DD00706ACC /* Buffers.h in Headers */, - 697B6FD72136E1F3004C8E54 /* AudioIO.h in Headers */, - 69A6DF371E96149300000E69 /* ooura_fft_tables_common.h in Headers */, - 69A6DF301E96149300000E69 /* delay_estimator_internal.h in Headers */, - 69A6DEBB1E96149300000E69 /* basictypes.h in Headers */, - 69A6DEE71E96149300000E69 /* spl_inl_mips.h in Headers */, - 69A6DF261E96149300000E69 /* nsx_defines.h in Headers */, - 6971221020C8107F00971C2C /* PacketReassembler.h in Headers */, - 69A6DEC11E96149300000E69 /* safe_conversions_impl.h in Headers */, - 69A6DEC01E96149300000E69 /* safe_conversions.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1184,108 +2552,315 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 69A6DEFB1E96149300000E69 /* sqrt_of_one_minus_x_squared.c in Sources */, - 69A6DEDD1E96149300000E69 /* filter_ar_fast_q12.c in Sources */, - 69A6DEF41E96149300000E69 /* resample_fractional.c in Sources */, + 691E075321A4FD7700F838EF /* render_delay_buffer2.cc in Sources */, + 691E067721A4FD7600F838EF /* encode_lpc_swb.c in Sources */, + 691E05F921A4FD7600F838EF /* push_sinc_resampler.cc in Sources */, + 691E079021A4FD7700F838EF /* residual_echo_estimator.cc in Sources */, + 691E072421A4FD7700F838EF /* echo_cancellation_impl.cc in Sources */, + 691E071621A4FD7700F838EF /* level_estimator_impl.cc in Sources */, + 691E079E21A4FD7700F838EF /* downsampled_render_buffer.cc in Sources */, + 691E06D021A4FD7600F838EF /* adaptive_digital_gain_applier.cc in Sources */, + 691E07E121A4FD7700F838EF /* race_checker.cc in Sources */, + 691E062D21A4FD7600F838EF /* get_scaling_square.c in Sources */, + 691E080721A4FD7700F838EF /* platform_thread.cc in Sources */, + 691E078021A4FD7700F838EF /* stationarity_estimator.cc in Sources */, + 691E062121A4FD7600F838EF /* sqrt_of_one_minus_x_squared.c in Sources */, + 691E06F321A4FD7600F838EF /* vad_with_level.cc in Sources */, + 691E061D21A4FD7600F838EF /* auto_corr_to_refl_coef.c in Sources */, + 694DE8A2219F2265009C09A7 /* VideoSource.cpp in Sources */, 6915307B1E6B5BAB004F643F /* logging.cpp in Sources */, - 69A6DEE11E96149300000E69 /* get_scaling_square.c in Sources */, + 691E067C21A4FD7600F838EF /* lpc_tables.c in Sources */, + 691E066221A4FD7600F838EF /* field_trial.cc in Sources */, + 691E067621A4FD7600F838EF /* pitch_filter.c in Sources */, + 691E070321A4FD7600F838EF /* biquad_filter.cc in Sources */, + 691E064621A4FD7600F838EF /* webrtc_vad.c in Sources */, + 691E064221A4FD7600F838EF /* spl_sqrt.c in Sources */, + 691E062321A4FD7600F838EF /* filter_ar_fast_q12.c in Sources */, + 691E07A821A4FD7700F838EF /* fft_buffer.cc in Sources */, + 691E05CA21A4FD7600F838EF /* string_view.cc in Sources */, + 691E079C21A4FD7700F838EF /* echo_remover.cc in Sources */, + 691E061921A4FD7600F838EF /* splitting_filter1.c in Sources */, + 691E07BF21A4FD7700F838EF /* standalone_vad.cc in Sources */, + 691E07CF21A4FD7700F838EF /* gmm.cc in Sources */, + 691E080921A4FD7700F838EF /* logging_webrtc.cc in Sources */, + 691E05F121A4FD7600F838EF /* wav_header.cc in Sources */, + 691E062021A4FD7600F838EF /* energy.c in Sources */, + 691E074621A4FD7700F838EF /* aecm_core.cc in Sources */, + 691E06FD21A4FD7600F838EF /* down_sampler.cc in Sources */, + 691E07C821A4FD7700F838EF /* pitch_based_vad.cc in Sources */, + 691E077A21A4FD7700F838EF /* reverb_model.cc in Sources */, + 691E064B21A4FD7600F838EF /* vad_filterbank.c in Sources */, + 691E069621A4FD7600F838EF /* pitch_lag_tables.c in Sources */, + 691E076421A4FD7700F838EF /* block_processor.cc in Sources */, + 691E069021A4FD7600F838EF /* crc.c in Sources */, + 691E064121A4FD7600F838EF /* spl_inl.c in Sources */, + 691E06AA21A4FD7600F838EF /* nsx_core_c.c in Sources */, + 691E06A421A4FD7600F838EF /* splitting_filter.cc in Sources */, + 691E07E321A4FD7700F838EF /* string_builder.cc in Sources */, + 691E071421A4FD7700F838EF /* low_cut_filter.cc in Sources */, + 691E074B21A4FD7700F838EF /* render_reverb_model.cc in Sources */, + 691E081521A4FD7700F838EF /* event_tracer.cc in Sources */, C2A87DE41F4B6AD3002D3F73 /* AudioUnitIO.cpp in Sources */, + 691E060D21A4FD7600F838EF /* real_fourier.cc in Sources */, + 691E076321A4FD7700F838EF /* suppression_filter.cc in Sources */, + 691E065621A4FD7600F838EF /* echo_canceller3_factory.cc in Sources */, + 691E05D021A4FD7600F838EF /* bad_optional_access.cc in Sources */, + 691E06D221A4FD7600F838EF /* saturation_protector.cc in Sources */, + 691E076C21A4FD7700F838EF /* vector_buffer.cc in Sources */, + 691E071121A4FD7700F838EF /* transient_suppressor.cc in Sources */, + 691E074A21A4FD7700F838EF /* echo_control_mobile.cc in Sources */, + 691E078621A4FD7700F838EF /* suppression_gain.cc in Sources */, + 691E072521A4FD7700F838EF /* gain_control_for_experimental_agc.cc in Sources */, + 691E081021A4FD7700F838EF /* criticalsection.cc in Sources */, + 691E05D121A4FD7600F838EF /* optional.cc in Sources */, + 691E061E21A4FD7600F838EF /* resample_by_2_internal.c in Sources */, + 691E066B21A4FD7600F838EF /* pitch_gain_tables.c in Sources */, 690725C21EBBD5F2005D860B /* NetworkSocket.cpp in Sources */, - 69A6DEC71E96149300000E69 /* channel_buffer.cc in Sources */, + 691E05E921A4FD7600F838EF /* channel_buffer.cc in Sources */, + 691E078721A4FD7700F838EF /* echo_audibility.cc in Sources */, + 691E068921A4FD7600F838EF /* entropy_coding.c in Sources */, 69EBC7922136D220003CFE90 /* AudioOutputAudioUnitOSX.cpp in Sources */, - 69A6DF191E96149300000E69 /* apm_data_dumper.cc in Sources */, - 69A6DF221E96149300000E69 /* nsx_core.c in Sources */, - 69A6DEDC1E96149300000E69 /* filter_ar.c in Sources */, - 69A6DEEB1E96149300000E69 /* min_max_operations_neon.c in Sources */, - 69A6DEE81E96149300000E69 /* levinson_durbin.c in Sources */, - 69A6DEE21E96149300000E69 /* ilbc_specific_functions.c in Sources */, + 691E061821A4FD7600F838EF /* filter_ma_fast_q12.c in Sources */, + 691E05D921A4FD7600F838EF /* raw_logging.cc in Sources */, + 691E079A21A4FD7700F838EF /* suppression_gain_limiter.cc in Sources */, + 691E079821A4FD7700F838EF /* render_delay_controller2.cc in Sources */, + 691E063E21A4FD7600F838EF /* resample_by_2.c in Sources */, + 691E067921A4FD7600F838EF /* decode.c in Sources */, + 691E06D121A4FD7600F838EF /* limiter.cc in Sources */, + 691E073F21A4FD7700F838EF /* residual_echo_detector.cc in Sources */, + 691E078521A4FD7700F838EF /* subtractor_output_analyzer.cc in Sources */, + 691E075721A4FD7700F838EF /* frame_blocker.cc in Sources */, + 691E07FB21A4FD7700F838EF /* stringutils.cc in Sources */, + 691E07C521A4FD7700F838EF /* vad_audio_proc.cc in Sources */, + 691E062E21A4FD7600F838EF /* min_max_operations_neon.c in Sources */, + 691E05F321A4FD7600F838EF /* fir_filter_neon.cc in Sources */, + 691E06E521A4FD7600F838EF /* pitch_search.cc in Sources */, + 691E062421A4FD7600F838EF /* spl_init.c in Sources */, + 691E06EF21A4FD7600F838EF /* agc2_testing_common.cc in Sources */, + 691E066421A4FD7600F838EF /* cpu_features.cc in Sources */, + 691E07DB21A4FD7700F838EF /* block_mean_calculator.cc in Sources */, 692AB9041E6759DD00706ACC /* VoIPServerConfig.cpp in Sources */, + 691E066A21A4FD7600F838EF /* lpc_shape_swb16_tables.c in Sources */, 69EBC7912136D220003CFE90 /* AudioInputAudioUnitOSX.cpp in Sources */, - 69A6DF0B1E96149300000E69 /* echo_cancellation.cc in Sources */, - 69A6DED61E96149300000E69 /* cross_correlation_neon.c in Sources */, + 691E071021A4FD7700F838EF /* wpd_node.cc in Sources */, + 691E062621A4FD7600F838EF /* cross_correlation.c in Sources */, + 691E07EE21A4FD7700F838EF /* platform_file.cc in Sources */, + 691E072C21A4FD7700F838EF /* analog_agc.c in Sources */, + 691E067D21A4FD7600F838EF /* lpc_gain_swb_tables.c in Sources */, + 691E06EB21A4FD7600F838EF /* adaptive_mode_level_estimator_agc.cc in Sources */, + 691E068421A4FD7600F838EF /* arith_routines_hist.c in Sources */, + 691E068121A4FD7600F838EF /* encode.c in Sources */, + 691E06E821A4FD7600F838EF /* fft_util.cc in Sources */, + 691E06C121A4FD7600F838EF /* aec_dump.cc in Sources */, + 691E075821A4FD7700F838EF /* subtractor.cc in Sources */, + 691E07BC21A4FD7700F838EF /* apm_data_dumper.cc in Sources */, + 691E076D21A4FD7700F838EF /* erl_estimator.cc in Sources */, + 691E074121A4FD7700F838EF /* noise_suppression_impl.cc in Sources */, 6976FD0320F6A7060019939E /* MessageThread.cpp in Sources */, - 69A6DEF71E96149300000E69 /* spl_sqrt.c in Sources */, - 69A6DEED1E96149300000E69 /* real_fft.c in Sources */, 692AB9021E6759DD00706ACC /* VoIPController.cpp in Sources */, - 69A6DF0D1E96149300000E69 /* aecm_core.cc in Sources */, - 69A6DF101E96149300000E69 /* aecm_core_neon.cc in Sources */, - 69A6DED71E96149300000E69 /* division_operations.c in Sources */, - 69A6DEDB1E96149300000E69 /* energy.c in Sources */, - 69A6DEC61E96149300000E69 /* audio_util.cc in Sources */, - 69A6DF141E96149300000E69 /* analog_agc.c in Sources */, - 69A6DEF81E96149300000E69 /* spl_sqrt_floor.c in Sources */, - 69A6DEF61E96149300000E69 /* spl_inl.c in Sources */, - 69A6DEEF1E96149300000E69 /* resample.c in Sources */, - 69A6DEF21E96149300000E69 /* resample_by_2_internal.c in Sources */, - 69A6DF011E96149300000E69 /* wav_header.cc in Sources */, - 69A6DF041E96149300000E69 /* aec_core.cc in Sources */, + 691E06F421A4FD7600F838EF /* limiter_db_gain_curve.cc in Sources */, + 691E05F821A4FD7600F838EF /* sinc_resampler_neon.cc in Sources */, + 691E07F021A4FD7700F838EF /* string_to_number.cc in Sources */, + 691E060621A4FD7600F838EF /* wav_file.cc in Sources */, + 691E07C621A4FD7700F838EF /* pole_zero_filter.cc in Sources */, + 691E06A921A4FD7600F838EF /* noise_suppression_x.c in Sources */, + 691E078121A4FD7700F838EF /* render_signal_analyzer.cc in Sources */, + 691E06CA21A4FD7600F838EF /* agc2_common.cc in Sources */, + 691E071221A4FD7700F838EF /* transient_detector.cc in Sources */, + 691E069721A4FD7600F838EF /* isac.c in Sources */, + 691E071C21A4FD7700F838EF /* aec_core.cc in Sources */, + 691E069E21A4FD7600F838EF /* normalized_covariance_estimator.cc in Sources */, 692AB8D81E6759DD00706ACC /* CongestionControl.cpp in Sources */, - 69A6DEE91E96149300000E69 /* lpc_to_refl_coef.c in Sources */, - 69A6DEF51E96149300000E69 /* spl_init.c in Sources */, - 69A6DF241E96149300000E69 /* nsx_core_c.c in Sources */, - 69A6DF0F1E96149300000E69 /* aecm_core_c.cc in Sources */, - 69A6DECC1E96149300000E69 /* ring_buffer.c in Sources */, 692AB8EB1E6759DD00706ACC /* OpusDecoder.cpp in Sources */, - 69A6DED81E96149300000E69 /* dot_product_with_scale.c in Sources */, + 691E071821A4FD7700F838EF /* echo_cancellation.cc in Sources */, + 691E077821A4FD7700F838EF /* block_framer.cc in Sources */, + 691E081121A4FD7700F838EF /* platform_thread_types.cc in Sources */, + 691E07E821A4FD7700F838EF /* timeutils.cc in Sources */, + 691E075121A4FD7700F838EF /* echo_remover_metrics.cc in Sources */, + 691E066621A4FD7600F838EF /* fft.c in Sources */, + 691E06F121A4FD7600F838EF /* fixed_gain_controller.cc in Sources */, + 691E077F21A4FD7700F838EF /* subtractor_output.cc in Sources */, 697B6FD62136E1F3004C8E54 /* AudioIO.cpp in Sources */, - 69A6DF331E96149300000E69 /* ooura_fft.cc in Sources */, - 69A6DEF11E96149300000E69 /* resample_by_2.c in Sources */, - 69A6DEEC1E96149300000E69 /* randomization_functions.c in Sources */, - 69A6DEEE1E96149300000E69 /* refl_coef_to_lpc.c in Sources */, + 691E072D21A4FD7700F838EF /* digital_agc.c in Sources */, + 691E064421A4FD7600F838EF /* vad_sp.c in Sources */, + 691E070021A4FD7600F838EF /* noise_spectrum_estimator.cc in Sources */, + 691E06B621A4FD7600F838EF /* audio_buffer.cc in Sources */, + 691E064F21A4FD7600F838EF /* vad_gmm.c in Sources */, + 691E05FB21A4FD7600F838EF /* resampler.cc in Sources */, + 691E069421A4FD7600F838EF /* spectrum_ar_model_tables.c in Sources */, + 691E067821A4FD7600F838EF /* filter_functions.c in Sources */, + 691E06E321A4FD7600F838EF /* spectral_features.cc in Sources */, + 691E063521A4FD7600F838EF /* filter_ar.c in Sources */, + 691E07D421A4FD7700F838EF /* ooura_fft.cc in Sources */, + 691E05FC21A4FD7600F838EF /* sinc_resampler_sse.cc in Sources */, + 691E06C621A4FD7600F838EF /* config.cc in Sources */, C2A87DDF1F4B6A61002D3F73 /* AudioInputAudioUnit.cpp in Sources */, + 691E067E21A4FD7600F838EF /* bandwidth_estimator.c in Sources */, + 691E05DA21A4FD7600F838EF /* throw_delegate.cc in Sources */, + 691E05E821A4FD7600F838EF /* window_generator.cc in Sources */, 69A6DF431E9614B700000E69 /* AudioInputAudioUnitOSX.cpp in Sources */, + 691E06F021A4FD7600F838EF /* fixed_digital_level_estimator.cc in Sources */, + 691E061321A4FD7600F838EF /* fir_filter_c.cc in Sources */, + 691E07F421A4FD7700F838EF /* thread_checker_impl.cc in Sources */, + 691E07D721A4FD7700F838EF /* ooura_fft_sse2.cc in Sources */, + 691E078F21A4FD7700F838EF /* aec3_common.cc in Sources */, + 691E063721A4FD7600F838EF /* resample_fractional.c in Sources */, + 691E073C21A4FD7700F838EF /* file_audio_generator.cc in Sources */, + 691E063621A4FD7600F838EF /* vector_scaling_operations.c in Sources */, + 691E06A121A4FD7600F838EF /* mean_variance_estimator.cc in Sources */, + 691E077B21A4FD7700F838EF /* cascaded_biquad_filter.cc in Sources */, + 691E06A521A4FD7600F838EF /* gain_control_impl.cc in Sources */, + 691E07D621A4FD7700F838EF /* delay_estimator_wrapper.cc in Sources */, + 691E076221A4FD7700F838EF /* fullband_erle_estimator.cc in Sources */, + 691E075621A4FD7700F838EF /* echo_path_variability.cc in Sources */, + 691E063B21A4FD7600F838EF /* randomization_functions.c in Sources */, + 691E07C121A4FD7700F838EF /* pitch_internal.cc in Sources */, + 691E077D21A4FD7700F838EF /* render_buffer.cc in Sources */, + 691E06C921A4FD7600F838EF /* interpolated_gain_curve.cc in Sources */, + 691E071721A4FD7700F838EF /* three_band_filter_bank.cc in Sources */, + 691E061C21A4FD7600F838EF /* dot_product_with_scale.cc in Sources */, + 691E06B721A4FD7600F838EF /* typing_detection.cc in Sources */, + 691E060721A4FD7600F838EF /* spl_sqrt_floor.c in Sources */, + 691E072721A4FD7700F838EF /* loudness_histogram.cc in Sources */, + 691E07DA21A4FD7700F838EF /* ooura_fft_neon.cc in Sources */, + 691E063121A4FD7600F838EF /* resample.c in Sources */, + 691E061B21A4FD7600F838EF /* downsample_fast_neon.c in Sources */, + 691E066E21A4FD7600F838EF /* filterbanks.c in Sources */, C2A87DE01F4B6A61002D3F73 /* AudioOutputAudioUnit.cpp in Sources */, + 691E07E621A4FD7700F838EF /* aligned_malloc.cc in Sources */, + 691E07EA21A4FD7700F838EF /* logging_mac.mm in Sources */, + 691E06EC21A4FD7600F838EF /* vector_float_frame.cc in Sources */, + 691E07A421A4FD7700F838EF /* block_processor2.cc in Sources */, + 691E065821A4FD7600F838EF /* rnn_vad_weights.cc in Sources */, + 691E07A621A4FD7700F838EF /* block_delay_buffer.cc in Sources */, + 691E06EE21A4FD7600F838EF /* noise_level_estimator.cc in Sources */, + 691E072621A4FD7700F838EF /* agc.cc in Sources */, + 691E072321A4FD7700F838EF /* voice_detection_impl.cc in Sources */, + 691E073621A4FD7700F838EF /* audio_processing_impl.cc in Sources */, + 691E081321A4FD7700F838EF /* event.cc in Sources */, + 691E072821A4FD7700F838EF /* agc_manager_direct.cc in Sources */, + 691E06A821A4FD7600F838EF /* nsx_core.c in Sources */, + 691E06CF21A4FD7600F838EF /* adaptive_agc.cc in Sources */, + 691E061021A4FD7600F838EF /* sparse_fir_filter.cc in Sources */, + 691E070921A4FD7700F838EF /* wpd_tree.cc in Sources */, + 691E060021A4FD7600F838EF /* push_resampler.cc in Sources */, + 691E064021A4FD7600F838EF /* resample_48khz.c in Sources */, + 691E062B21A4FD7600F838EF /* division_operations.c in Sources */, + 691E077221A4FD7700F838EF /* skew_estimator.cc in Sources */, + 691E07D821A4FD7700F838EF /* delay_estimator.cc in Sources */, + 691E063921A4FD7600F838EF /* ilbc_specific_functions.c in Sources */, 69A6DF451E9614B700000E69 /* AudioOutputAudioUnitOSX.cpp in Sources */, - 69A6DEFC1E96149300000E69 /* vector_scaling_operations.c in Sources */, + 691E063421A4FD7600F838EF /* refl_coef_to_lpc.c in Sources */, + 691E075221A4FD7700F838EF /* matched_filter_lag_aggregator.cc in Sources */, + 691E071F21A4FD7700F838EF /* aec_core_neon.cc in Sources */, + 691E063A21A4FD7600F838EF /* complex_bit_reverse.c in Sources */, + 691E07B921A4FD7700F838EF /* echo_control_mobile_impl.cc in Sources */, + 691E069321A4FD7600F838EF /* decode_bwe.c in Sources */, + 691E062521A4FD7600F838EF /* lpc_to_refl_coef.c in Sources */, 692AB8E61E6759DD00706ACC /* JitterBuffer.cpp in Sources */, + 691E075F21A4FD7700F838EF /* aec3_fft.cc in Sources */, + 691E07B621A4FD7700F838EF /* reverb_frequency_response.cc in Sources */, + 691E060C21A4FD7600F838EF /* audio_converter.cc in Sources */, + 691E065021A4FD7600F838EF /* audio_frame.cc in Sources */, + 691E07FA21A4FD7700F838EF /* stringencode.cc in Sources */, + 691E076E21A4FD7700F838EF /* aec_state.cc in Sources */, + 691E062C21A4FD7600F838EF /* auto_correlation.c in Sources */, 692AB8CB1E6759DD00706ACC /* AudioInput.cpp in Sources */, + 691E068F21A4FD7600F838EF /* arith_routines.c in Sources */, + 691E072021A4FD7700F838EF /* aec_core_sse2.cc in Sources */, + 691E06B221A4FD7600F838EF /* noise_suppression.c in Sources */, + 691E076A21A4FD7700F838EF /* render_delay_buffer.cc in Sources */, + 691E072E21A4FD7700F838EF /* utility.cc in Sources */, + 691E05F421A4FD7600F838EF /* audio_util.cc in Sources */, 692AB8CD1E6759DD00706ACC /* AudioOutput.cpp in Sources */, + 691E074821A4FD7700F838EF /* aecm_core_neon.cc in Sources */, + 691E065421A4FD7600F838EF /* echo_canceller3_config.cc in Sources */, + 691E06D421A4FD7600F838EF /* spectral_features_internal.cc in Sources */, + 691E06DC21A4FD7600F838EF /* pitch_search_internal.cc in Sources */, + 691E061421A4FD7600F838EF /* ring_buffer.c in Sources */, + 691E07C221A4FD7700F838EF /* vad_circular_buffer.cc in Sources */, C2A87DD81F4B6A33002D3F73 /* Resampler.cpp in Sources */, 697B6FDA2136E2D9004C8E54 /* AudioIOCallback.cpp in Sources */, + 691E079721A4FD7700F838EF /* reverb_decay_estimator.cc in Sources */, + 691E060321A4FD7600F838EF /* sinusoidal_linear_chirp_source.cc in Sources */, + 691E07B421A4FD7700F838EF /* filter_analyzer.cc in Sources */, 69EBC7942136D277003CFE90 /* DarwinSpecific.mm in Sources */, - 69A6DEFA1E96149300000E69 /* splitting_filter_impl.c in Sources */, - 69A6DEE01E96149300000E69 /* get_hanning_window.c in Sources */, - 69A6DF161E96149300000E69 /* digital_agc.c in Sources */, - 69A6DF061E96149300000E69 /* aec_core_neon.cc in Sources */, - 69A6DF201E96149300000E69 /* ns_core.c in Sources */, - 69A6DF091E96149300000E69 /* aec_resampler.cc in Sources */, 692AB8D11E6759DD00706ACC /* Buffers.cpp in Sources */, + 691E067A21A4FD7600F838EF /* lattice.c in Sources */, + 691E064521A4FD7600F838EF /* vad.cc in Sources */, + 691E05EA21A4FD7600F838EF /* fir_filter_factory.cc in Sources */, + 691E063F21A4FD7600F838EF /* get_hanning_window.c in Sources */, + 691E07AF21A4FD7700F838EF /* comfort_noise_generator.cc in Sources */, 692AB8E91E6759DD00706ACC /* MediaStreamItf.cpp in Sources */, - 69A6DF2C1E96149300000E69 /* block_mean_calculator.cc in Sources */, - 69A6DEBC1E96149300000E69 /* checks.cc in Sources */, 692AB8DA1E6759DD00706ACC /* EchoCanceller.cpp in Sources */, - 69A6DF281E96149300000E69 /* splitting_filter.cc in Sources */, + 691E07BE21A4FD7700F838EF /* voice_activity_detector.cc in Sources */, + 691E05F221A4FD7600F838EF /* real_fourier_ooura.cc in Sources */, + 691E077521A4FD7700F838EF /* echo_path_delay_estimator.cc in Sources */, + 691E068221A4FD7600F838EF /* lpc_analysis.c in Sources */, + 691E077921A4FD7700F838EF /* erle_estimator.cc in Sources */, + 691E074721A4FD7700F838EF /* aecm_core_c.cc in Sources */, + 691E074E21A4FD7700F838EF /* reverb_model_fallback.cc in Sources */, + 691E07B321A4FD7700F838EF /* shadow_filter_update_gain.cc in Sources */, + 691E06FF21A4FD7600F838EF /* signal_classifier.cc in Sources */, + 691E070721A4FD7700F838EF /* moving_moments.cc in Sources */, + 691E073D21A4FD7700F838EF /* gain_controller2.cc in Sources */, + 691E067B21A4FD7600F838EF /* intialize.c in Sources */, + 691E06C021A4FD7600F838EF /* audio_generator_factory.cc in Sources */, + 691E07B721A4FD7700F838EF /* decimator.cc in Sources */, + 691E06B121A4FD7600F838EF /* nsx_core_neon.c in Sources */, + 691E06D721A4FD7600F838EF /* rnn.cc in Sources */, + 691E068A21A4FD7600F838EF /* isac_vad.c in Sources */, + 691E06C521A4FD7600F838EF /* audio_processing.cc in Sources */, + 691E060A21A4FD7600F838EF /* fft4g.c in Sources */, + 691E061221A4FD7600F838EF /* smoothing_filter.cc in Sources */, + 694DE8A1219F2265009C09A7 /* VideoRenderer.cpp in Sources */, + 691E063D21A4FD7600F838EF /* copy_set_operations.c in Sources */, + 691E069121A4FD7600F838EF /* lpc_shape_swb12_tables.c in Sources */, + 691E078821A4FD7700F838EF /* block_processor_metrics.cc in Sources */, + 691E07A021A4FD7700F838EF /* matrix_buffer.cc in Sources */, + 691E07FC21A4FD7700F838EF /* checks.cc in Sources */, + 691E066321A4FD7600F838EF /* metrics.cc in Sources */, + 691E061721A4FD7600F838EF /* complex_fft.c in Sources */, + 691E076921A4FD7700F838EF /* render_delay_controller_metrics.cc in Sources */, 692AB8D31E6759DD00706ACC /* VoIPGroupController.cpp in Sources */, + 691E062221A4FD7600F838EF /* downsample_fast.c in Sources */, + 691E064C21A4FD7600F838EF /* vad_core.c in Sources */, + 691E063821A4FD7600F838EF /* real_fft.c in Sources */, + 691E066C21A4FD7600F838EF /* arith_routines_logist.c in Sources */, + 691E060221A4FD7600F838EF /* sinc_resampler.cc in Sources */, + 69A2076521AF628A003AC4F9 /* json11.cpp in Sources */, + 691E076821A4FD7700F838EF /* subband_erle_estimator.cc in Sources */, + 691E07A521A4FD7700F838EF /* echo_canceller3.cc in Sources */, + 691E070621A4FD7700F838EF /* adaptive_mode_level_estimator.cc in Sources */, + 691E076F21A4FD7700F838EF /* adaptive_fir_filter.cc in Sources */, + 691E05C921A4FD7600F838EF /* memutil.cc in Sources */, + 691E079B21A4FD7700F838EF /* main_filter_update_gain.cc in Sources */, 692AB8CF1E6759DD00706ACC /* BlockingQueue.cpp in Sources */, - 69A6DF2E1E96149300000E69 /* delay_estimator.cc in Sources */, - 69A6DEF01E96149300000E69 /* resample_48khz.c in Sources */, - 69A6DECF1E96149300000E69 /* auto_correlation.c in Sources */, - 69A6DF121E96149300000E69 /* echo_control_mobile.cc in Sources */, + 691E077121A4FD7700F838EF /* render_delay_controller.cc in Sources */, + 691E06E921A4FD7600F838EF /* lp_residual.cc in Sources */, 690725BE1EBBD5DE005D860B /* NetworkSocketPosix.cpp in Sources */, - 69A6DF1C1E96149300000E69 /* noise_suppression.c in Sources */, - 69A6DED41E96149300000E69 /* copy_set_operations.c in Sources */, - 69A6DEC31E96149300000E69 /* stringutils.cc in Sources */, - 69A6DF1E1E96149300000E69 /* noise_suppression_x.c in Sources */, - 69A6DED01E96149300000E69 /* complex_bit_reverse.c in Sources */, - 69A6DEDF1E96149300000E69 /* filter_ma_fast_q12.c in Sources */, - 69A6DEFF1E96149300000E69 /* wav_file.cc in Sources */, - 69A6DF351E96149300000E69 /* ooura_fft_neon.cc in Sources */, - 69A6DECE1E96149300000E69 /* auto_corr_to_refl_coef.c in Sources */, - 69A6DEFD1E96149300000E69 /* sparse_fir_filter.cc in Sources */, - 69A6DED91E96149300000E69 /* downsample_fast.c in Sources */, - 69A6DF251E96149300000E69 /* nsx_core_neon.c in Sources */, - 69A6DF081E96149300000E69 /* aec_core_sse2.cc in Sources */, - 69A6DEEA1E96149300000E69 /* min_max_operations.c in Sources */, + 691E06BF21A4FD7600F838EF /* audio_processing_statistics.cc in Sources */, 6971220F20C8107F00971C2C /* PacketReassembler.cpp in Sources */, - 69A6DF361E96149300000E69 /* ooura_fft_sse2.cc in Sources */, - 69A6DED51E96149300000E69 /* cross_correlation.c in Sources */, - 69A6DF3D1E96149300000E69 /* cpu_features.cc in Sources */, - 69A6DF2A1E96149300000E69 /* three_band_filter_bank.cc in Sources */, - 69A6DED21E96149300000E69 /* complex_fft.c in Sources */, - 69A6DF311E96149300000E69 /* delay_estimator_wrapper.cc in Sources */, - 69A6DEDA1E96149300000E69 /* downsample_fast_neon.c in Sources */, - 69A6DEC91E96149300000E69 /* fft4g.c in Sources */, + 691E065B21A4FD7600F838EF /* kiss_fft.cc in Sources */, + 691E06CD21A4FD7600F838EF /* gain_applier.cc in Sources */, + 691E05F621A4FD7600F838EF /* fir_filter_sse.cc in Sources */, + 691E063321A4FD7600F838EF /* min_max_operations.c in Sources */, + 691E071A21A4FD7700F838EF /* aec_resampler.cc in Sources */, + 691E06A021A4FD7600F838EF /* circular_buffer.cc in Sources */, + 691E06AD21A4FD7600F838EF /* ns_core.c in Sources */, + 691E078B21A4FD7700F838EF /* moving_average.cc in Sources */, + 691E069A21A4FD7600F838EF /* rms_level.cc in Sources */, + 691E078E21A4FD7700F838EF /* reverb_model_estimator.cc in Sources */, + 691E070121A4FD7600F838EF /* compute_interpolated_gain_curve.cc in Sources */, 692AB8ED1E6759DD00706ACC /* OpusEncoder.cpp in Sources */, + 691E06E721A4FD7600F838EF /* features_extraction.cc in Sources */, + 691E061A21A4FD7600F838EF /* levinson_durbin.c in Sources */, + 691E066921A4FD7600F838EF /* pitch_estimator.c in Sources */, + 691E05CC21A4FD7600F838EF /* ascii.cc in Sources */, + 691E079321A4FD7700F838EF /* matched_filter.cc in Sources */, + 691E067221A4FD7600F838EF /* transform.c in Sources */, + 691E069F21A4FD7600F838EF /* moving_max.cc in Sources */, + 691E063221A4FD7600F838EF /* cross_correlation_neon.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1300,7 +2875,7 @@ /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 697B6FCC2136DBA4004C8E54 /* Debug Hockeyapp */ = { + 697B6FCC2136DBA4004C8E54 /* DebugHockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1375,7 +2950,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; - name = "Debug Hockeyapp"; + name = DebugHockeyapp; }; 697B6FCD2136DBA4004C8E54 /* Debug Auto Test */ = { isa = XCBuildConfiguration; @@ -1454,7 +3029,7 @@ }; name = "Debug Auto Test"; }; - 697B6FCE2136DBA4004C8E54 /* Debug AppStore */ = { + 697B6FCE2136DBA4004C8E54 /* DebugAppStore */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1529,9 +3104,9 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; - name = "Debug AppStore"; + name = DebugAppStore; }; - 697B6FCF2136DBA4004C8E54 /* Release Hockeyapp */ = { + 697B6FCF2136DBA4004C8E54 /* ReleaseHockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1599,9 +3174,9 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; - name = "Release Hockeyapp"; + name = ReleaseHockeyapp; }; - 697B6FD02136DBA4004C8E54 /* Release AppStore */ = { + 697B6FD02136DBA4004C8E54 /* ReleaseAppStore */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1669,7 +3244,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; - name = "Release AppStore"; + name = ReleaseAppStore; }; 69EBC7982136D55A003CFE90 /* Debug Auto Test */ = { isa = XCBuildConfiguration; @@ -1751,6 +3326,7 @@ "-DTGVOIP_USE_DESKTOP_DSP", "-DWEBRTC_MAC", "-DTGVOIP_USE_CALLBACK_AUDIO_IO", + "-DWEBRTC_NS_FLOAT", ); PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1759,7 +3335,7 @@ }; name = "Debug Auto Test"; }; - 69F8423C1E67540700C110F7 /* Debug Hockeyapp */ = { + 69F8423C1E67540700C110F7 /* DebugHockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1808,9 +3384,9 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = "Debug Hockeyapp"; + name = DebugHockeyapp; }; - 69F8423D1E67540700C110F7 /* Release Hockeyapp */ = { + 69F8423D1E67540700C110F7 /* ReleaseHockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1853,9 +3429,9 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = "Release Hockeyapp"; + name = ReleaseHockeyapp; }; - 69F8423F1E67540700C110F7 /* Debug Hockeyapp */ = { + 69F8423F1E67540700C110F7 /* DebugHockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; @@ -1886,15 +3462,16 @@ "-DWEBRTC_APM_DEBUG_DUMP=0", "-DTGVOIP_USE_DESKTOP_DSP", "-DWEBRTC_MAC", + "-DWEBRTC_NS_FLOAT", ); PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SKIP_INSTALL = YES; }; - name = "Debug Hockeyapp"; + name = DebugHockeyapp; }; - 69F842401E67540700C110F7 /* Release Hockeyapp */ = { + 69F842401E67540700C110F7 /* ReleaseHockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; @@ -1925,15 +3502,16 @@ "-DWEBRTC_APM_DEBUG_DUMP=0", "-DTGVOIP_USE_DESKTOP_DSP", "-DWEBRTC_MAC", + "-DWEBRTC_NS_FLOAT", ); PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SKIP_INSTALL = YES; }; - name = "Release Hockeyapp"; + name = ReleaseHockeyapp; }; - D04D01C31E678C0D0086DDC0 /* Debug AppStore */ = { + D04D01C31E678C0D0086DDC0 /* DebugAppStore */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1982,9 +3560,9 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = "Debug AppStore"; + name = DebugAppStore; }; - D04D01C41E678C0D0086DDC0 /* Debug AppStore */ = { + D04D01C41E678C0D0086DDC0 /* DebugAppStore */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; @@ -2015,15 +3593,16 @@ "-DWEBRTC_APM_DEBUG_DUMP=0", "-DTGVOIP_USE_DESKTOP_DSP", "-DWEBRTC_MAC", + "-DWEBRTC_NS_FLOAT", ); PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SKIP_INSTALL = YES; }; - name = "Debug AppStore"; + name = DebugAppStore; }; - D04D01CB1E678C230086DDC0 /* Release AppStore */ = { + D04D01CB1E678C230086DDC0 /* ReleaseAppStore */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -2066,9 +3645,9 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = "Release AppStore"; + name = ReleaseAppStore; }; - D04D01CC1E678C230086DDC0 /* Release AppStore */ = { + D04D01CC1E678C230086DDC0 /* ReleaseAppStore */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; @@ -2099,13 +3678,14 @@ "-DWEBRTC_APM_DEBUG_DUMP=0", "-DTGVOIP_USE_DESKTOP_DSP", "-DWEBRTC_MAC", + "-DWEBRTC_NS_FLOAT", ); PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SKIP_INSTALL = YES; }; - name = "Release AppStore"; + name = ReleaseAppStore; }; /* End XCBuildConfiguration section */ @@ -2113,38 +3693,38 @@ 697B6FD12136DBA4004C8E54 /* Build configuration list for PBXNativeTarget "libtgvoipTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 697B6FCC2136DBA4004C8E54 /* Debug Hockeyapp */, + 697B6FCC2136DBA4004C8E54 /* DebugHockeyapp */, 697B6FCD2136DBA4004C8E54 /* Debug Auto Test */, - 697B6FCE2136DBA4004C8E54 /* Debug AppStore */, - 697B6FCF2136DBA4004C8E54 /* Release Hockeyapp */, - 697B6FD02136DBA4004C8E54 /* Release AppStore */, + 697B6FCE2136DBA4004C8E54 /* DebugAppStore */, + 697B6FCF2136DBA4004C8E54 /* ReleaseHockeyapp */, + 697B6FD02136DBA4004C8E54 /* ReleaseAppStore */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = "Release Hockeyapp"; + defaultConfigurationName = ReleaseHockeyapp; }; 69F842301E67540700C110F7 /* Build configuration list for PBXProject "libtgvoip_osx" */ = { isa = XCConfigurationList; buildConfigurations = ( - 69F8423C1E67540700C110F7 /* Debug Hockeyapp */, + 69F8423C1E67540700C110F7 /* DebugHockeyapp */, 69EBC7982136D55A003CFE90 /* Debug Auto Test */, - D04D01C31E678C0D0086DDC0 /* Debug AppStore */, - 69F8423D1E67540700C110F7 /* Release Hockeyapp */, - D04D01CB1E678C230086DDC0 /* Release AppStore */, + D04D01C31E678C0D0086DDC0 /* DebugAppStore */, + 69F8423D1E67540700C110F7 /* ReleaseHockeyapp */, + D04D01CB1E678C230086DDC0 /* ReleaseAppStore */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = "Release Hockeyapp"; + defaultConfigurationName = ReleaseHockeyapp; }; 69F8423E1E67540700C110F7 /* Build configuration list for PBXNativeTarget "libtgvoip" */ = { isa = XCConfigurationList; buildConfigurations = ( - 69F8423F1E67540700C110F7 /* Debug Hockeyapp */, + 69F8423F1E67540700C110F7 /* DebugHockeyapp */, 69EBC7992136D55A003CFE90 /* Debug Auto Test */, - D04D01C41E678C0D0086DDC0 /* Debug AppStore */, - 69F842401E67540700C110F7 /* Release Hockeyapp */, - D04D01CC1E678C230086DDC0 /* Release AppStore */, + D04D01C41E678C0D0086DDC0 /* DebugAppStore */, + 69F842401E67540700C110F7 /* ReleaseHockeyapp */, + D04D01CC1E678C230086DDC0 /* ReleaseAppStore */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = "Release Hockeyapp"; + defaultConfigurationName = ReleaseHockeyapp; }; /* End XCConfigurationList section */ }; diff --git a/libtgvoip/ltmain.sh b/libtgvoip/ltmain.sh index 0f0a2da..d3ab94d 100644 --- a/libtgvoip/ltmain.sh +++ b/libtgvoip/ltmain.sh @@ -1,12 +1,12 @@ #! /bin/sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in -## by inline-source v2014-01-03.01 +## by inline-source v2018-07-24.06 -# libtool (GNU libtool) 2.4.6 +# libtool (GNU libtool) 2.4.6.42-b88ce # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 -# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# Copyright (C) 1996-2018 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. @@ -31,8 +31,8 @@ PROGRAM=libtool PACKAGE=libtool -VERSION=2.4.6 -package_revision=2.4.6 +VERSION=2.4.6.42-b88ce +package_revision=2.4.6.42 ## ------ ## @@ -64,34 +64,25 @@ package_revision=2.4.6 # libraries, which are installed to $pkgauxdir. # Set a version string for this script. -scriptversion=2015-01-20.17; # UTC +scriptversion=2018-07-24.06; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 -# Copyright (C) 2004-2015 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. - -# As a special exception to the GNU General Public License, if you distribute -# this file as part of a program or library that is built using GNU Libtool, -# you may include this file under the same distribution terms that you use -# for the rest of that program. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# This is free software. There is NO warranty; not even for +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Copyright (C) 2004-2018 Bootstrap Authors +# +# This file is dual licensed under the terms of the MIT license +# , and GPL version 3 or later +# . You must apply one of +# these licenses when using or redistributing this software or any of +# the files within it. See the URLs above, or the file `LICENSE` +# included in the Bootstrap distribution for the full license texts. -# Please report bugs or propose patches to gary@gnu.org. +# Please report bugs or propose patches to: +# ## ------ ## @@ -140,9 +131,6 @@ do fi" done -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - # Make sure IFS has a sensible default sp=' ' nl=' @@ -159,6 +147,26 @@ if test "${PATH_SEPARATOR+set}" != set; then fi +# func_unset VAR +# -------------- +# Portably unset VAR. +# In some shells, an 'unset VAR' statement leaves a non-zero return +# status if VAR is already unset, which might be problematic if the +# statement is used at the end of a function (thus poisoning its return +# value) or when 'set -e' is active (causing even a spurious abort of +# the script in this case). +func_unset () +{ + { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } +} + + +# Make sure CDPATH doesn't cause `cd` commands to output the target dir. +func_unset CDPATH + +# Make sure ${,E,F}GREP behave sanely. +func_unset GREP_OPTIONS + ## ------------------------- ## ## Locate command utilities. ## @@ -259,7 +267,7 @@ test -z "$SED" && { rm -f conftest.in conftest.tmp conftest.nl conftest.out } - func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" rm -f conftest.sed SED=$func_path_progs_result } @@ -295,7 +303,7 @@ test -z "$GREP" && { rm -f conftest.in conftest.tmp conftest.nl conftest.out } - func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" GREP=$func_path_progs_result } @@ -580,16 +588,16 @@ if test yes = "$_G_HAVE_PLUSEQ_OP"; then { $debug_cmd - func_quote_for_eval "$2" - eval "$1+=\\ \$func_quote_for_eval_result" + func_quote_arg pretty "$2" + eval "$1+=\\ \$func_quote_arg_result" }' else func_append_quoted () { $debug_cmd - func_quote_for_eval "$2" - eval "$1=\$$1\\ \$func_quote_for_eval_result" + func_quote_arg pretty "$2" + eval "$1=\$$1\\ \$func_quote_arg_result" } fi @@ -1091,85 +1099,199 @@ func_relative_path () } -# func_quote_for_eval ARG... -# -------------------------- -# Aesthetically quote ARGs to be evaled later. -# This function returns two values: -# i) func_quote_for_eval_result -# double-quoted, suitable for a subsequent eval -# ii) func_quote_for_eval_unquoted_result -# has all characters that are still active within double -# quotes backslashified. -func_quote_for_eval () +# func_quote_portable EVAL ARG +# ---------------------------- +# Internal function to portably implement func_quote_arg. Note that we still +# keep attention to performance here so we as much as possible try to avoid +# calling sed binary (so far O(N) complexity as long as func_append is O(1)). +func_quote_portable () { $debug_cmd - func_quote_for_eval_unquoted_result= - func_quote_for_eval_result= - while test 0 -lt $#; do - case $1 in - *[\\\`\"\$]*) - _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; - *) - _G_unquoted_arg=$1 ;; - esac - if test -n "$func_quote_for_eval_unquoted_result"; then - func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" - else - func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + func_quote_portable_result=$2 + + # one-time-loop (easy break) + while true + do + if $1; then + func_quote_portable_result=`$ECHO "$2" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` + break fi - case $_G_unquoted_arg in - # Double-quote args containing shell metacharacters to delay - # word splitting, command substitution and variable expansion - # for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - _G_quoted_arg=\"$_G_unquoted_arg\" + # Quote for eval. + case $func_quote_portable_result in + *[\\\`\"\$]*) + case $func_quote_portable_result in + *[\[\*\?]*) + func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ + | $SED "$sed_quote_subst"` + break + ;; + esac + + func_quote_portable_old_IFS=$IFS + for _G_char in '\' '`' '"' '$' + do + # STATE($1) PREV($2) SEPARATOR($3) + set start "" "" + func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy + IFS=$_G_char + for _G_part in $func_quote_portable_result + do + case $1 in + quote) + func_append func_quote_portable_result "$3$2" + set quote "$_G_part" "\\$_G_char" + ;; + start) + set first "" "" + func_quote_portable_result= + ;; + first) + set quote "$_G_part" "" + ;; + esac + done + done + IFS=$func_quote_portable_old_IFS ;; - *) - _G_quoted_arg=$_G_unquoted_arg - ;; + *) ;; esac - - if test -n "$func_quote_for_eval_result"; then - func_append func_quote_for_eval_result " $_G_quoted_arg" - else - func_append func_quote_for_eval_result "$_G_quoted_arg" - fi - shift + break done + + func_quote_portable_unquoted_result=$func_quote_portable_result + case $func_quote_portable_result in + # double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # many bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_portable_result=\"$func_quote_portable_result\" + ;; + esac } -# func_quote_for_expand ARG -# ------------------------- -# Aesthetically quote ARG to be evaled later; same as above, -# but do not quote variable references. -func_quote_for_expand () -{ - $debug_cmd +# func_quotefast_eval ARG +# ----------------------- +# Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', +# but optimized for speed. Result is stored in $func_quotefast_eval. +if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then + printf -v _GL_test_printf_tilde %q '~' + if test '\~' = "$_GL_test_printf_tilde"; then + func_quotefast_eval () + { + printf -v func_quotefast_eval_result %q "$1" + } + else + # Broken older Bash implementations. Make those faster too if possible. + func_quotefast_eval () + { + case $1 in + '~'*) + func_quote_portable false "$1" + func_quotefast_eval_result=$func_quote_portable_result + ;; + *) + printf -v func_quotefast_eval_result %q "$1" + ;; + esac + } + fi +else + func_quotefast_eval () + { + func_quote_portable false "$1" + func_quotefast_eval_result=$func_quote_portable_result + } +fi - case $1 in - *[\\\`\"]*) - _G_arg=`$ECHO "$1" | $SED \ - -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; - *) - _G_arg=$1 ;; + +# func_quote_arg MODEs ARG +# ------------------------ +# Quote one ARG to be evaled later. MODEs argument may contain zero or more +# specifiers listed below separated by ',' character. This function returns two +# values: +# i) func_quote_arg_result +# double-quoted (when needed), suitable for a subsequent eval +# ii) func_quote_arg_unquoted_result +# has all characters that are still active within double +# quotes backslashified. Available only if 'unquoted' is specified. +# +# Available modes: +# ---------------- +# 'eval' (default) +# - escape shell special characters +# 'expand' +# - the same as 'eval'; but do not quote variable references +# 'pretty' +# - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might +# be used later in func_quote to get output like: 'echo "a b"' instead +# of 'echo a\ b'. This is slower than default on some shells. +# 'unquoted' +# - produce also $func_quote_arg_unquoted_result which does not contain +# wrapping double-quotes. +# +# Examples for 'func_quote_arg pretty,unquoted string': +# +# string | *_result | *_unquoted_result +# ------------+-----------------------+------------------- +# " | \" | \" +# a b | "a b" | a b +# "a b" | "\"a b\"" | \"a b\" +# * | "*" | * +# z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\" +# +# Examples for 'func_quote_arg pretty,unquoted,expand string': +# +# string | *_result | *_unquoted_result +# --------------+---------------------+-------------------- +# z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\" +func_quote_arg () +{ + _G_quote_expand=false + case ,$1, in + *,expand,*) + _G_quote_expand=: + ;; esac - case $_G_arg in - # Double-quote args containing shell metacharacters to delay - # word splitting and command substitution for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - _G_arg=\"$_G_arg\" + case ,$1, in + *,pretty,*|*,expand,*|*,unquoted,*) + func_quote_portable $_G_quote_expand "$2" + func_quote_arg_result=$func_quote_portable_result + func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result + ;; + *) + # Faster quote-for-eval for some shells. + func_quotefast_eval "$2" + func_quote_arg_result=$func_quotefast_eval_result ;; esac +} - func_quote_for_expand_result=$_G_arg + +# func_quote MODEs ARGs... +# ------------------------ +# Quote all ARGs to be evaled later and join them into single command. See +# func_quote_arg's description for more info. +func_quote () +{ + $debug_cmd + _G_func_quote_mode=$1 ; shift + func_quote_result= + while test 0 -lt $#; do + func_quote_arg "$_G_func_quote_mode" "$1" + if test -n "$func_quote_result"; then + func_append func_quote_result " $func_quote_arg_result" + else + func_append func_quote_result "$func_quote_arg_result" + fi + shift + done } @@ -1215,8 +1337,8 @@ func_show_eval () _G_cmd=$1 _G_fail_exp=${2-':'} - func_quote_for_expand "$_G_cmd" - eval "func_notquiet $func_quote_for_expand_result" + func_quote_arg pretty,expand "$_G_cmd" + eval "func_notquiet $func_quote_arg_result" $opt_dry_run || { eval "$_G_cmd" @@ -1241,8 +1363,8 @@ func_show_eval_locale () _G_fail_exp=${2-':'} $opt_quiet || { - func_quote_for_expand "$_G_cmd" - eval "func_echo $func_quote_for_expand_result" + func_quote_arg expand,pretty "$_G_cmd" + eval "func_echo $func_quote_arg_result" } $opt_dry_run || { @@ -1369,30 +1491,26 @@ func_lt_ver () # End: #! /bin/sh -# Set a version string for this script. -scriptversion=2014-01-07.03; # UTC - # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 -# Copyright (C) 2010-2015 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# This is free software. There is NO warranty; not even for +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Copyright (C) 2010-2018 Bootstrap Authors +# +# This file is dual licensed under the terms of the MIT license +# , and GPL version 3 or later +# . You must apply one of +# these licenses when using or redistributing this software or any of +# the files within it. See the URLs above, or the file `LICENSE` +# included in the Bootstrap distribution for the full license texts. -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# Please report bugs or propose patches to: +# -# Please report bugs or propose patches to gary@gnu.org. +# Set a version string for this script. +scriptversion=2018-07-24.06; # UTC ## ------ ## @@ -1415,7 +1533,7 @@ scriptversion=2014-01-07.03; # UTC # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file -# starting with '# Written by ' and ending with '# warranty; '. +# starting with '# Written by ' and ending with '# Copyright'. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the @@ -1427,7 +1545,7 @@ scriptversion=2014-01-07.03; # UTC # to display verbose messages only when your user has specified # '--verbose'. # -# After sourcing this file, you can plug processing for additional +# After sourcing this file, you can plug in processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. @@ -1476,8 +1594,8 @@ fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## # This section contains functions for adding, removing, and running hooks -# to the main code. A hook is just a named list of of function, that can -# be run in order later on. +# in the main code. A hook is just a list of function names that can be +# run in order later on. # func_hookable FUNC_NAME # ----------------------- @@ -1510,7 +1628,8 @@ func_add_hook () # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ -# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +# Remove HOOK_FUNC from the list of hook functions to be called by +# FUNC_NAME. func_remove_hook () { $debug_cmd @@ -1519,10 +1638,28 @@ func_remove_hook () } +# func_propagate_result FUNC_NAME_A FUNC_NAME_B +# --------------------------------------------- +# If the *_result variable of FUNC_NAME_A _is set_, assign its value to +# *_result variable of FUNC_NAME_B. +func_propagate_result () +{ + $debug_cmd + + func_propagate_result_result=: + if eval "test \"\${${1}_result+set}\" = set" + then + eval "${2}_result=\$${1}_result" + else + func_propagate_result_result=false + fi +} + + # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. -# It is assumed that the list of hook functions contains nothing more +# It's assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. @@ -1532,22 +1669,19 @@ func_run_hooks () case " $hookable_fns " in *" $1 "*) ;; - *) func_fatal_error "'$1' does not support hook funcions.n" ;; + *) func_fatal_error "'$1' does not support hook functions." ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do - eval $_G_hook '"$@"' - - # store returned options list back into positional - # parameters for next 'cmd' execution. - eval _G_hook_result=\$${_G_hook}_result - eval set dummy "$_G_hook_result"; shift + func_unset "${_G_hook}_result" + eval $_G_hook '${1+"$@"}' + func_propagate_result $_G_hook func_run_hooks + if $func_propagate_result_result; then + eval set dummy "$func_run_hooks_result"; shift + fi done - - func_quote_for_eval ${1+"$@"} - func_run_hooks_result=$func_quote_for_eval_result } @@ -1557,10 +1691,18 @@ func_run_hooks () ## --------------- ## # In order to add your own option parsing hooks, you must accept the -# full positional parameter list in your hook function, remove any -# options that you action, and then pass back the remaining unprocessed -# options in '_result', escaped suitably for -# 'eval'. Like this: +# full positional parameter list from your hook function. You may remove +# or edit any options that you action, and then pass back the remaining +# unprocessed options in '_result', escaped +# suitably for 'eval'. +# +# The '_result' variable is automatically unset +# before your hook gets called; for best performance, only set the +# *_result variable when necessary (i.e. don't call the 'func_quote' +# function unnecessarily because it can be an expensive operation on some +# machines). +# +# Like this: # # my_options_prep () # { @@ -1570,9 +1712,8 @@ func_run_hooks () # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' -# -# func_quote_for_eval ${1+"$@"} -# my_options_prep_result=$func_quote_for_eval_result +# # No change in '$@' (ignored completely by this hook). Leave +# # my_options_prep_result variable intact. # } # func_add_hook func_options_prep my_options_prep # @@ -1581,25 +1722,36 @@ func_run_hooks () # { # $debug_cmd # -# # Note that for efficiency, we parse as many options as we can +# args_changed=false +# +# # Note that, for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in -# --silent|-s) opt_silent=: ;; +# --silent|-s) opt_silent=: +# args_changed=: +# ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift +# args_changed=: # ;; -# *) set dummy "$_G_opt" "$*"; shift; break ;; +# *) # Make sure the first unrecognised option "$_G_opt" +# # is added back to "$@" in case we need it later, +# # if $args_changed was set to 'true'. +# set dummy "$_G_opt" ${1+"$@"}; shift; break ;; # esac # done # -# func_quote_for_eval ${1+"$@"} -# my_silent_option_result=$func_quote_for_eval_result +# # Only call 'func_quote' here if we processed at least one argument. +# if $args_changed; then +# func_quote eval ${1+"$@"} +# my_silent_option_result=$func_quote_result +# fi # } # func_add_hook func_parse_options my_silent_option # @@ -1610,17 +1762,26 @@ func_run_hooks () # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." -# -# func_quote_for_eval ${1+"$@"} -# my_option_validation_result=$func_quote_for_eval_result # } # func_add_hook func_validate_options my_option_validation # -# You'll alse need to manually amend $usage_message to reflect the extra +# You'll also need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. +# func_options_finish [ARG]... +# ---------------------------- +# Finishing the option parse loop (call 'func_options' hooks ATM). +func_options_finish () +{ + $debug_cmd + + func_run_hooks func_options ${1+"$@"} + func_propagate_result func_run_hooks func_options_finish +} + + # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the @@ -1630,17 +1791,27 @@ func_options () { $debug_cmd - func_options_prep ${1+"$@"} - eval func_parse_options \ - ${func_options_prep_result+"$func_options_prep_result"} - eval func_validate_options \ - ${func_parse_options_result+"$func_parse_options_result"} + _G_options_quoted=false - eval func_run_hooks func_options \ - ${func_validate_options_result+"$func_validate_options_result"} + for my_func in options_prep parse_options validate_options options_finish + do + func_unset func_${my_func}_result + func_unset func_run_hooks_result + eval func_$my_func '${1+"$@"}' + func_propagate_result func_$my_func func_options + if $func_propagate_result_result; then + eval set dummy "$func_options_result"; shift + _G_options_quoted=: + fi + done - # save modified positional parameters for caller - func_options_result=$func_run_hooks_result + $_G_options_quoted || { + # As we (func_options) are top-level options-parser function and + # nobody quoted "$@" for us yet, we need to do it explicitly for + # caller. + func_quote eval ${1+"$@"} + func_options_result=$func_quote_result + } } @@ -1649,9 +1820,8 @@ func_options () # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and -# needs to propogate that back to rest of this script, then the complete -# modified list must be put in 'func_run_hooks_result' before -# returning. +# needs to propagate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before returning. func_hookable func_options_prep func_options_prep () { @@ -1662,9 +1832,7 @@ func_options_prep () opt_warning_types= func_run_hooks func_options_prep ${1+"$@"} - - # save modified positional parameters for caller - func_options_prep_result=$func_run_hooks_result + func_propagate_result func_run_hooks func_options_prep } @@ -1676,25 +1844,32 @@ func_parse_options () { $debug_cmd - func_parse_options_result= - + _G_parse_options_requote=false # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. func_run_hooks func_parse_options ${1+"$@"} - - # Adjust func_parse_options positional parameters to match - eval set dummy "$func_run_hooks_result"; shift + func_propagate_result func_run_hooks func_parse_options + if $func_propagate_result_result; then + eval set dummy "$func_parse_options_result"; shift + # Even though we may have changed "$@", we passed the "$@" array + # down into the hook and it quoted it for us (because we are in + # this if-branch). No need to quote it again. + _G_parse_options_requote=false + fi # Break out of the loop if we already parsed every option. test $# -gt 0 || break + # We expect that one of the options parsed in this function matches + # and thus we remove _G_opt from "$@" and need to re-quote. + _G_match_parse_options=: _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' - func_echo "enabling shell trace mode" + func_echo "enabling shell trace mode" >&2 $debug_cmd ;; @@ -1704,7 +1879,10 @@ func_parse_options () ;; --warnings|--warning|-W) - test $# = 0 && func_missing_arg $_G_opt && break + if test $# = 0 && func_missing_arg $_G_opt; then + _G_parse_options_requote=: + break + fi case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above @@ -1757,15 +1935,24 @@ func_parse_options () shift ;; - --) break ;; + --) _G_parse_options_requote=: ; break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; - *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift + _G_match_parse_options=false + break + ;; esac + + if $_G_match_parse_options; then + _G_parse_options_requote=: + fi done - # save modified positional parameters for caller - func_quote_for_eval ${1+"$@"} - func_parse_options_result=$func_quote_for_eval_result + if $_G_parse_options_requote; then + # save modified positional parameters for caller + func_quote eval ${1+"$@"} + func_parse_options_result=$func_quote_result + fi } @@ -1782,12 +1969,10 @@ func_validate_options () test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" func_run_hooks func_validate_options ${1+"$@"} + func_propagate_result func_run_hooks func_validate_options # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE - - # save modified positional parameters for caller - func_validate_options_result=$func_run_hooks_result } @@ -1843,8 +2028,8 @@ func_missing_arg () # func_split_equals STRING # ------------------------ -# Set func_split_equals_lhs and func_split_equals_rhs shell variables after -# splitting STRING at the '=' sign. +# Set func_split_equals_lhs and func_split_equals_rhs shell variables +# after splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ @@ -1859,8 +2044,9 @@ then func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} - test "x$func_split_equals_lhs" = "x$1" \ - && func_split_equals_rhs= + if test "x$func_split_equals_lhs" = "x$1"; then + func_split_equals_rhs= + fi }' else # ...otherwise fall back to using expr, which is often a shell builtin. @@ -1938,31 +2124,44 @@ func_usage_message () # func_version # ------------ # Echo version message to standard output and exit. +# The version message is extracted from the calling file's header +# comments, with leading '# ' stripped: +# 1. First display the progname and version +# 2. Followed by the header comment line matching /^# Written by / +# 3. Then a blank line followed by the first following line matching +# /^# Copyright / +# 4. Immediately followed by any lines between the previous matches, +# except lines preceding the intervening completely blank line. +# For example, see the header comments of this file. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' - /(C)/!b go - :more - /\./!{ - N - s|\n# | | - b more - } - :go - /^# Written by /,/# warranty; / { - s|^# || - s|^# *$|| - s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| - p + /^# Written by /!b + s|^# ||; p; n + + :fwd2blnk + /./ { + n + b fwd2blnk } - /^# Written by / { - s|^# || - p + p; n + + :holdwrnt + s|^# || + s|^# *$|| + /^Copyright /!{ + /./H + n + b holdwrnt } - /^warranty; /q' < "$progpath" + + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + G + s|\(\n\)\n*|\1|g + p; q' < "$progpath" exit $? } @@ -1972,12 +2171,12 @@ func_version () # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. -scriptversion='(GNU libtool) 2.4.6' +scriptversion='(GNU libtool) 2.4.6.42-b88ce' # func_echo ARG... @@ -2068,12 +2267,12 @@ include the following information: compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname (GNU libtool) 2.4.6 + version: $progname (GNU libtool) 2.4.6.42-b88ce automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . -GNU libtool home page: . +GNU libtool home page: . General help using GNU software: ." exit 0 } @@ -2124,7 +2323,7 @@ fi # a configuration failure hint, and exit. func_fatal_configuration () { - func__fatal_error ${1+"$@"} \ + func_fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "Fatal configuration error." } @@ -2270,6 +2469,8 @@ libtool_options_prep () nonopt= preserve_args= + _G_rc_lt_options_prep=: + # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) @@ -2293,11 +2494,16 @@ libtool_options_prep () uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; + *) + _G_rc_lt_options_prep=false + ;; esac - # Pass back the list of options. - func_quote_for_eval ${1+"$@"} - libtool_options_prep_result=$func_quote_for_eval_result + if $_G_rc_lt_options_prep; then + # Pass back the list of options. + func_quote eval ${1+"$@"} + libtool_options_prep_result=$func_quote_result + fi } func_add_hook func_options_prep libtool_options_prep @@ -2309,9 +2515,12 @@ libtool_parse_options () { $debug_cmd + _G_rc_lt_parse_options=false + # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do + _G_match_lt_parse_options=: _G_opt=$1 shift case $_G_opt in @@ -2386,15 +2595,20 @@ libtool_parse_options () func_append preserve_args " $_G_opt" ;; - # An option not handled by this hook function: - *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"} ; shift + _G_match_lt_parse_options=false + break + ;; esac + $_G_match_lt_parse_options && _G_rc_lt_parse_options=: done - - # save modified positional parameters for caller - func_quote_for_eval ${1+"$@"} - libtool_parse_options_result=$func_quote_for_eval_result + if $_G_rc_lt_parse_options; then + # save modified positional parameters for caller + func_quote eval ${1+"$@"} + libtool_parse_options_result=$func_quote_result + fi } func_add_hook func_parse_options libtool_parse_options @@ -2451,8 +2665,8 @@ libtool_validate_options () } # Pass back the unparsed argument list - func_quote_for_eval ${1+"$@"} - libtool_validate_options_result=$func_quote_for_eval_result + func_quote eval ${1+"$@"} + libtool_validate_options_result=$func_quote_result } func_add_hook func_validate_options libtool_validate_options @@ -3418,8 +3632,8 @@ func_mode_compile () esac done - func_quote_for_eval "$libobj" - test "X$libobj" != "X$func_quote_for_eval_result" \ + func_quote_arg pretty "$libobj" + test "X$libobj" != "X$func_quote_arg_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name '$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" @@ -3492,8 +3706,8 @@ compiler." func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result - func_quote_for_eval "$srcfile" - qsrcfile=$func_quote_for_eval_result + func_quote_arg pretty "$srcfile" + qsrcfile=$func_quote_arg_result # Only build a PIC object if we are building libtool libraries. if test yes = "$build_libtool_libs"; then @@ -4096,8 +4310,8 @@ func_mode_install () case $nonopt in *shtool*) :;; *) false;; esac then # Aesthetically quote it. - func_quote_for_eval "$nonopt" - install_prog="$func_quote_for_eval_result " + func_quote_arg pretty "$nonopt" + install_prog="$func_quote_arg_result " arg=$1 shift else @@ -4107,8 +4321,8 @@ func_mode_install () # The real first argument should be the name of the installation program. # Aesthetically quote it. - func_quote_for_eval "$arg" - func_append install_prog "$func_quote_for_eval_result" + func_quote_arg pretty "$arg" + func_append install_prog "$func_quote_arg_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; @@ -4165,12 +4379,12 @@ func_mode_install () esac # Aesthetically quote the argument. - func_quote_for_eval "$arg" - func_append install_prog " $func_quote_for_eval_result" + func_quote_arg pretty "$arg" + func_append install_prog " $func_quote_arg_result" if test -n "$arg2"; then - func_quote_for_eval "$arg2" + func_quote_arg pretty "$arg2" fi - func_append install_shared_prog " $func_quote_for_eval_result" + func_append install_shared_prog " $func_quote_arg_result" done test -z "$install_prog" && \ @@ -4181,8 +4395,8 @@ func_mode_install () if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else - func_quote_for_eval "$install_override_mode" - func_append install_shared_prog " -m $func_quote_for_eval_result" + func_quote_arg pretty "$install_override_mode" + func_append install_shared_prog " -m $func_quote_arg_result" fi fi @@ -4478,8 +4692,8 @@ func_mode_install () relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_quiet || { - func_quote_for_expand "$relink_command" - eval "func_echo $func_quote_for_expand_result" + func_quote_arg expand,pretty "$relink_command" + eval "func_echo $func_quote_arg_result" } if eval "$relink_command"; then : else @@ -5258,7 +5472,8 @@ else if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" - qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + func_quote_arg pretty "$ECHO" + qECHO=$func_quote_arg_result $ECHO "\ # A function that is used when there is no print builtin or printf. @@ -5268,7 +5483,7 @@ func_fallback_echo () \$1 _LTECHO_EOF' } - ECHO=\"$qECHO\" + ECHO=$qECHO fi # Very basic option parsing. These options are (a) specific to @@ -6611,9 +6826,9 @@ func_mode_link () while test "$#" -gt 0; do arg=$1 shift - func_quote_for_eval "$arg" - qarg=$func_quote_for_eval_unquoted_result - func_append libtool_args " $func_quote_for_eval_result" + func_quote_arg pretty,unquoted "$arg" + qarg=$func_quote_arg_unquoted_result + func_append libtool_args " $func_quote_arg_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then @@ -7211,9 +7426,9 @@ func_mode_link () save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs - func_quote_for_eval "$flag" - func_append arg " $func_quote_for_eval_result" - func_append compiler_flags " $func_quote_for_eval_result" + func_quote_arg pretty "$flag" + func_append arg " $func_quote_arg_result" + func_append compiler_flags " $func_quote_arg_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" @@ -7227,10 +7442,10 @@ func_mode_link () save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs - func_quote_for_eval "$flag" - func_append arg " $wl$func_quote_for_eval_result" - func_append compiler_flags " $wl$func_quote_for_eval_result" - func_append linker_flags " $func_quote_for_eval_result" + func_quote_arg pretty "$flag" + func_append arg " $wl$func_quote_arg_result" + func_append compiler_flags " $wl$func_quote_arg_result" + func_append linker_flags " $func_quote_arg_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" @@ -7254,8 +7469,8 @@ func_mode_link () # -msg_* for osf cc -msg_*) - func_quote_for_eval "$arg" - arg=$func_quote_for_eval_result + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result ;; # Flags to be passed through unchanged, with rationale: @@ -7272,12 +7487,16 @@ func_mode_link () # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -specs=* GCC specs files # -stdlib=* select c++ std lib with clang + # -fsanitize=* Clang/GCC memory and address sanitizer + # -fuse-ld=* Linker select flags for GCC -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ - -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) - func_quote_for_eval "$arg" - arg=$func_quote_for_eval_result + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ + -specs=*|-fsanitize=*|-fuse-ld=*) + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" @@ -7298,15 +7517,15 @@ func_mode_link () continue else # Otherwise treat like 'Some other compiler flag' below - func_quote_for_eval "$arg" - arg=$func_quote_for_eval_result + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result fi ;; # Some other compiler flag. -* | +*) - func_quote_for_eval "$arg" - arg=$func_quote_for_eval_result + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result ;; *.$objext) @@ -7426,8 +7645,8 @@ func_mode_link () *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. - func_quote_for_eval "$arg" - arg=$func_quote_for_eval_result + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result ;; esac # arg @@ -9933,8 +10152,8 @@ EOF for cmd in $concat_cmds; do IFS=$save_ifs $opt_quiet || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" + func_quote_arg expand,pretty "$cmd" + eval "func_echo $func_quote_arg_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? @@ -10027,8 +10246,8 @@ EOF eval cmd=\"$cmd\" IFS=$save_ifs $opt_quiet || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" + func_quote_arg expand,pretty "$cmd" + eval "func_echo $func_quote_arg_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? @@ -10502,12 +10721,13 @@ EOF elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + func_quote_arg pretty "$var_value" + relink_command="$var=$func_quote_arg_result; export $var; $relink_command" fi done - relink_command="(cd `pwd`; $relink_command)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + func_quote eval cd "`pwd`" + func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)" + relink_command=$func_quote_arg_unquoted_result fi # Only actually do things if not in dry run mode. @@ -10747,13 +10967,15 @@ EOF elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + func_quote_arg pretty,unquoted "$var_value" + relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command" fi done # Quote the link command for shipping. - relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + func_quote eval cd "`pwd`" + relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + func_quote_arg pretty,unquoted "$relink_command" + relink_command=$func_quote_arg_unquoted_result if test yes = "$hardcode_automatic"; then relink_command= fi diff --git a/libtgvoip/os/android/AudioInputAndroid.cpp b/libtgvoip/os/android/AudioInputAndroid.cpp index 44f215e..313a244 100644 --- a/libtgvoip/os/android/AudioInputAndroid.cpp +++ b/libtgvoip/os/android/AudioInputAndroid.cpp @@ -7,6 +7,7 @@ #include "AudioInputAndroid.h" #include #include "../../logging.h" +#include "JNIUtilities.h" extern JavaVM* sharedJVM; @@ -17,84 +18,46 @@ jmethodID AudioInputAndroid::initMethod=NULL; jmethodID AudioInputAndroid::releaseMethod=NULL; jmethodID AudioInputAndroid::startMethod=NULL; jmethodID AudioInputAndroid::stopMethod=NULL; +jmethodID AudioInputAndroid::getEnabledEffectsMaskMethod=NULL; jclass AudioInputAndroid::jniClass=NULL; AudioInputAndroid::AudioInputAndroid(){ - JNIEnv* env=NULL; - bool didAttach=false; - sharedJVM->GetEnv((void**) &env, JNI_VERSION_1_6); - if(!env){ - sharedJVM->AttachCurrentThread(&env, NULL); - didAttach=true; - } - - jmethodID ctor=env->GetMethodID(jniClass, "", "(J)V"); - jobject obj=env->NewObject(jniClass, ctor, (jlong)(intptr_t)this); - javaObject=env->NewGlobalRef(obj); - - env->CallVoidMethod(javaObject, initMethod, 48000, 16, 1, 960*2); - - if(didAttach){ - sharedJVM->DetachCurrentThread(); - } + jni::DoWithJNI([this](JNIEnv* env){ + jmethodID ctor=env->GetMethodID(jniClass, "", "(J)V"); + jobject obj=env->NewObject(jniClass, ctor, (jlong)(intptr_t)this); + javaObject=env->NewGlobalRef(obj); + + env->CallVoidMethod(javaObject, initMethod, 48000, 16, 1, 960*2); + enabledEffects=(unsigned int)env->CallIntMethod(javaObject, getEnabledEffectsMaskMethod); + }); running=false; } AudioInputAndroid::~AudioInputAndroid(){ { MutexGuard guard(mutex); - JNIEnv *env=NULL; - bool didAttach=false; - sharedJVM->GetEnv((void **) &env, JNI_VERSION_1_6); - if(!env){ - sharedJVM->AttachCurrentThread(&env, NULL); - didAttach=true; - } - - env->CallVoidMethod(javaObject, releaseMethod); - env->DeleteGlobalRef(javaObject); - javaObject=NULL; - - if(didAttach){ - sharedJVM->DetachCurrentThread(); - } + jni::DoWithJNI([this](JNIEnv* env){ + env->CallVoidMethod(javaObject, releaseMethod); + env->DeleteGlobalRef(javaObject); + javaObject=NULL; + }); } } void AudioInputAndroid::Start(){ MutexGuard guard(mutex); - JNIEnv* env=NULL; - bool didAttach=false; - sharedJVM->GetEnv((void**) &env, JNI_VERSION_1_6); - if(!env){ - sharedJVM->AttachCurrentThread(&env, NULL); - didAttach=true; - } - - failed=!env->CallBooleanMethod(javaObject, startMethod); - - if(didAttach){ - sharedJVM->DetachCurrentThread(); - } + jni::DoWithJNI([this](JNIEnv* env){ + failed=!env->CallBooleanMethod(javaObject, startMethod); + }); running=true; } void AudioInputAndroid::Stop(){ MutexGuard guard(mutex); running=false; - JNIEnv* env=NULL; - bool didAttach=false; - sharedJVM->GetEnv((void**) &env, JNI_VERSION_1_6); - if(!env){ - sharedJVM->AttachCurrentThread(&env, NULL); - didAttach=true; - } - - env->CallVoidMethod(javaObject, stopMethod); - - if(didAttach){ - sharedJVM->DetachCurrentThread(); - } + jni::DoWithJNI([this](JNIEnv* env){ + env->CallVoidMethod(javaObject, stopMethod); + }); } void AudioInputAndroid::HandleCallback(JNIEnv* env, jobject buffer){ @@ -103,4 +66,8 @@ void AudioInputAndroid::HandleCallback(JNIEnv* env, jobject buffer){ unsigned char* buf=(unsigned char*) env->GetDirectBufferAddress(buffer); size_t len=(size_t) env->GetDirectBufferCapacity(buffer); InvokeCallback(buf, len); -} \ No newline at end of file +} + +unsigned int AudioInputAndroid::GetEnabledEffects(){ + return enabledEffects; +} diff --git a/libtgvoip/os/android/AudioInputAndroid.h b/libtgvoip/os/android/AudioInputAndroid.h index 173f538..8ee7615 100644 --- a/libtgvoip/os/android/AudioInputAndroid.h +++ b/libtgvoip/os/android/AudioInputAndroid.h @@ -20,16 +20,22 @@ class AudioInputAndroid : public AudioInput{ virtual void Start(); virtual void Stop(); void HandleCallback(JNIEnv* env, jobject buffer); + unsigned int GetEnabledEffects(); static jmethodID initMethod; static jmethodID releaseMethod; static jmethodID startMethod; static jmethodID stopMethod; + static jmethodID getEnabledEffectsMaskMethod; static jclass jniClass; + static constexpr unsigned int EFFECT_AEC=1; + static constexpr unsigned int EFFECT_NS=2; + private: jobject javaObject; bool running; Mutex mutex; + unsigned int enabledEffects=0; }; }} diff --git a/libtgvoip/os/android/AudioOutputAndroid.cpp b/libtgvoip/os/android/AudioOutputAndroid.cpp index e9c3717..c1dc2d5 100644 --- a/libtgvoip/os/android/AudioOutputAndroid.cpp +++ b/libtgvoip/os/android/AudioOutputAndroid.cpp @@ -103,5 +103,5 @@ void AudioOutputAndroid::HandleCallback(JNIEnv* env, jbyteArray buffer){ bool AudioOutputAndroid::IsPlaying(){ - return false; + return running; } diff --git a/libtgvoip/os/android/JNIUtilities.h b/libtgvoip/os/android/JNIUtilities.h new file mode 100644 index 0000000..0735e88 --- /dev/null +++ b/libtgvoip/os/android/JNIUtilities.h @@ -0,0 +1,66 @@ +// +// Created by Grishka on 15.08.2018. +// + +#ifndef LIBTGVOIP_JNIUTILITIES_H +#define LIBTGVOIP_JNIUTILITIES_H + +#include +#include +#include +#include +#include "../../Buffers.h" + +extern JavaVM* sharedJVM; + +namespace tgvoip{ + namespace jni{ + + inline void DoWithJNI(std::function f){ + JNIEnv *env=NULL; + bool didAttach=false; + sharedJVM->GetEnv((void **) &env, JNI_VERSION_1_6); + if(!env){ + sharedJVM->AttachCurrentThread(&env, NULL); + didAttach=true; + } + + f(env); + + if(didAttach){ + sharedJVM->DetachCurrentThread(); + } + } + + inline void AttachAndCallVoidMethod(jmethodID method, jobject obj, ...){ + if(!method || !obj) + return; + va_list va; + va_start(va, obj); + DoWithJNI([&va, method, obj](JNIEnv* env){ + env->CallVoidMethodV(obj, method, va); + }); + va_end(va); + } + + inline std::string JavaStringToStdString(JNIEnv* env, jstring jstr){ + if(!jstr) + return ""; + const char* jchars=env->GetStringUTFChars(jstr, NULL); + std::string str(jchars); + env->ReleaseStringUTFChars(jstr, jchars); + return str; + } + + inline jbyteArray BufferToByteArray(JNIEnv* env, Buffer& buf){ + jbyteArray arr=env->NewByteArray((jsize)buf.Length()); + jbyte* elements=env->GetByteArrayElements(arr, NULL); + memcpy(elements, *buf, buf.Length()); + env->ReleaseByteArrayElements(arr, elements, 0); + return arr; + } + + } +} + +#endif //LIBTGVOIP_JNIUTILITIES_H diff --git a/libtgvoip/os/android/VideoRendererAndroid.cpp b/libtgvoip/os/android/VideoRendererAndroid.cpp new file mode 100644 index 0000000..805816a --- /dev/null +++ b/libtgvoip/os/android/VideoRendererAndroid.cpp @@ -0,0 +1,114 @@ +// +// Created by Grishka on 12.08.2018. +// + +#include "VideoRendererAndroid.h" +#include "JNIUtilities.h" +#include "../../PrivateDefines.h" +#include "../../logging.h" + +using namespace tgvoip; +using namespace tgvoip::video; + +jmethodID VideoRendererAndroid::resetMethod=NULL; +jmethodID VideoRendererAndroid::decodeAndDisplayMethod=NULL; +jmethodID VideoRendererAndroid::setStreamEnabledMethod=NULL; +std::vector VideoRendererAndroid::availableDecoders; +int VideoRendererAndroid::maxResolution; + +extern JavaVM* sharedJVM; + +VideoRendererAndroid::VideoRendererAndroid(jobject jobj) : queue(50){ + this->jobj=jobj; +} + +VideoRendererAndroid::~VideoRendererAndroid(){ + running=false; + Buffer empty(0); + queue.Put(std::move(empty)); + thread->Join(); + delete thread; + /*decoderThread.Post([this]{ + decoderEnv->DeleteGlobalRef(jobj); + });*/ +} + +void VideoRendererAndroid::Reset(uint32_t codec, unsigned int width, unsigned int height, std::vector &_csd){ + assert(!thread); + for(Buffer& b:_csd){ + csd.push_back(Buffer::CopyOf(b)); + } + this->codec=codec; + this->width=width; + this->height=height; + thread=new Thread(std::bind(&VideoRendererAndroid::RunThread, this)); + thread->Start(); +} + +void VideoRendererAndroid::DecodeAndDisplay(Buffer frame, uint32_t pts){ + /*decoderThread.Post(std::bind([this](Buffer frame){ + }, std::move(frame)));*/ + LOGV("2 before decode %u", (unsigned int)frame.Length()); + queue.Put(std::move(frame)); +} + +void VideoRendererAndroid::RunThread(){ + JNIEnv* env; + sharedJVM->AttachCurrentThread(&env, NULL); + + jobjectArray jcsd=NULL; + if(!csd.empty()){ + jcsd=env->NewObjectArray((jsize)csd.size(), env->FindClass("[B"), NULL); + jsize i=0; + for(Buffer& b:csd){ + env->SetObjectArrayElement(jcsd, i, jni::BufferToByteArray(env, b)); + i++; + } + } + std::string codecStr=""; + switch(codec){ + case CODEC_AVC: + codecStr="video/avc"; + break; + case CODEC_HEVC: + codecStr="video/hevc"; + break; + case CODEC_VP8: + codecStr="video/x-vnd.on2.vp8"; + break; + case CODEC_VP9: + codecStr="video/x-vnd.on2.vp9"; + break; + } + env->CallVoidMethod(jobj, resetMethod, env->NewStringUTF(codecStr.c_str()), (jint)width, (jint)height, jcsd); + bool enabled=true; + env->CallVoidMethod(jobj, setStreamEnabledMethod, enabled); + + constexpr size_t bufferSize=200*1024; + unsigned char* buf=reinterpret_cast(malloc(bufferSize)); + jobject jbuf=env->NewDirectByteBuffer(buf, bufferSize); + + while(running){ + LOGV("before get from queue"); + Buffer frame=std::move(queue.GetBlocking()); + LOGV("1 before decode %u", (unsigned int)frame.Length()); + if(!running) + break; + if(frame.Length()>bufferSize){ + LOGE("Frame data is too long (%u, max %u)", (int)frame.Length(), (int)bufferSize); + }else{ + memcpy(buf, *frame, frame.Length()); + env->CallVoidMethod(jobj, decodeAndDisplayMethod, jbuf, (jint) frame.Length(), 0); + } + } + free(buf); + sharedJVM->DetachCurrentThread(); + LOGI("==== decoder thread exiting ===="); +} + +void VideoRendererAndroid::SetStreamEnabled(bool enabled){ + LOGI("Video stream state: %d", enabled); + /*decoderThread.Post([=](){ + decoderEnv->CallVoidMethod(jobj, setStreamEnabledMethod, enabled); + });*/ +} diff --git a/libtgvoip/os/android/VideoRendererAndroid.h b/libtgvoip/os/android/VideoRendererAndroid.h new file mode 100644 index 0000000..cbae150 --- /dev/null +++ b/libtgvoip/os/android/VideoRendererAndroid.h @@ -0,0 +1,43 @@ +// +// Created by Grishka on 12.08.2018. +// + +#ifndef LIBTGVOIP_VIDEORENDERERANDROID_H +#define LIBTGVOIP_VIDEORENDERERANDROID_H + +#include "../../video/VideoRenderer.h" +#include "../../MessageThread.h" + +#include +#include "../../BlockingQueue.h" + +namespace tgvoip{ + namespace video{ + class VideoRendererAndroid : public VideoRenderer{ + public: + VideoRendererAndroid(jobject jobj); + virtual ~VideoRendererAndroid(); + virtual void Reset(uint32_t codec, unsigned int width, unsigned int height, std::vector& csd) override; + virtual void DecodeAndDisplay(Buffer frame, uint32_t pts) override; + virtual void SetStreamEnabled(bool enabled) override; + + static jmethodID resetMethod; + static jmethodID decodeAndDisplayMethod; + static jmethodID setStreamEnabledMethod; + static std::vector availableDecoders; + static int maxResolution; + private: + void RunThread(); + Thread* thread=NULL; + bool running=true; + BlockingQueue queue; + std::vector csd; + int width; + int height; + uint32_t codec; + jobject jobj; + }; + } +} + +#endif //LIBTGVOIP_VIDEORENDERERANDROID_H diff --git a/libtgvoip/os/android/VideoSourceAndroid.cpp b/libtgvoip/os/android/VideoSourceAndroid.cpp new file mode 100644 index 0000000..17fa3ea --- /dev/null +++ b/libtgvoip/os/android/VideoSourceAndroid.cpp @@ -0,0 +1,81 @@ +// +// Created by Grishka on 12.08.2018. +// + +#include "VideoSourceAndroid.h" +#include "JNIUtilities.h" +#include "../../logging.h" +#include "../../PrivateDefines.h" + +using namespace tgvoip; +using namespace tgvoip::video; + +extern JavaVM* sharedJVM; + +std::vector VideoSourceAndroid::availableEncoders; + +VideoSourceAndroid::VideoSourceAndroid(jobject jobj) : javaObject(jobj){ + jni::DoWithJNI([&](JNIEnv* env){ + jclass cls=env->GetObjectClass(javaObject); + startMethod=env->GetMethodID(cls, "start", "()V"); + stopMethod=env->GetMethodID(cls, "stop", "()V"); + prepareEncoderMethod=env->GetMethodID(cls, "prepareEncoder", "(Ljava/lang/String;I)V"); + requestKeyFrameMethod=env->GetMethodID(cls, "requestKeyFrame", "()V"); + }); +} + +VideoSourceAndroid::~VideoSourceAndroid(){ + jni::DoWithJNI([this](JNIEnv* env){ + env->DeleteGlobalRef(javaObject); + }); +} + +void VideoSourceAndroid::Start(){ + jni::DoWithJNI([this](JNIEnv* env){ + env->CallVoidMethod(javaObject, startMethod); + }); +} + +void VideoSourceAndroid::Stop(){ + jni::DoWithJNI([this](JNIEnv* env){ + env->CallVoidMethod(javaObject, stopMethod); + }); +} + +void VideoSourceAndroid::SendFrame(Buffer frame, uint32_t flags){ + callback(frame, flags); +} + +void VideoSourceAndroid::SetStreamParameters(std::vector csd, unsigned int width, unsigned int height){ + LOGD("Video stream parameters: %d x %d", width, height); + this->width=width; + this->height=height; + this->csd=std::move(csd); +} + +void VideoSourceAndroid::Reset(uint32_t codec, int maxResolution){ + jni::DoWithJNI([&](JNIEnv* env){ + std::string codecStr=""; + switch(codec){ + case CODEC_AVC: + codecStr="video/avc"; + break; + case CODEC_HEVC: + codecStr="video/hevc"; + break; + case CODEC_VP8: + codecStr="video/x-vnd.on2.vp8"; + break; + case CODEC_VP9: + codecStr="video/x-vnd.on2.vp9"; + break; + } + env->CallVoidMethod(javaObject, prepareEncoderMethod, env->NewStringUTF(codecStr.c_str()), maxResolution); + }); +} + +void VideoSourceAndroid::RequestKeyFrame(){ + jni::DoWithJNI([this](JNIEnv* env){ + env->CallVoidMethod(javaObject, requestKeyFrameMethod); + }); +} diff --git a/libtgvoip/os/android/VideoSourceAndroid.h b/libtgvoip/os/android/VideoSourceAndroid.h new file mode 100644 index 0000000..eccb8fc --- /dev/null +++ b/libtgvoip/os/android/VideoSourceAndroid.h @@ -0,0 +1,38 @@ +// +// Created by Grishka on 12.08.2018. +// + +#ifndef LIBTGVOIP_VIDEOSOURCEANDROID_H +#define LIBTGVOIP_VIDEOSOURCEANDROID_H + +#include "../../video/VideoSource.h" +#include "../../Buffers.h" +#include +#include + +namespace tgvoip{ + namespace video{ + class VideoSourceAndroid : public VideoSource{ + public: + VideoSourceAndroid(jobject jobj); + virtual ~VideoSourceAndroid(); + virtual void Start() override; + virtual void Stop() override; + virtual void Reset(uint32_t codec, int maxResolution) override; + void SendFrame(Buffer frame, uint32_t flags); + void SetStreamParameters(std::vector csd, unsigned int width, unsigned int height); + virtual void RequestKeyFrame() override; + + static std::vector availableEncoders; + private: + jobject javaObject; + jmethodID prepareEncoderMethod; + jmethodID startMethod; + jmethodID stopMethod; + jmethodID requestKeyFrameMethod; + }; + } +} + + +#endif //LIBTGVOIP_VIDEOSOURCEANDROID_H diff --git a/libtgvoip/os/darwin/AudioInputAudioUnit.cpp b/libtgvoip/os/darwin/AudioInputAudioUnit.cpp index 35b8522..3f80426 100644 --- a/libtgvoip/os/darwin/AudioInputAudioUnit.cpp +++ b/libtgvoip/os/darwin/AudioInputAudioUnit.cpp @@ -41,14 +41,13 @@ void AudioInputAudioUnit::Stop(){ void AudioInputAudioUnit::HandleBufferCallback(AudioBufferList *ioData){ int i; - int j; for(i=0;imNumberBuffers;i++){ AudioBuffer buf=ioData->mBuffers[i]; #if TARGET_OS_OSX assert(remainingDataSize+buf.mDataByteSize/2<10240); float* src=reinterpret_cast(buf.mData); int16_t* dst=reinterpret_cast(remainingData+remainingDataSize); - for(j=0;j #include "../../audio/AudioInput.h" +#include "../../utils.h" namespace tgvoip{ namespace audio{ class AudioUnitIO; @@ -16,6 +17,7 @@ class AudioUnitIO; class AudioInputAudioUnit : public AudioInput{ public: + TGVOIP_DISALLOW_COPY_AND_ASSIGN(AudioInputAudioUnit); AudioInputAudioUnit(std::string deviceID, AudioUnitIO* io); virtual ~AudioInputAudioUnit(); virtual void Start(); diff --git a/libtgvoip/os/darwin/AudioInputAudioUnitOSX.cpp b/libtgvoip/os/darwin/AudioInputAudioUnitOSX.cpp index d85a113..e9218b1 100644 --- a/libtgvoip/os/darwin/AudioInputAudioUnitOSX.cpp +++ b/libtgvoip/os/darwin/AudioInputAudioUnitOSX.cpp @@ -201,6 +201,8 @@ void AudioInputAudioUnitLegacy::EnumerateDevices(std::vector& dev.displayName=std::string(buf); CFStringGetCString(deviceUID, buf, 1024, kCFStringEncodingUTF8); dev.id=std::string(buf); + if(dev.id.rfind("VPAUAggregateAudioDevice-0x")==0) + continue; devs.push_back(dev); } diff --git a/libtgvoip/os/darwin/AudioOutputAudioUnit.h b/libtgvoip/os/darwin/AudioOutputAudioUnit.h index 5e46180..e6b5294 100644 --- a/libtgvoip/os/darwin/AudioOutputAudioUnit.h +++ b/libtgvoip/os/darwin/AudioOutputAudioUnit.h @@ -9,12 +9,14 @@ #include #include "../../audio/AudioOutput.h" +#include "../../utils.h" namespace tgvoip{ namespace audio{ class AudioUnitIO; class AudioOutputAudioUnit : public AudioOutput{ public: + TGVOIP_DISALLOW_COPY_AND_ASSIGN(AudioOutputAudioUnit); AudioOutputAudioUnit(std::string deviceID, AudioUnitIO* io); virtual ~AudioOutputAudioUnit(); virtual void Start(); diff --git a/libtgvoip/os/darwin/AudioOutputAudioUnitOSX.cpp b/libtgvoip/os/darwin/AudioOutputAudioUnitOSX.cpp index 13f132a..cc023f8 100644 --- a/libtgvoip/os/darwin/AudioOutputAudioUnitOSX.cpp +++ b/libtgvoip/os/darwin/AudioOutputAudioUnitOSX.cpp @@ -222,6 +222,8 @@ void AudioOutputAudioUnitLegacy::EnumerateDevices(std::vector dev.displayName=std::string(buf); CFStringGetCString(deviceUID, buf, 1024, kCFStringEncodingUTF8); dev.id=std::string(buf); + if(dev.id.rfind("VPAUAggregateAudioDevice-0x")==0) + continue; devs.push_back(dev); } diff --git a/libtgvoip/os/darwin/AudioUnitIO.cpp b/libtgvoip/os/darwin/AudioUnitIO.cpp index b763231..5689f71 100644 --- a/libtgvoip/os/darwin/AudioUnitIO.cpp +++ b/libtgvoip/os/darwin/AudioUnitIO.cpp @@ -23,10 +23,19 @@ #define kOutputBus 0 #define kInputBus 1 +#if TARGET_OS_OSX +extern "C" { +OSStatus AudioDeviceDuck(AudioDeviceID inDevice, + Float32 inDuckedLevel, + const AudioTimeStamp* __nullable inStartTime, + Float32 inRampDuration) __attribute__((weak_import)); +} +#endif + using namespace tgvoip; using namespace tgvoip::audio; -AudioUnitIO::AudioUnitIO(){ +AudioUnitIO::AudioUnitIO(std::string inputDeviceID, std::string outputDeviceID){ input=NULL; output=NULL; inputEnabled=false; @@ -37,6 +46,10 @@ AudioUnitIO::AudioUnitIO(){ inBufferList.mBuffers[0].mDataByteSize=INPUT_BUFFER_SIZE; inBufferList.mNumberBuffers=1; +#if TARGET_OS_IPHONE + DarwinSpecific::ConfigureAudioSession(); +#endif + OSStatus status; AudioComponentDescription desc; AudioComponent inputComponent; @@ -108,11 +121,13 @@ AudioUnitIO::AudioUnitIO(){ AudioObjectAddPropertyListener(kAudioObjectSystemObject, &propertyAddress, AudioUnitIO::DefaultDeviceChangedCallback, this); propertyAddress.mSelector = kAudioHardwarePropertyDefaultInputDevice; AudioObjectAddPropertyListener(kAudioObjectSystemObject, &propertyAddress, AudioUnitIO::DefaultDeviceChangedCallback, this); + + #endif - input=new AudioInputAudioUnit("default", this); - output=new AudioOutputAudioUnit("default", this); + input=new AudioInputAudioUnit(inputDeviceID, this); + output=new AudioOutputAudioUnit(outputDeviceID, this); } AudioUnitIO::~AudioUnitIO(){ @@ -125,12 +140,12 @@ AudioUnitIO::~AudioUnitIO(){ propertyAddress.mSelector = kAudioHardwarePropertyDefaultInputDevice; AudioObjectRemovePropertyListener(kAudioObjectSystemObject, &propertyAddress, AudioUnitIO::DefaultDeviceChangedCallback, this); #endif - delete input; - delete output; AudioOutputUnitStop(unit); AudioUnitUninitialize(unit); AudioComponentInstanceDispose(unit); free(inBufferList.mBuffers[0].mData); + delete input; + delete output; } OSStatus AudioUnitIO::BufferCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData){ @@ -162,6 +177,12 @@ void AudioUnitIO::EnableInput(bool enabled){ void AudioUnitIO::EnableOutput(bool enabled){ outputEnabled=enabled; StartIfNeeded(); +#if TARGET_OS_OSX + if(actualDuckingEnabled!=duckingEnabled){ + actualDuckingEnabled=duckingEnabled; + AudioDeviceDuck(currentOutputDeviceID, duckingEnabled ? 0.177828f : 1.0f, NULL, 0.1f); + } +#endif } void AudioUnitIO::StartIfNeeded(){ @@ -200,6 +221,7 @@ OSStatus AudioUnitIO::DefaultDeviceChangedCallback(AudioObjectID inObjectID, UIn } void AudioUnitIO::SetCurrentDevice(bool input, std::string deviceID){ + LOGV("Setting current %sput device: %s", input ? "in" : "out", deviceID.c_str()); if(started){ AudioOutputUnitStop(unit); AudioUnitUninitialize(unit); @@ -264,7 +286,6 @@ void AudioUnitIO::SetCurrentDevice(bool input, std::string deviceID){ else currentOutputDevice=deviceID; - /*AudioObjectPropertyAddress propertyAddress = { kAudioDevicePropertyBufferFrameSize, kAudioObjectPropertyScopeGlobal, @@ -281,6 +302,18 @@ void AudioUnitIO::SetCurrentDevice(bool input, std::string deviceID){ started=false; StartIfNeeded(); } + if(!input){ + currentOutputDeviceID=device; + } + LOGV("Set current %sput device done", input ? "in" : "out"); +} + +void AudioUnitIO::SetDuckingEnabled(bool enabled){ + duckingEnabled=enabled; + if(outputEnabled && duckingEnabled!=actualDuckingEnabled){ + actualDuckingEnabled=enabled; + AudioDeviceDuck(currentOutputDeviceID, enabled ? 0.177828f : 1.0f, NULL, 0.1f); + } } #endif diff --git a/libtgvoip/os/darwin/AudioUnitIO.h b/libtgvoip/os/darwin/AudioUnitIO.h index 24d550a..981a7e9 100644 --- a/libtgvoip/os/darwin/AudioUnitIO.h +++ b/libtgvoip/os/darwin/AudioUnitIO.h @@ -19,7 +19,7 @@ class AudioOutputAudioUnit; class AudioUnitIO : public AudioIO{ public: - AudioUnitIO(); + AudioUnitIO(std::string inputDeviceID, std::string outputDeviceID); ~AudioUnitIO(); void EnableInput(bool enabled); void EnableOutput(bool enabled); @@ -27,6 +27,7 @@ class AudioOutputAudioUnit; virtual AudioOutput* GetOutput(); #if TARGET_OS_OSX void SetCurrentDevice(bool input, std::string deviceID); + void SetDuckingEnabled(bool enabled); #endif private: @@ -37,6 +38,9 @@ class AudioOutputAudioUnit; static OSStatus DefaultDeviceChangedCallback(AudioObjectID inObjectID, UInt32 inNumberAddresses, const AudioObjectPropertyAddress *inAddresses, void *inClientData); std::string currentInputDevice; std::string currentOutputDevice; + bool duckingEnabled=true; + bool actualDuckingEnabled=true; + AudioDeviceID currentOutputDeviceID; #endif AudioComponentInstance unit; AudioInputAudioUnit* input; diff --git a/libtgvoip/os/darwin/DarwinSpecific.h b/libtgvoip/os/darwin/DarwinSpecific.h index 8e42d59..87cd878 100644 --- a/libtgvoip/os/darwin/DarwinSpecific.h +++ b/libtgvoip/os/darwin/DarwinSpecific.h @@ -10,6 +10,9 @@ #include namespace tgvoip { + + struct CellularCarrierInfo; + class DarwinSpecific{ public: enum{ @@ -21,6 +24,8 @@ class DarwinSpecific{ }; static void GetSystemName(char* buf, size_t len); static void SetCurrentThreadPriority(int priority); + static CellularCarrierInfo GetCarrierInfo(); + static void ConfigureAudioSession(); }; } diff --git a/libtgvoip/os/darwin/DarwinSpecific.mm b/libtgvoip/os/darwin/DarwinSpecific.mm index a97cfcf..e0fb63d 100644 --- a/libtgvoip/os/darwin/DarwinSpecific.mm +++ b/libtgvoip/os/darwin/DarwinSpecific.mm @@ -5,8 +5,15 @@ // #include "DarwinSpecific.h" +#include "../../VoIPController.h" +#include "../../logging.h" #import +#if TARGET_OS_IOS +#import +#import +#import +#endif using namespace tgvoip; @@ -62,3 +69,42 @@ [NSThread setThreadPriority:p]; } } + +CellularCarrierInfo DarwinSpecific::GetCarrierInfo(){ + CellularCarrierInfo info; +#if TARGET_OS_IOS + CTTelephonyNetworkInfo* netinfo=[CTTelephonyNetworkInfo new]; + CTCarrier* carrier=[netinfo subscriberCellularProvider]; + if(carrier){ + NSString* name=[carrier carrierName]; + NSString* mcc=[carrier mobileCountryCode]; + NSString* mnc=[carrier mobileNetworkCode]; + NSString* countryCode=[carrier isoCountryCode]; + if(name && mcc && mnc && countryCode){ + info.name=[name cStringUsingEncoding:NSUTF8StringEncoding]; + info.mcc=[mcc cStringUsingEncoding:NSUTF8StringEncoding]; + info.mnc=[mnc cStringUsingEncoding:NSUTF8StringEncoding]; + info.countryCode=[[countryCode uppercaseString] cStringUsingEncoding:NSUTF8StringEncoding]; + } + } +#endif + return info; +} + +void DarwinSpecific::ConfigureAudioSession(){ +#if TARGET_OS_IOS + AVAudioSession* session=[AVAudioSession sharedInstance]; + NSError* error=nil; + [session setPreferredSampleRate:48000.0 error:&error]; + if(error){ + LOGE("Failed to set preferred sample rate on AVAudioSession: %s", [[error localizedDescription] cStringUsingEncoding:NSUTF8StringEncoding]); + return; + } + [session setPreferredIOBufferDuration:0.020 error:&error]; + if(error){ + LOGE("Failed to set preferred IO buffer duration on AVAudioSession: %s", [[error localizedDescription] cStringUsingEncoding:NSUTF8StringEncoding]); + return; + } + LOGI("Configured AVAudioSession: sampleRate=%f, IOBufferDuration=%f", session.sampleRate, session.IOBufferDuration); +#endif +} diff --git a/libtgvoip/os/linux/AudioInputALSA.cpp b/libtgvoip/os/linux/AudioInputALSA.cpp index 5a1ba3f..422dd39 100644 --- a/libtgvoip/os/linux/AudioInputALSA.cpp +++ b/libtgvoip/os/linux/AudioInputALSA.cpp @@ -54,7 +54,7 @@ void AudioInputALSA::Start(){ return; isRecording=true; - thread=new Thread(new MethodPointer(&AudioInputALSA::RunThread, this), NULL); + thread=new Thread(std::bind(&AudioInputALSA::RunThread, this)); thread->SetName("AudioInputALSA"); thread->Start(); } @@ -69,7 +69,7 @@ void AudioInputALSA::Stop(){ thread=NULL; } -void AudioInputALSA::RunThread(void* arg){ +void AudioInputALSA::RunThread(){ unsigned char buffer[BUFFER_SIZE*2]; snd_pcm_sframes_t frames; while(isRecording){ @@ -172,4 +172,4 @@ void AudioInputALSA::EnumerateDevices(std::vector& devs){ } dlclose(lib); -} \ No newline at end of file +} diff --git a/libtgvoip/os/linux/AudioInputALSA.h b/libtgvoip/os/linux/AudioInputALSA.h index 78c139f..09888dd 100644 --- a/libtgvoip/os/linux/AudioInputALSA.h +++ b/libtgvoip/os/linux/AudioInputALSA.h @@ -25,7 +25,7 @@ class AudioInputALSA : public AudioInput{ static void EnumerateDevices(std::vector& devs); private: - void RunThread(void* arg); + void RunThread(); int (*_snd_pcm_open)(snd_pcm_t** pcm, const char* name, snd_pcm_stream_t stream, int mode); int (*_snd_pcm_set_params)(snd_pcm_t* pcm, snd_pcm_format_t format, snd_pcm_access_t access, unsigned int channels, unsigned int rate, int soft_resample, unsigned int latency); diff --git a/libtgvoip/os/linux/AudioInputPulse.cpp b/libtgvoip/os/linux/AudioInputPulse.cpp index f54f49b..be7366b 100644 --- a/libtgvoip/os/linux/AudioInputPulse.cpp +++ b/libtgvoip/os/linux/AudioInputPulse.cpp @@ -33,25 +33,13 @@ AudioInputPulse::AudioInputPulse(pa_context* context, pa_threaded_mainloop* main remainingDataSize=0; pa_threaded_mainloop_lock(mainloop); - pa_sample_spec sample_specifications{ - .format=PA_SAMPLE_S16LE, - .rate=48000, - .channels=1 - }; - pa_proplist* proplist=pa_proplist_new(); - pa_proplist_sets(proplist, PA_PROP_FILTER_APPLY, ""); // according to PA sources, this disables any possible filters - stream=pa_stream_new_with_proplist(context, "libtgvoip capture", &sample_specifications, NULL, proplist); - pa_proplist_free(proplist); + stream=CreateAndInitStream(); + pa_threaded_mainloop_unlock(mainloop); + isLocked=false; if(!stream){ - LOGE("Error initializing PulseAudio (pa_stream_new)"); - failed=true; return; } - pa_stream_set_state_callback(stream, AudioInputPulse::StreamStateCallback, this); - pa_stream_set_read_callback(stream, AudioInputPulse::StreamReadCallback, this); - pa_threaded_mainloop_unlock(mainloop); - isLocked=false; SetCurrentDevice(devID); } @@ -63,6 +51,26 @@ AudioInputPulse::~AudioInputPulse(){ } } +pa_stream* AudioInputPulse::CreateAndInitStream(){ + pa_sample_spec sampleSpec{ + .format=PA_SAMPLE_S16LE, + .rate=48000, + .channels=1 + }; + pa_proplist* proplist=pa_proplist_new(); + pa_proplist_sets(proplist, PA_PROP_FILTER_APPLY, ""); // according to PA sources, this disables any possible filters + pa_stream* stream=pa_stream_new_with_proplist(context, "libtgvoip capture", &sampleSpec, NULL, proplist); + pa_proplist_free(proplist); + if(!stream){ + LOGE("Error initializing PulseAudio (pa_stream_new)"); + failed=true; + return NULL; + } + pa_stream_set_state_callback(stream, AudioInputPulse::StreamStateCallback, this); + pa_stream_set_read_callback(stream, AudioInputPulse::StreamReadCallback, this); + return stream; +} + void AudioInputPulse::Start(){ if(failed || isRecording) return; @@ -92,7 +100,9 @@ void AudioInputPulse::SetCurrentDevice(std::string devID){ currentDevice=devID; if(isRecording && isConnected){ pa_stream_disconnect(stream); + pa_stream_unref(stream); isConnected=false; + stream=CreateAndInitStream(); } pa_buffer_attr bufferAttr={ @@ -105,9 +115,12 @@ void AudioInputPulse::SetCurrentDevice(std::string devID){ int streamFlags=PA_STREAM_START_CORKED | PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE | PA_STREAM_ADJUST_LATENCY; int err=pa_stream_connect_record(stream, devID=="default" ? NULL : devID.c_str(), &bufferAttr, (pa_stream_flags_t)streamFlags); - if(err!=0 && devID!="default"){ - SetCurrentDevice("default"); - return; + if(err!=0){ + pa_threaded_mainloop_unlock(mainloop); + /*if(devID!="default"){ + SetCurrentDevice("default"); + return; + }*/ } CHECK_ERROR(err, "pa_stream_connect_record"); @@ -115,6 +128,7 @@ void AudioInputPulse::SetCurrentDevice(std::string devID){ pa_stream_state_t streamState=pa_stream_get_state(stream); if(!PA_STREAM_IS_GOOD(streamState)){ LOGE("Error connecting to audio device '%s'", devID.c_str()); + pa_threaded_mainloop_unlock(mainloop); failed=true; return; } @@ -157,6 +171,10 @@ void AudioInputPulse::StreamReadCallback(pa_stream *stream, size_t requestedByte void AudioInputPulse::StreamReadCallback(pa_stream *stream, size_t requestedBytes) { size_t bytesRemaining = requestedBytes; uint8_t *buffer = NULL; + pa_usec_t latency; + if(pa_stream_get_latency(stream, &latency, NULL)==0){ + estimatedDelay=(int32_t)(latency/100); + } while (bytesRemaining > 0) { size_t bytesToFill = 102400; diff --git a/libtgvoip/os/linux/AudioInputPulse.h b/libtgvoip/os/linux/AudioInputPulse.h index a1e748d..e1d2994 100644 --- a/libtgvoip/os/linux/AudioInputPulse.h +++ b/libtgvoip/os/linux/AudioInputPulse.h @@ -30,6 +30,7 @@ class AudioInputPulse : public AudioInput{ static void StreamStateCallback(pa_stream* s, void* arg); static void StreamReadCallback(pa_stream* stream, size_t requested_bytes, void* userdata); void StreamReadCallback(pa_stream* stream, size_t requestedBytes); + pa_stream* CreateAndInitStream(); pa_threaded_mainloop* mainloop; pa_context* context; diff --git a/libtgvoip/os/linux/AudioOutputALSA.cpp b/libtgvoip/os/linux/AudioOutputALSA.cpp index b4671b1..dd2f436 100644 --- a/libtgvoip/os/linux/AudioOutputALSA.cpp +++ b/libtgvoip/os/linux/AudioOutputALSA.cpp @@ -53,7 +53,7 @@ void AudioOutputALSA::Start(){ return; isPlaying=true; - thread=new Thread(new MethodPointer(&AudioOutputALSA::RunThread, this), NULL); + thread=new Thread(std::bind(&AudioOutputALSA::RunThread, this)); thread->SetName("AudioOutputALSA"); thread->Start(); } @@ -71,7 +71,7 @@ void AudioOutputALSA::Stop(){ bool AudioOutputALSA::IsPlaying(){ return isPlaying; } -void AudioOutputALSA::RunThread(void* arg){ +void AudioOutputALSA::RunThread(){ unsigned char buffer[BUFFER_SIZE*2]; snd_pcm_sframes_t frames; while(isPlaying){ @@ -174,4 +174,4 @@ void AudioOutputALSA::EnumerateDevices(std::vector& devs){ } dlclose(lib); -} \ No newline at end of file +} diff --git a/libtgvoip/os/linux/AudioOutputALSA.h b/libtgvoip/os/linux/AudioOutputALSA.h index 5a712e6..7cf80fb 100644 --- a/libtgvoip/os/linux/AudioOutputALSA.h +++ b/libtgvoip/os/linux/AudioOutputALSA.h @@ -25,7 +25,7 @@ class AudioOutputALSA : public AudioOutput{ static void EnumerateDevices(std::vector& devs); private: - void RunThread(void* arg); + void RunThread(); int (*_snd_pcm_open)(snd_pcm_t** pcm, const char* name, snd_pcm_stream_t stream, int mode); int (*_snd_pcm_set_params)(snd_pcm_t* pcm, snd_pcm_format_t format, snd_pcm_access_t access, unsigned int channels, unsigned int rate, int soft_resample, unsigned int latency); diff --git a/libtgvoip/os/linux/AudioOutputPulse.cpp b/libtgvoip/os/linux/AudioOutputPulse.cpp index cb3fb83..bcdacb7 100644 --- a/libtgvoip/os/linux/AudioOutputPulse.cpp +++ b/libtgvoip/os/linux/AudioOutputPulse.cpp @@ -34,35 +34,38 @@ AudioOutputPulse::AudioOutputPulse(pa_context* context, pa_threaded_mainloop* ma stream=NULL; remainingDataSize=0; - pa_sample_spec sample_specifications{ + pa_threaded_mainloop_lock(mainloop); + stream=CreateAndInitStream(); + pa_threaded_mainloop_unlock(mainloop); + + SetCurrentDevice(devID); +} + +AudioOutputPulse::~AudioOutputPulse(){ + if(stream){ + pa_stream_disconnect(stream); + pa_stream_unref(stream); + } +} + +pa_stream* AudioOutputPulse::CreateAndInitStream(){ + pa_sample_spec sampleSpec{ .format=PA_SAMPLE_S16LE, .rate=48000, .channels=1 }; - - pa_threaded_mainloop_lock(mainloop); pa_proplist* proplist=pa_proplist_new(); pa_proplist_sets(proplist, PA_PROP_FILTER_APPLY, ""); // according to PA sources, this disables any possible filters - stream=pa_stream_new_with_proplist(context, "libtgvoip playback", &sample_specifications, NULL, proplist); + pa_stream* stream=pa_stream_new_with_proplist(context, "libtgvoip playback", &sampleSpec, NULL, proplist); pa_proplist_free(proplist); if(!stream){ LOGE("Error initializing PulseAudio (pa_stream_new)"); - pa_threaded_mainloop_unlock(mainloop); failed=true; - return; + return NULL; } pa_stream_set_state_callback(stream, AudioOutputPulse::StreamStateCallback, this); pa_stream_set_write_callback(stream, AudioOutputPulse::StreamWriteCallback, this); - pa_threaded_mainloop_unlock(mainloop); - - SetCurrentDevice(devID); -} - -AudioOutputPulse::~AudioOutputPulse(){ - if(stream){ - pa_stream_disconnect(stream); - pa_stream_unref(stream); - } + return stream; } void AudioOutputPulse::Start(){ @@ -94,7 +97,9 @@ void AudioOutputPulse::SetCurrentDevice(std::string devID){ currentDevice=devID; if(isPlaying && isConnected){ pa_stream_disconnect(stream); + pa_stream_unref(stream); isConnected=false; + stream=CreateAndInitStream(); } pa_buffer_attr bufferAttr={ @@ -161,6 +166,10 @@ void AudioOutputPulse::StreamWriteCallback(pa_stream *stream, size_t requestedBy if(requestedBytes>sizeof(remainingData)){ requestedBytes=960*2; // force buffer size to 20ms. This probably wrecks the jitter buffer, but still better than crashing } + pa_usec_t latency; + if(pa_stream_get_latency(stream, &latency, NULL)==0){ + estimatedDelay=(int32_t)(latency/100); + } while(requestedBytes>remainingDataSize){ if(isPlaying){ InvokeCallback(remainingData+remainingDataSize, 960*2); diff --git a/libtgvoip/os/linux/AudioOutputPulse.h b/libtgvoip/os/linux/AudioOutputPulse.h index 0d93edc..496cf85 100644 --- a/libtgvoip/os/linux/AudioOutputPulse.h +++ b/libtgvoip/os/linux/AudioOutputPulse.h @@ -28,6 +28,7 @@ class AudioOutputPulse : public AudioOutput{ static void StreamStateCallback(pa_stream* s, void* arg); static void StreamWriteCallback(pa_stream* stream, size_t requested_bytes, void* userdata); void StreamWriteCallback(pa_stream* stream, size_t requestedBytes); + pa_stream* CreateAndInitStream(); pa_threaded_mainloop* mainloop; pa_context* context; diff --git a/libtgvoip/os/linux/AudioPulse.cpp b/libtgvoip/os/linux/AudioPulse.cpp index 4265d35..701d851 100644 --- a/libtgvoip/os/linux/AudioPulse.cpp +++ b/libtgvoip/os/linux/AudioPulse.cpp @@ -61,6 +61,7 @@ DECLARE_DL_FUNCTION(pa_operation_get_state); DECLARE_DL_FUNCTION(pa_proplist_new); DECLARE_DL_FUNCTION(pa_proplist_sets); DECLARE_DL_FUNCTION(pa_proplist_free); +DECLARE_DL_FUNCTION(pa_stream_get_latency); #include "PulseFunctions.h" @@ -118,6 +119,7 @@ bool AudioPulse::Load(){ LOAD_DL_FUNCTION(pa_proplist_new); LOAD_DL_FUNCTION(pa_proplist_sets); LOAD_DL_FUNCTION(pa_proplist_free); + LOAD_DL_FUNCTION(pa_stream_get_latency); loaded=true; return true; @@ -283,4 +285,4 @@ bool AudioPulse::DoOneOperation(std::function f){ } pa_mainloop_iterate(ml, 1, NULL); } -} \ No newline at end of file +} diff --git a/libtgvoip/os/linux/AudioPulse.h b/libtgvoip/os/linux/AudioPulse.h index 395967a..26fb2b7 100644 --- a/libtgvoip/os/linux/AudioPulse.h +++ b/libtgvoip/os/linux/AudioPulse.h @@ -73,6 +73,8 @@ namespace tgvoip{ DECLARE_DL_FUNCTION(pa_proplist_sets); DECLARE_DL_FUNCTION(pa_proplist_free); + DECLARE_DL_FUNCTION(pa_stream_get_latency); + private: static void* lib; static bool loaded; @@ -90,4 +92,4 @@ namespace tgvoip{ #undef DECLARE_DL_FUNCTION -#endif // LIBTGVOIP_PULSEAUDIOLOADER_H \ No newline at end of file +#endif // LIBTGVOIP_PULSEAUDIOLOADER_H diff --git a/libtgvoip/os/linux/PulseAudioLoader.cpp b/libtgvoip/os/linux/PulseAudioLoader.cpp deleted file mode 100644 index d1008e9..0000000 --- a/libtgvoip/os/linux/PulseAudioLoader.cpp +++ /dev/null @@ -1,120 +0,0 @@ -// -// libtgvoip is free and unencumbered public domain software. -// For more information, see http://unlicense.org or the UNLICENSE file -// you should have received with this source code distribution. -// - -#include "PulseAudioLoader.h" -#include -#include "../../logging.h" - -#define DECLARE_DL_FUNCTION(name) typeof(name)* PulseAudioLoader::_import_##name=NULL -#define CHECK_DL_ERROR(res, msg) if(!res){LOGE(msg ": %s", dlerror()); dlclose(lib); return false;} -#define LOAD_DL_FUNCTION(name) {_import_##name=(typeof(_import_##name))dlsym(lib, #name); CHECK_DL_ERROR(_import_##name, "Error getting entry point for " #name);} - -using namespace tgvoip; - -int PulseAudioLoader::refCount=0; -void* PulseAudioLoader::lib=NULL; - -DECLARE_DL_FUNCTION(pa_threaded_mainloop_new); -DECLARE_DL_FUNCTION(pa_threaded_mainloop_get_api); -DECLARE_DL_FUNCTION(pa_context_new); -DECLARE_DL_FUNCTION(pa_context_set_state_callback); -DECLARE_DL_FUNCTION(pa_threaded_mainloop_lock); -DECLARE_DL_FUNCTION(pa_threaded_mainloop_unlock); -DECLARE_DL_FUNCTION(pa_threaded_mainloop_start); -DECLARE_DL_FUNCTION(pa_context_connect); -DECLARE_DL_FUNCTION(pa_context_get_state); -DECLARE_DL_FUNCTION(pa_threaded_mainloop_wait); -DECLARE_DL_FUNCTION(pa_stream_new); -DECLARE_DL_FUNCTION(pa_stream_set_state_callback); -DECLARE_DL_FUNCTION(pa_stream_set_write_callback); -DECLARE_DL_FUNCTION(pa_stream_connect_playback); -DECLARE_DL_FUNCTION(pa_operation_unref); -DECLARE_DL_FUNCTION(pa_stream_cork); -DECLARE_DL_FUNCTION(pa_threaded_mainloop_stop); -DECLARE_DL_FUNCTION(pa_stream_disconnect); -DECLARE_DL_FUNCTION(pa_stream_unref); -DECLARE_DL_FUNCTION(pa_context_disconnect); -DECLARE_DL_FUNCTION(pa_context_unref); -DECLARE_DL_FUNCTION(pa_threaded_mainloop_free); -DECLARE_DL_FUNCTION(pa_threaded_mainloop_signal); -DECLARE_DL_FUNCTION(pa_stream_begin_write); -DECLARE_DL_FUNCTION(pa_stream_write); -DECLARE_DL_FUNCTION(pa_stream_get_state); -DECLARE_DL_FUNCTION(pa_strerror); -DECLARE_DL_FUNCTION(pa_stream_set_read_callback); -DECLARE_DL_FUNCTION(pa_stream_connect_record); -DECLARE_DL_FUNCTION(pa_stream_peek); -DECLARE_DL_FUNCTION(pa_stream_drop); -DECLARE_DL_FUNCTION(pa_mainloop_new); -DECLARE_DL_FUNCTION(pa_mainloop_get_api); -DECLARE_DL_FUNCTION(pa_mainloop_iterate); -DECLARE_DL_FUNCTION(pa_mainloop_free); -DECLARE_DL_FUNCTION(pa_context_get_sink_info_list); -DECLARE_DL_FUNCTION(pa_context_get_source_info_list); -DECLARE_DL_FUNCTION(pa_operation_get_state); - -bool PulseAudioLoader::IncRef(){ - if(refCount==0){ - lib=dlopen("libpulse.so.0", RTLD_LAZY); - if(!lib) - lib=dlopen("libpulse.so", RTLD_LAZY); - if(!lib){ - LOGE("Error loading libpulse: %s", dlerror()); - return false; - } - } - - LOAD_DL_FUNCTION(pa_threaded_mainloop_new); - LOAD_DL_FUNCTION(pa_threaded_mainloop_get_api); - LOAD_DL_FUNCTION(pa_context_new); - LOAD_DL_FUNCTION(pa_context_set_state_callback); - LOAD_DL_FUNCTION(pa_threaded_mainloop_lock); - LOAD_DL_FUNCTION(pa_threaded_mainloop_unlock); - LOAD_DL_FUNCTION(pa_threaded_mainloop_start); - LOAD_DL_FUNCTION(pa_context_connect); - LOAD_DL_FUNCTION(pa_context_get_state); - LOAD_DL_FUNCTION(pa_threaded_mainloop_wait); - LOAD_DL_FUNCTION(pa_stream_new); - LOAD_DL_FUNCTION(pa_stream_set_state_callback); - LOAD_DL_FUNCTION(pa_stream_set_write_callback); - LOAD_DL_FUNCTION(pa_stream_connect_playback); - LOAD_DL_FUNCTION(pa_operation_unref); - LOAD_DL_FUNCTION(pa_stream_cork); - LOAD_DL_FUNCTION(pa_threaded_mainloop_stop); - LOAD_DL_FUNCTION(pa_stream_disconnect); - LOAD_DL_FUNCTION(pa_stream_unref); - LOAD_DL_FUNCTION(pa_context_disconnect); - LOAD_DL_FUNCTION(pa_context_unref); - LOAD_DL_FUNCTION(pa_threaded_mainloop_free); - LOAD_DL_FUNCTION(pa_threaded_mainloop_signal); - LOAD_DL_FUNCTION(pa_stream_begin_write); - LOAD_DL_FUNCTION(pa_stream_write); - LOAD_DL_FUNCTION(pa_stream_get_state); - LOAD_DL_FUNCTION(pa_strerror); - LOAD_DL_FUNCTION(pa_stream_set_read_callback); - LOAD_DL_FUNCTION(pa_stream_connect_record); - LOAD_DL_FUNCTION(pa_stream_peek); - LOAD_DL_FUNCTION(pa_stream_drop); - LOAD_DL_FUNCTION(pa_mainloop_new); - LOAD_DL_FUNCTION(pa_mainloop_get_api); - LOAD_DL_FUNCTION(pa_mainloop_iterate); - LOAD_DL_FUNCTION(pa_mainloop_free); - LOAD_DL_FUNCTION(pa_context_get_sink_info_list); - LOAD_DL_FUNCTION(pa_context_get_source_info_list); - LOAD_DL_FUNCTION(pa_operation_get_state); - - refCount++; - return true; -} - -void PulseAudioLoader::DecRef(){ - if(refCount>0) - refCount--; - if(refCount==0){ - dlclose(lib); - lib=NULL; - } -} \ No newline at end of file diff --git a/libtgvoip/os/linux/PulseAudioLoader.h b/libtgvoip/os/linux/PulseAudioLoader.h deleted file mode 100644 index aa34f09..0000000 --- a/libtgvoip/os/linux/PulseAudioLoader.h +++ /dev/null @@ -1,109 +0,0 @@ -// -// libtgvoip is free and unencumbered public domain software. -// For more information, see http://unlicense.org or the UNLICENSE file -// you should have received with this source code distribution. -// - -#ifndef LIBTGVOIP_PULSEAUDIOLOADER_H -#define LIBTGVOIP_PULSEAUDIOLOADER_H - -#include - -#define DECLARE_DL_FUNCTION(name) static typeof(name)* _import_##name - -namespace tgvoip{ -class PulseAudioLoader{ -public: - static bool IncRef(); - static void DecRef(); - - DECLARE_DL_FUNCTION(pa_threaded_mainloop_new); - DECLARE_DL_FUNCTION(pa_threaded_mainloop_get_api); - DECLARE_DL_FUNCTION(pa_context_new); - DECLARE_DL_FUNCTION(pa_context_set_state_callback); - DECLARE_DL_FUNCTION(pa_threaded_mainloop_lock); - DECLARE_DL_FUNCTION(pa_threaded_mainloop_unlock); - DECLARE_DL_FUNCTION(pa_threaded_mainloop_start); - DECLARE_DL_FUNCTION(pa_context_connect); - DECLARE_DL_FUNCTION(pa_context_get_state); - DECLARE_DL_FUNCTION(pa_threaded_mainloop_wait); - DECLARE_DL_FUNCTION(pa_stream_new); - DECLARE_DL_FUNCTION(pa_stream_set_state_callback); - DECLARE_DL_FUNCTION(pa_stream_set_write_callback); - DECLARE_DL_FUNCTION(pa_stream_connect_playback); - DECLARE_DL_FUNCTION(pa_operation_unref); - DECLARE_DL_FUNCTION(pa_stream_cork); - DECLARE_DL_FUNCTION(pa_threaded_mainloop_stop); - DECLARE_DL_FUNCTION(pa_stream_disconnect); - DECLARE_DL_FUNCTION(pa_stream_unref); - DECLARE_DL_FUNCTION(pa_context_disconnect); - DECLARE_DL_FUNCTION(pa_context_unref); - DECLARE_DL_FUNCTION(pa_threaded_mainloop_free); - DECLARE_DL_FUNCTION(pa_threaded_mainloop_signal); - DECLARE_DL_FUNCTION(pa_stream_begin_write); - DECLARE_DL_FUNCTION(pa_stream_write); - DECLARE_DL_FUNCTION(pa_stream_get_state); - DECLARE_DL_FUNCTION(pa_strerror); - DECLARE_DL_FUNCTION(pa_stream_set_read_callback); - DECLARE_DL_FUNCTION(pa_stream_connect_record); - DECLARE_DL_FUNCTION(pa_stream_peek); - DECLARE_DL_FUNCTION(pa_stream_drop); - - DECLARE_DL_FUNCTION(pa_mainloop_new); - DECLARE_DL_FUNCTION(pa_mainloop_get_api); - DECLARE_DL_FUNCTION(pa_mainloop_iterate); - DECLARE_DL_FUNCTION(pa_mainloop_free); - DECLARE_DL_FUNCTION(pa_context_get_sink_info_list); - DECLARE_DL_FUNCTION(pa_context_get_source_info_list); - DECLARE_DL_FUNCTION(pa_operation_get_state); - -private: - static void* lib; - static int refCount; -}; -} - -#undef DECLARE_DL_FUNCTION - -#ifdef TGVOIP_IN_AUDIO_IO -#define pa_threaded_mainloop_new PulseAudioLoader::_import_pa_threaded_mainloop_new -#define pa_threaded_mainloop_get_api PulseAudioLoader::_import_pa_threaded_mainloop_get_api -#define pa_context_new PulseAudioLoader::_import_pa_context_new -#define pa_context_set_state_callback PulseAudioLoader::_import_pa_context_set_state_callback -#define pa_threaded_mainloop_lock PulseAudioLoader::_import_pa_threaded_mainloop_lock -#define pa_threaded_mainloop_unlock PulseAudioLoader::_import_pa_threaded_mainloop_unlock -#define pa_threaded_mainloop_start PulseAudioLoader::_import_pa_threaded_mainloop_start -#define pa_context_connect PulseAudioLoader::_import_pa_context_connect -#define pa_context_get_state PulseAudioLoader::_import_pa_context_get_state -#define pa_threaded_mainloop_wait PulseAudioLoader::_import_pa_threaded_mainloop_wait -#define pa_stream_new PulseAudioLoader::_import_pa_stream_new -#define pa_stream_set_state_callback PulseAudioLoader::_import_pa_stream_set_state_callback -#define pa_stream_set_write_callback PulseAudioLoader::_import_pa_stream_set_write_callback -#define pa_stream_connect_playback PulseAudioLoader::_import_pa_stream_connect_playback -#define pa_operation_unref PulseAudioLoader::_import_pa_operation_unref -#define pa_stream_cork PulseAudioLoader::_import_pa_stream_cork -#define pa_threaded_mainloop_stop PulseAudioLoader::_import_pa_threaded_mainloop_stop -#define pa_stream_disconnect PulseAudioLoader::_import_pa_stream_disconnect -#define pa_stream_unref PulseAudioLoader::_import_pa_stream_unref -#define pa_context_disconnect PulseAudioLoader::_import_pa_context_disconnect -#define pa_context_unref PulseAudioLoader::_import_pa_context_unref -#define pa_threaded_mainloop_free PulseAudioLoader::_import_pa_threaded_mainloop_free -#define pa_threaded_mainloop_signal PulseAudioLoader::_import_pa_threaded_mainloop_signal -#define pa_stream_begin_write PulseAudioLoader::_import_pa_stream_begin_write -#define pa_stream_write PulseAudioLoader::_import_pa_stream_write -#define pa_strerror PulseAudioLoader::_import_pa_strerror -#define pa_stream_get_state PulseAudioLoader::_import_pa_stream_get_state -#define pa_stream_set_read_callback PulseAudioLoader::_import_pa_stream_set_read_callback -#define pa_stream_connect_record PulseAudioLoader::_import_pa_stream_connect_record -#define pa_stream_peek PulseAudioLoader::_import_pa_stream_peek -#define pa_stream_drop PulseAudioLoader::_import_pa_stream_drop -#define pa_mainloop_new PulseAudioLoader::_import_pa_mainloop_new -#define pa_mainloop_get_api PulseAudioLoader::_import_pa_mainloop_get_api -#define pa_mainloop_iterate PulseAudioLoader::_import_pa_mainloop_iterate -#define pa_mainloop_free PulseAudioLoader::_import_pa_mainloop_free -#define pa_context_get_sink_info_list PulseAudioLoader::_import_pa_context_get_sink_info_list -#define pa_context_get_source_info_list PulseAudioLoader::_import_pa_context_get_source_info_list -#define pa_operation_get_state PulseAudioLoader::_import_pa_operation_get_state -#endif - -#endif // LIBTGVOIP_PULSEAUDIOLOADER_H \ No newline at end of file diff --git a/libtgvoip/os/linux/PulseFunctions.h b/libtgvoip/os/linux/PulseFunctions.h index a71a87d..9e754f9 100644 --- a/libtgvoip/os/linux/PulseFunctions.h +++ b/libtgvoip/os/linux/PulseFunctions.h @@ -43,5 +43,6 @@ #define pa_proplist_new AudioPulse::_import_pa_proplist_new #define pa_proplist_sets AudioPulse::_import_pa_proplist_sets #define pa_proplist_free AudioPulse::_import_pa_proplist_free +#define pa_stream_get_latency AudioPulse::_import_pa_stream_get_latency -#endif //LIBTGVOIP_PULSE_FUNCTIONS_H \ No newline at end of file +#endif //LIBTGVOIP_PULSE_FUNCTIONS_H diff --git a/libtgvoip/os/posix/NetworkSocketPosix.cpp b/libtgvoip/os/posix/NetworkSocketPosix.cpp index 78e48a4..26289d5 100644 --- a/libtgvoip/os/posix/NetworkSocketPosix.cpp +++ b/libtgvoip/os/posix/NetworkSocketPosix.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include "../../logging.h" @@ -45,11 +46,20 @@ NetworkSocketPosix::NetworkSocketPosix(NetworkProtocol protocol) : NetworkSocket tcpConnectedAddress=NULL; tcpConnectedPort=0; + + if(protocol==PROTO_TCP) + timeout=10.0; + lastSuccessfulOperationTime=VoIPController::GetCurrentTime(); } NetworkSocketPosix::~NetworkSocketPosix(){ + if(fd>=0){ + Close(); + } if(tcpConnectedAddress) delete tcpConnectedAddress; + if(pendingOutgoingPacket) + delete pendingOutgoingPacket; } void NetworkSocketPosix::SetMaxPriority(){ @@ -60,12 +70,12 @@ void NetworkSocketPosix::SetMaxPriority(){ LOGE("error setting darwin-specific net priority: %d / %s", errno, strerror(errno)); } #elif defined(__linux__) - int prio=5; + int prio=6; int res=setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &prio, sizeof(prio)); if(res<0){ LOGE("error setting priority: %d / %s", errno, strerror(errno)); } - prio=6 << 5; + prio=46 << 2; res=setsockopt(fd, SOL_IP, IP_TOS, &prio, sizeof(prio)); if(res<0){ LOGE("error setting ip tos: %d / %s", errno, strerror(errno)); @@ -137,19 +147,55 @@ void NetworkSocketPosix::Send(NetworkPacket *packet){ addr.sin6_family=AF_INET6; } addr.sin6_port=htons(packet->port); - res=sendto(fd, packet->data, packet->length, 0, (const sockaddr *) &addr, sizeof(addr)); + res=(int)sendto(fd, packet->data, packet->length, 0, (const sockaddr *) &addr, sizeof(addr)); }else{ - res=send(fd, packet->data, packet->length, 0); + res=(int)send(fd, packet->data, packet->length, 0); } - if(res<0){ - LOGE("error sending: %d / %s", errno, strerror(errno)); - if(errno==ENETUNREACH && !isV4Available && VoIPController::GetCurrentTime()length); + pendingOutgoingPacket->CopyFrom(packet->data, 0, packet->length); + readyToSend=false; + } + }else{ + LOGE("error sending: %d / %s", errno, strerror(errno)); + if(errno==ENETUNREACH && !isV4Available && VoIPController::GetCurrentTime()length && packet->protocol==PROTO_TCP){ + if(pendingOutgoingPacket){ + LOGE("send returned less than packet length but there's already a pending packet"); + failed=true; + }else{ + LOGV("Socket %d not ready to send", fd); + pendingOutgoingPacket=new Buffer(packet->length-res); + pendingOutgoingPacket->CopyFrom(packet->data+res, 0, packet->length-res); + readyToSend=false; } } } +bool NetworkSocketPosix::OnReadyToSend(){ + if(pendingOutgoingPacket){ + NetworkPacket pkt={0}; + pkt.data=**pendingOutgoingPacket; + pkt.length=pendingOutgoingPacket->Length(); + Send(&pkt); + delete pendingOutgoingPacket; + pendingOutgoingPacket=NULL; + return false; + } + readyToSend=true; + return true; +} + void NetworkSocketPosix::Receive(NetworkPacket *packet){ if(failed){ packet->length=0; @@ -182,7 +228,7 @@ void NetworkSocketPosix::Receive(NetworkPacket *packet){ packet->protocol=PROTO_UDP; packet->port=ntohs(srcAddr.sin6_port); }else if(protocol==PROTO_TCP){ - int res=recv(fd, packet->data, packet->length, 0); + int res=(int)recv(fd, packet->data, packet->length, 0); if(res<=0){ LOGE("Error receiving from TCP socket: %d / %s", errno, strerror(errno)); failed=true; @@ -214,6 +260,7 @@ void NetworkSocketPosix::Open(){ } SetMaxPriority(); + fcntl(fd, F_SETFL, O_NONBLOCK); int tries=0; sockaddr_in6 addr; @@ -261,12 +308,12 @@ void NetworkSocketPosix::Close(){ } } -void NetworkSocketPosix::Connect(NetworkAddress *address, uint16_t port){ - IPv4Address* v4addr=dynamic_cast(address); - IPv6Address* v6addr=dynamic_cast(address); - sockaddr_in v4; - sockaddr_in6 v6; - sockaddr* addr=NULL; +void NetworkSocketPosix::Connect(const NetworkAddress *address, uint16_t port){ + const IPv4Address* v4addr=dynamic_cast(address); + const IPv6Address* v6addr=dynamic_cast(address); + struct sockaddr_in v4={0}; + struct sockaddr_in6 v6={0}; + struct sockaddr* addr=NULL; size_t addrLen=0; if(v4addr){ v4.sin_family=AF_INET; @@ -301,8 +348,9 @@ void NetworkSocketPosix::Connect(NetworkAddress *address, uint16_t port){ setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)); timeout.tv_sec=60; setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); - int res=connect(fd, (const sockaddr*) addr, addrLen); - if(res!=0){ + fcntl(fd, F_SETFL, O_NONBLOCK); + int res=(int)connect(fd, (const sockaddr*) addr, (socklen_t)addrLen); + if(res!=0 && errno!=EINVAL && errno!=EINPROGRESS){ LOGW("error connecting TCP socket to %s:%u: %d / %s; %d / %s", address->ToString().c_str(), port, res, strerror(res), errno, strerror(errno)); close(fd); failed=true; @@ -337,9 +385,11 @@ std::string NetworkSocketPosix::GetLocalInterfaceInfo(IPv4Address *v4addr, IPv6A jstring jitfName=static_cast(env->GetObjectArrayElement(jinfo, 0)); jstring jipv4=static_cast(env->GetObjectArrayElement(jinfo, 1)); jstring jipv6=static_cast(env->GetObjectArrayElement(jinfo, 2)); - const char* itfchars=env->GetStringUTFChars(jitfName, NULL); - name=std::string(itfchars); - env->ReleaseStringUTFChars(jitfName, itfchars); + if(jitfName){ + const char *itfchars=env->GetStringUTFChars(jitfName, NULL); + name=std::string(itfchars); + env->ReleaseStringUTFChars(jitfName, itfchars); + } if(v4addr && jipv4){ const char* ipchars=env->GetStringUTFChars(jipv4, NULL); @@ -404,7 +454,7 @@ std::string NetworkSocketPosix::V4AddressToString(uint32_t address){ return std::string(buf); } -std::string NetworkSocketPosix::V6AddressToString(unsigned char *address){ +std::string NetworkSocketPosix::V6AddressToString(const unsigned char *address){ char buf[INET6_ADDRSTRLEN]; in6_addr addr; memcpy(addr.s6_addr, address, 16); @@ -461,10 +511,12 @@ void NetworkSocketPosix::SetTimeouts(int sendTimeout, int recvTimeout){ setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); } -bool NetworkSocketPosix::Select(std::vector &readFds, std::vector &errorFds, SocketSelectCanceller* _canceller){ +bool NetworkSocketPosix::Select(std::vector &readFds, std::vector& writeFds, std::vector &errorFds, SocketSelectCanceller* _canceller){ fd_set readSet; + fd_set writeSet; fd_set errorSet; FD_ZERO(&readSet); + FD_ZERO(&writeSet); FD_ZERO(&errorSet); SocketSelectCancellerPosix* canceller=dynamic_cast(_canceller); if(canceller) @@ -472,8 +524,8 @@ bool NetworkSocketPosix::Select(std::vector &readFds, std::vect int maxfd=canceller ? canceller->pipeRead : 0; - for(std::vector::iterator itr=readFds.begin();itr!=readFds.end();++itr){ - int sfd=GetDescriptorFromSocket(*itr); + for(NetworkSocket*& s:readFds){ + int sfd=GetDescriptorFromSocket(s); if(sfd==0){ LOGW("can't select on one of sockets because it's not a NetworkSocketPosix instance"); continue; @@ -483,21 +535,36 @@ bool NetworkSocketPosix::Select(std::vector &readFds, std::vect maxfd=sfd; } + for(NetworkSocket*& s:writeFds){ + int sfd=GetDescriptorFromSocket(s); + if(sfd==0){ + LOGW("can't select on one of sockets because it's not a NetworkSocketPosix instance"); + continue; + } + FD_SET(sfd, &writeSet); + if(maxfd::iterator itr=errorFds.begin();itr!=errorFds.end();++itr){ - int sfd=GetDescriptorFromSocket(*itr); + for(NetworkSocket*& s:errorFds){ + int sfd=GetDescriptorFromSocket(s); if(sfd==0){ LOGW("can't select on one of sockets because it's not a NetworkSocketPosix instance"); continue; } - anyFailed |= (*itr)->IsFailed(); + if(s->timeout>0 && VoIPController::GetCurrentTime()-s->lastSuccessfulOperationTime>s->timeout){ + LOGW("Socket %d timed out", sfd); + s->failed=true; + } + anyFailed |= s->IsFailed(); FD_SET(sfd, &errorSet); if(maxfdpipeRead, &readSet) && !anyFailed){ char c; @@ -505,19 +572,36 @@ bool NetworkSocketPosix::Select(std::vector &readFds, std::vect return false; }else if(anyFailed){ FD_ZERO(&readSet); - FD_ZERO(&errorSet); + FD_ZERO(&writeSet); } std::vector::iterator itr=readFds.begin(); while(itr!=readFds.end()){ int sfd=GetDescriptorFromSocket(*itr); - if(sfd==0 || !FD_ISSET(sfd, &readSet)){ + if(FD_ISSET(sfd, &readSet)) + (*itr)->lastSuccessfulOperationTime=VoIPController::GetCurrentTime(); + if(sfd==0 || !FD_ISSET(sfd, &readSet) || !(*itr)->OnReadyToReceive()){ itr=readFds.erase(itr); }else{ ++itr; } } + itr=writeFds.begin(); + while(itr!=writeFds.end()){ + int sfd=GetDescriptorFromSocket(*itr); + if(sfd==0 || !FD_ISSET(sfd, &writeSet)){ + itr=writeFds.erase(itr); + }else{ + LOGV("Socket %d is ready to send", sfd); + (*itr)->lastSuccessfulOperationTime=VoIPController::GetCurrentTime(); + if((*itr)->OnReadyToSend()) + ++itr; + else + itr=writeFds.erase(itr); + } + } + itr=errorFds.begin(); while(itr!=errorFds.end()){ int sfd=GetDescriptorFromSocket(*itr); @@ -527,9 +611,9 @@ bool NetworkSocketPosix::Select(std::vector &readFds, std::vect ++itr; } } - //LOGV("select fds left: read=%d, error=%d", readFds.size(), errorFds.size()); + //LOGV("select fds left: read=%d, write=%d, error=%d", (int)readFds.size(), (int)writeFds.size(), (int)errorFds.size()); - return readFds.size()>0 || errorFds.size()>0; + return readFds.size()>0 || errorFds.size()>0 || writeFds.size()>0; } SocketSelectCancellerPosix::SocketSelectCancellerPosix(){ diff --git a/libtgvoip/os/posix/NetworkSocketPosix.h b/libtgvoip/os/posix/NetworkSocketPosix.h index 86dbe31..1a9b0fc 100644 --- a/libtgvoip/os/posix/NetworkSocketPosix.h +++ b/libtgvoip/os/posix/NetworkSocketPosix.h @@ -8,6 +8,7 @@ #define LIBTGVOIP_NETWORKSOCKETPOSIX_H #include "../../NetworkSocket.h" +#include "../../Buffers.h" #include #include #include @@ -29,30 +30,31 @@ class NetworkSocketPosix : public NetworkSocket{ public: NetworkSocketPosix(NetworkProtocol protocol); virtual ~NetworkSocketPosix(); - virtual void Send(NetworkPacket* packet); - virtual void Receive(NetworkPacket* packet); - virtual void Open(); - virtual void Close(); - virtual void Connect(NetworkAddress* address, uint16_t port); - virtual std::string GetLocalInterfaceInfo(IPv4Address* v4addr, IPv6Address* v6addr); - virtual void OnActiveInterfaceChanged(); - virtual uint16_t GetLocalPort(); + virtual void Send(NetworkPacket* packet) override; + virtual void Receive(NetworkPacket* packet) override; + virtual void Open() override; + virtual void Close() override; + virtual void Connect(const NetworkAddress* address, uint16_t port) override; + virtual std::string GetLocalInterfaceInfo(IPv4Address* v4addr, IPv6Address* v6addr) override; + virtual void OnActiveInterfaceChanged() override; + virtual uint16_t GetLocalPort() override; static std::string V4AddressToString(uint32_t address); - static std::string V6AddressToString(unsigned char address[16]); + static std::string V6AddressToString(const unsigned char address[16]); static uint32_t StringToV4Address(std::string address); static void StringToV6Address(std::string address, unsigned char* out); static IPv4Address* ResolveDomainName(std::string name); - static bool Select(std::vector& readFds, std::vector& errorFds, SocketSelectCanceller* canceller); + static bool Select(std::vector& readFds, std::vector& writeFds, std::vector& errorFds, SocketSelectCanceller* canceller); - virtual NetworkAddress *GetConnectedAddress(); + virtual NetworkAddress *GetConnectedAddress() override; - virtual uint16_t GetConnectedPort(); + virtual uint16_t GetConnectedPort() override; - virtual void SetTimeouts(int sendTimeout, int recvTimeout); + virtual void SetTimeouts(int sendTimeout, int recvTimeout) override; + virtual bool OnReadyToSend() override; protected: - virtual void SetMaxPriority(); + virtual void SetMaxPriority() override; private: static int GetDescriptorFromSocket(NetworkSocket* socket); @@ -67,6 +69,7 @@ class NetworkSocketPosix : public NetworkSocket{ IPv6Address lastRecvdV6; NetworkAddress* tcpConnectedAddress; uint16_t tcpConnectedPort; + Buffer* pendingOutgoingPacket=NULL; }; } diff --git a/libtgvoip/os/windows/AudioInputWASAPI.cpp b/libtgvoip/os/windows/AudioInputWASAPI.cpp old mode 100644 new mode 100755 index af2881b..eaae393 --- a/libtgvoip/os/windows/AudioInputWASAPI.cpp +++ b/libtgvoip/os/windows/AudioInputWASAPI.cpp @@ -31,7 +31,9 @@ AudioInputWASAPI::AudioInputWASAPI(std::string deviceID){ refCount=1; HRESULT res; res=CoInitializeEx(NULL, COINIT_MULTITHREADED); - CHECK_RES(res, "CoInitializeEx"); + if(FAILED(res) && res!=RPC_E_CHANGED_MODE){ + CHECK_RES(res, "CoInitializeEx"); + } #ifdef TGVOIP_WINXP_COMPAT HANDLE (WINAPI *__CreateEventExA)(LPSECURITY_ATTRIBUTES lpEventAttributes, LPCSTR lpName, DWORD dwFlags, DWORD dwDesiredAccess); __CreateEventExA=(HANDLE (WINAPI *)(LPSECURITY_ATTRIBUTES, LPCSTR, DWORD, DWORD))GetProcAddress(GetModuleHandleA("kernel32.dll"), "CreateEventExA"); @@ -124,7 +126,9 @@ void AudioInputWASAPI::EnumerateDevices(std::vector& d #ifdef TGVOIP_WINDOWS_DESKTOP HRESULT res; res=CoInitializeEx(NULL, COINIT_MULTITHREADED); - SCHECK_RES(res, "CoInitializeEx"); + if(FAILED(res) && res!=RPC_E_CHANGED_MODE){ + SCHECK_RES(res, "CoInitializeEx"); + } IMMDeviceEnumerator *deviceEnumerator = NULL; IMMDeviceCollection *deviceCollection = NULL; @@ -261,6 +265,12 @@ void AudioInputWASAPI::ActuallySetCurrentDevice(std::string deviceID){ CHECK_RES(res, "device->Activate"); #else Platform::String^ defaultDevID=Windows::Media::Devices::MediaDevice::GetDefaultAudioCaptureId(Windows::Media::Devices::AudioDeviceRole::Communications); + if(defaultDevID == nullptr){ + LOGE("Didn't find capture device; failing"); + failed=true; + return; + } + HRESULT res1, res2; IAudioClient2* audioClient2=WindowsSandboxUtils::ActivateAudioDevice(defaultDevID->Data(), &res1, &res2); CHECK_RES(res1, "activate1"); @@ -274,11 +284,11 @@ void AudioInputWASAPI::ActuallySetCurrentDevice(std::string deviceID){ audioClient=audioClient2; #endif - - + // {2C693079-3F59-49FD-964F-61C005EAA5D3} const GUID guid = { 0x2c693079, 0x3f59, 0x49fd, { 0x96, 0x4f, 0x61, 0xc0, 0x5, 0xea, 0xa5, 0xd3 } }; - res = audioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST | 0x80000000/*AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM*/, 60 * 10000, 0, &format, &guid); + // Use 1000ms buffer to avoid resampling glitches on Windows 8.1 and older. This should not increase latency. + res = audioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST | AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY, 1000*10000, 0, &format, &guid); CHECK_RES(res, "audioClient->Initialize"); uint32_t bufSize; @@ -286,12 +296,12 @@ void AudioInputWASAPI::ActuallySetCurrentDevice(std::string deviceID){ CHECK_RES(res, "audioClient->GetBufferSize"); LOGV("buffer size: %u", bufSize); - REFERENCE_TIME latency; + estimatedDelay=0; + REFERENCE_TIME latency, devicePeriod; if(SUCCEEDED(audioClient->GetStreamLatency(&latency))){ - estimatedDelay=latency ? latency/10000 : 60; - LOGD("capture latency: %d", estimatedDelay); - }else{ - estimatedDelay=60; + if(SUCCEEDED(audioClient->GetDevicePeriod(&devicePeriod, NULL))){ + estimatedDelay=(int32_t)(latency/10000+devicePeriod/10000); + } } res = audioClient->SetEventHandle(audioSamplesReadyEvent); @@ -330,7 +340,7 @@ void AudioInputWASAPI::RunThread() { CHECK_RES(res, "CoInitializeEx in capture thread"); uint32_t bufferSize=0; - uint32_t framesWritten=0; + uint64_t framesWritten=0; bool running=true; //double prevCallback=VoIPController::GetCurrentTime(); @@ -352,7 +362,7 @@ void AudioInputWASAPI::RunThread() { res=captureClient->GetNextPacketSize(&bufferSize); CHECK_RES(res, "captureClient->GetNextPacketSize"); BYTE* data; - uint32_t framesAvailable=bufferSize; + uint32_t framesAvailable=0; DWORD flags; res=captureClient->GetBuffer(&data, &framesAvailable, &flags, NULL, NULL); @@ -360,8 +370,12 @@ void AudioInputWASAPI::RunThread() { size_t dataLen=framesAvailable*2; assert(remainingDataLen+dataLen960*2){ if(isRecording) InvokeCallback(remainingData, 960*2); + //LOGV("remaining data len %u", remainingDataLen); memmove(remainingData, remainingData+(960*2), remainingDataLen-960*2); remainingDataLen-=960*2; @@ -376,6 +391,7 @@ void AudioInputWASAPI::RunThread() { res=captureClient->ReleaseBuffer(framesAvailable); CHECK_RES(res, "captureClient->ReleaseBuffer"); + //estimatedDelay=(int32_t)((devicePosition-framesWritten)/48); framesWritten+=framesAvailable; } diff --git a/libtgvoip/os/windows/AudioInputWASAPI.h b/libtgvoip/os/windows/AudioInputWASAPI.h old mode 100644 new mode 100755 index 899c98b..b92ef25 --- a/libtgvoip/os/windows/AudioInputWASAPI.h +++ b/libtgvoip/os/windows/AudioInputWASAPI.h @@ -64,8 +64,8 @@ class AudioInputWASAPI : public AudioInput{ HANDLE audioSamplesReadyEvent; HANDLE streamSwitchEvent; HANDLE thread; - IAudioClient* audioClient; - IAudioCaptureClient* captureClient; + IAudioClient* audioClient=NULL; + IAudioCaptureClient* captureClient=NULL; #ifdef TGVOIP_WINDOWS_DESKTOP IMMDeviceEnumerator* enumerator; IAudioSessionControl* audioSessionControl; diff --git a/libtgvoip/os/windows/AudioOutputWASAPI.cpp b/libtgvoip/os/windows/AudioOutputWASAPI.cpp index 6459c87..81734e4 100755 --- a/libtgvoip/os/windows/AudioOutputWASAPI.cpp +++ b/libtgvoip/os/windows/AudioOutputWASAPI.cpp @@ -35,7 +35,9 @@ AudioOutputWASAPI::AudioOutputWASAPI(std::string deviceID){ refCount=1; HRESULT res; res=CoInitializeEx(NULL, COINIT_MULTITHREADED); - CHECK_RES(res, "CoInitializeEx"); + if(FAILED(res) && res!=RPC_E_CHANGED_MODE){ + CHECK_RES(res, "CoInitializeEx"); + } #ifdef TGVOIP_WINXP_COMPAT HANDLE (WINAPI *__CreateEventExA)(LPSECURITY_ATTRIBUTES lpEventAttributes, LPCSTR lpName, DWORD dwFlags, DWORD dwDesiredAccess); __CreateEventExA=(HANDLE (WINAPI *)(LPSECURITY_ATTRIBUTES, LPCSTR, DWORD, DWORD))GetProcAddress(GetModuleHandleA("kernel32.dll"), "CreateEventExA"); @@ -120,7 +122,9 @@ void AudioOutputWASAPI::EnumerateDevices(std::vector& #ifdef TGVOIP_WINDOWS_DESKTOP HRESULT res; res=CoInitializeEx(NULL, COINIT_MULTITHREADED); - SCHECK_RES(res, "CoInitializeEx"); + if(FAILED(res) && res!=RPC_E_CHANGED_MODE){ + SCHECK_RES(res, "CoInitializeEx"); + } IMMDeviceEnumerator *deviceEnumerator = NULL; IMMDeviceCollection *deviceCollection = NULL; @@ -257,6 +261,12 @@ void AudioOutputWASAPI::ActuallySetCurrentDevice(std::string deviceID){ CHECK_RES(res, "device->Activate"); #else Platform::String^ defaultDevID=Windows::Media::Devices::MediaDevice::GetDefaultAudioRenderId(Windows::Media::Devices::AudioDeviceRole::Communications); + if(defaultDevID==nullptr){ + LOGE("Didn't find playback device; failing"); + failed=true; + return; + } + HRESULT res1, res2; IAudioClient2* audioClient2=WindowsSandboxUtils::ActivateAudioDevice(defaultDevID->Data(), &res1, &res2); CHECK_RES(res1, "activate1"); @@ -273,7 +283,7 @@ void AudioOutputWASAPI::ActuallySetCurrentDevice(std::string deviceID){ // {2C693079-3F59-49FD-964F-61C005EAA5D3} const GUID guid = { 0x2c693079, 0x3f59, 0x49fd, { 0x96, 0x4f, 0x61, 0xc0, 0x5, 0xea, 0xa5, 0xd3 } }; - res = audioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST | 0x80000000/*AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM*/, 60 * 10000, 0, &format, &guid); + res = audioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST | AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY, 60 * 10000, 0, &format, &guid); CHECK_RES(res, "audioClient->Initialize"); uint32_t bufSize; @@ -281,12 +291,12 @@ void AudioOutputWASAPI::ActuallySetCurrentDevice(std::string deviceID){ CHECK_RES(res, "audioClient->GetBufferSize"); LOGV("buffer size: %u", bufSize); - REFERENCE_TIME latency; + estimatedDelay=0; + REFERENCE_TIME latency, devicePeriod; if(SUCCEEDED(audioClient->GetStreamLatency(&latency))){ - estimatedDelay=latency ? latency/10000 : 60; - LOGD("playback latency: %d", estimatedDelay); - }else{ - estimatedDelay=60; + if(SUCCEEDED(audioClient->GetDevicePeriod(&devicePeriod, NULL))){ + estimatedDelay=(int32_t)(latency/10000+devicePeriod/10000); + } } res = audioClient->SetEventHandle(audioSamplesReadyEvent); @@ -330,7 +340,7 @@ void AudioOutputWASAPI::RunThread() { uint32_t bufferSize; res=audioClient->GetBufferSize(&bufferSize); CHECK_RES(res, "audioClient->GetBufferSize"); - uint32_t framesWritten=0; + uint64_t framesWritten=0; bool running=true; //double prevCallback=VoIPController::GetCurrentTime(); @@ -348,6 +358,7 @@ void AudioOutputWASAPI::RunThread() { }else if(waitResult==WAIT_OBJECT_0+2){ // audioSamplesReadyEvent if(!audioClient) continue; + BYTE* data; uint32_t padding; uint32_t framesAvailable; diff --git a/libtgvoip/os/windows/AudioOutputWASAPI.h b/libtgvoip/os/windows/AudioOutputWASAPI.h old mode 100644 new mode 100755 index 81236d1..f3b9d55 --- a/libtgvoip/os/windows/AudioOutputWASAPI.h +++ b/libtgvoip/os/windows/AudioOutputWASAPI.h @@ -63,8 +63,8 @@ class AudioOutputWASAPI : public AudioOutput{ HANDLE audioSamplesReadyEvent; HANDLE streamSwitchEvent; HANDLE thread; - IAudioClient* audioClient; - IAudioRenderClient* renderClient; + IAudioClient* audioClient=NULL; + IAudioRenderClient* renderClient=NULL; #ifdef TGVOIP_WINDOWS_DESKTOP IMMDeviceEnumerator* enumerator; IAudioSessionControl* audioSessionControl; diff --git a/libtgvoip/os/windows/CXWrapper.cpp b/libtgvoip/os/windows/CXWrapper.cpp index 2738fba..a4d3427 100755 --- a/libtgvoip/os/windows/CXWrapper.cpp +++ b/libtgvoip/os/windows/CXWrapper.cpp @@ -39,11 +39,14 @@ VoIPControllerWrapper::VoIPControllerWrapper(){ MicrosoftCryptoImpl::Init(); controller=new VoIPController(); controller->implData=(void*)this; - controller->SetStateCallback(VoIPControllerWrapper::OnStateChanged); - controller->SetSignalBarsCountCallback(VoIPControllerWrapper::OnSignalBarsChanged); + VoIPController::Callbacks callbacks={0}; + callbacks.connectionStateChanged=VoIPControllerWrapper::OnStateChanged; + callbacks.signalBarCountChanged=VoIPControllerWrapper::OnSignalBarsChanged; + controller->SetCallbacks(callbacks); } VoIPControllerWrapper::~VoIPControllerWrapper(){ + controller->Stop(); delete controller; } @@ -55,14 +58,14 @@ void VoIPControllerWrapper::Connect(){ controller->Connect(); } -void VoIPControllerWrapper::SetPublicEndpoints(const Platform::Array^ endpoints, bool allowP2P){ +void VoIPControllerWrapper::SetPublicEndpoints(const Platform::Array^ endpoints, bool allowP2P, int32_t connectionMaxLayer){ std::vector eps; - for (int i = 0; i < endpoints->Length; i++) + for (unsigned int i = 0; i < endpoints->Length; i++) { libtgvoip::Endpoint^ _ep = endpoints[i]; tgvoip::Endpoint ep; ep.id = _ep->id; - ep.type = Endpoint::TYPE_UDP_RELAY; + ep.type = tgvoip::Endpoint::Type::UDP_RELAY; char buf[128]; if (_ep->ipv4){ WideCharToMultiByte(CP_UTF8, 0, _ep->ipv4->Data(), -1, buf, sizeof(buf), NULL, NULL); @@ -78,7 +81,7 @@ void VoIPControllerWrapper::SetPublicEndpoints(const Platform::ArraypeerTag->Data, 16); eps.push_back(ep); } - controller->SetRemoteEndpoints(eps, allowP2P); + controller->SetRemoteEndpoints(eps, allowP2P, connectionMaxLayer); } void VoIPControllerWrapper::SetNetworkType(NetworkType type){ @@ -99,12 +102,35 @@ void VoIPControllerWrapper::SetEncryptionKey(const Platform::Array^ key, controller->SetEncryptionKey((char*)key->Data, isOutgoing); } +int VoIPControllerWrapper::GetSignalBarsCount(){ + return controller->GetSignalBarsCount(); +} + +CallState VoIPControllerWrapper::GetConnectionState(){ + return (CallState)controller->GetConnectionState(); +} + +TrafficStats^ VoIPControllerWrapper::GetStats(){ + tgvoip::VoIPController::TrafficStats _stats; + controller->GetStats(&_stats); + + TrafficStats^ stats = ref new TrafficStats(); + stats->bytesSentWifi = _stats.bytesSentWifi; + stats->bytesSentMobile = _stats.bytesSentMobile; + stats->bytesRecvdWifi = _stats.bytesRecvdWifi; + stats->bytesRecvdMobile = _stats.bytesRecvdMobile; + + return stats; +} + Platform::String^ VoIPControllerWrapper::GetDebugString(){ - char abuf[10240]; - controller->GetDebugString(abuf, sizeof(abuf)); - wchar_t wbuf[10240]; - MultiByteToWideChar(CP_UTF8, 0, abuf, -1, wbuf, sizeof(wbuf)); - return ref new Platform::String(wbuf); + std::string log = controller->GetDebugString(); + size_t len = sizeof(wchar_t)*(log.length() + 1); + wchar_t* wlog = (wchar_t*)malloc(len); + MultiByteToWideChar(CP_UTF8, 0, log.c_str(), -1, wlog, len / sizeof(wchar_t)); + Platform::String^ res = ref new Platform::String(wlog); + free(wlog); + return res; } Platform::String^ VoIPControllerWrapper::GetDebugLog(){ @@ -153,12 +179,14 @@ void VoIPControllerWrapper::SetConfig(double initTimeout, double recvTimeout, Da config.enableAGC=enableAGC; config.enableNS=enableNS; if(logFilePath!=nullptr&&!logFilePath->IsEmpty()){ - WideCharToMultiByte(CP_UTF8, 0, logFilePath->Data(), -1, config.logFilePath, sizeof(config.logFilePath), NULL, NULL); + config.logFilePath = wstring(logFilePath->Data()); + //WideCharToMultiByte(CP_UTF8, 0, logFilePath->Data(), -1, config.logFilePath, sizeof(config.logFilePath), NULL, NULL); } - if(statsDumpFilePath!=nullptr&&!statsDumpFilePath->IsEmpty()){ - WideCharToMultiByte(CP_UTF8, 0, statsDumpFilePath->Data(), -1, config.statsDumpFilePath, sizeof(config.statsDumpFilePath), NULL, NULL); + if (statsDumpFilePath != nullptr&&!statsDumpFilePath->IsEmpty()){ + config.statsDumpFilePath = wstring(statsDumpFilePath->Data()); + //WideCharToMultiByte(CP_UTF8, 0, statsDumpFilePath->Data(), -1, config.statsDumpFilePath, sizeof(config.statsDumpFilePath), NULL, NULL); } - controller->SetConfig(&config); + controller->SetConfig(config); } void VoIPControllerWrapper::SetProxy(ProxyProtocol protocol, Platform::String^ address, uint16_t port, Platform::String^ username, Platform::String^ password){ diff --git a/libtgvoip/os/windows/CXWrapper.h b/libtgvoip/os/windows/CXWrapper.h index 3ec0a95..98fdb65 100644 --- a/libtgvoip/os/windows/CXWrapper.h +++ b/libtgvoip/os/windows/CXWrapper.h @@ -18,6 +18,14 @@ namespace libtgvoip{ property Platform::Array^ peerTag; }; + public ref class TrafficStats sealed{ + public: + property uint64_t bytesSentWifi; + property uint64_t bytesRecvdWifi; + property uint64_t bytesSentMobile; + property uint64_t bytesRecvdMobile; + }; + public enum class CallState : int{ WaitInit=1, WaitInitAck, @@ -70,12 +78,15 @@ namespace libtgvoip{ virtual ~VoIPControllerWrapper(); void Start(); void Connect(); - void SetPublicEndpoints(const Platform::Array^ endpoints, bool allowP2P); + void SetPublicEndpoints(const Platform::Array^ endpoints, bool allowP2P, int32_t connectionMaxLayer); void SetNetworkType(NetworkType type); void SetMicMute(bool mute); void SetEncryptionKey(const Platform::Array^ key, bool isOutgoing); void SetConfig(double initTimeout, double recvTimeout, DataSavingMode dataSavingMode, bool enableAEC, bool enableNS, bool enableAGC, Platform::String^ logFilePath, Platform::String^ statsDumpFilePath); void SetProxy(ProxyProtocol protocol, Platform::String^ address, uint16_t port, Platform::String^ username, Platform::String^ password); + int GetSignalBarsCount(); + CallState GetConnectionState(); + TrafficStats^ GetStats(); Platform::String^ GetDebugString(); Platform::String^ GetDebugLog(); Error GetLastError(); diff --git a/libtgvoip/os/windows/NetworkSocketWinsock.cpp b/libtgvoip/os/windows/NetworkSocketWinsock.cpp index a60f8e1..04e0d48 100644 --- a/libtgvoip/os/windows/NetworkSocketWinsock.cpp +++ b/libtgvoip/os/windows/NetworkSocketWinsock.cpp @@ -4,9 +4,9 @@ // you should have received with this source code distribution. // -#include "NetworkSocketWinsock.h" #include #include +#include "NetworkSocketWinsock.h" #if WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP #else @@ -15,6 +15,8 @@ #include #include "../../logging.h" #include "../../VoIPController.h" +#include "WindowsSpecific.h" +#include "../../Buffers.h" using namespace tgvoip; @@ -37,11 +39,17 @@ NetworkSocketWinsock::NetworkSocketWinsock(NetworkProtocol protocol) : NetworkSo WSAStartup(MAKEWORD(2, 2), &wsaData); LOGD("Initialized winsock, version %d.%d", wsaData.wHighVersion, wsaData.wVersion); tcpConnectedAddress=NULL; + + if(protocol==PROTO_TCP) + timeout=10.0; + lastSuccessfulOperationTime=VoIPController::GetCurrentTime(); } NetworkSocketWinsock::~NetworkSocketWinsock(){ if(tcpConnectedAddress) delete tcpConnectedAddress; + if(pendingOutgoingPacket) + delete pendingOutgoingPacket; } void NetworkSocketWinsock::SetMaxPriority(){ @@ -49,7 +57,7 @@ void NetworkSocketWinsock::SetMaxPriority(){ } void NetworkSocketWinsock::Send(NetworkPacket *packet){ - if(!packet || !packet->address){ + if(!packet || (protocol==PROTO_UDP && !packet->address)){ LOGW("tried to send null packet"); return; } @@ -122,12 +130,49 @@ void NetworkSocketWinsock::Send(NetworkPacket *packet){ res=send(fd, (const char*)packet->data, packet->length, 0); } if(res==SOCKET_ERROR){ - LOGE("error sending: %d", WSAGetLastError()); - if(errno==ENETUNREACH && !isV4Available && VoIPController::GetCurrentTime()length); + pendingOutgoingPacket->CopyFrom(packet->data, 0, packet->length); + readyToSend=false; + } + }else{ + LOGE("error sending: %d / %s", error, WindowsSpecific::GetErrorMessage(error).c_str()); + if(error==WSAENETUNREACH && !isV4Available && VoIPController::GetCurrentTime()length && protocol==PROTO_TCP){ + if(pendingOutgoingPacket){ + LOGE("send returned less than packet length but there's already a pending packet"); + failed=true; + }else{ + LOGV("Socket %d not ready to send", fd); + pendingOutgoingPacket=new Buffer(packet->length-res); + pendingOutgoingPacket->CopyFrom(packet->data+res, 0, packet->length-res); + readyToSend=false; + } + } +} + +bool NetworkSocketWinsock::OnReadyToSend(){ + if(pendingOutgoingPacket){ + NetworkPacket pkt={0}; + pkt.data=**pendingOutgoingPacket; + pkt.length=pendingOutgoingPacket->Length(); + Send(&pkt); + delete pendingOutgoingPacket; + pendingOutgoingPacket=NULL; + return false; } + readyToSend=true; + return true; } void NetworkSocketWinsock::Receive(NetworkPacket *packet){ @@ -139,7 +184,8 @@ void NetworkSocketWinsock::Receive(NetworkPacket *packet){ if(res!=SOCKET_ERROR) packet->length=(size_t) res; else{ - LOGE("error receiving %d", WSAGetLastError()); + int error=WSAGetLastError(); + LOGE("error receiving %d / %s", error, WindowsSpecific::GetErrorMessage(error).c_str()); packet->length=0; return; } @@ -176,7 +222,8 @@ void NetworkSocketWinsock::Receive(NetworkPacket *packet){ }else if(protocol==PROTO_TCP){ int res=recv(fd, (char*)packet->data, packet->length, 0); if(res==SOCKET_ERROR){ - LOGE("Error receiving from TCP socket: %d", WSAGetLastError()); + int error=WSAGetLastError(); + LOGE("Error receiving from TCP socket: %d / %s", error, WindowsSpecific::GetErrorMessage(error).c_str()); failed=true; }else{ packet->length=(size_t)res; @@ -208,6 +255,9 @@ void NetworkSocketWinsock::Open(){ } } + u_long one=1; + ioctlsocket(fd, FIONBIO, &one); + SetMaxPriority(); int tries=0; @@ -407,7 +457,7 @@ std::string NetworkSocketWinsock::V4AddressToString(uint32_t address){ return std::string(buf); } -std::string NetworkSocketWinsock::V6AddressToString(unsigned char *address){ +std::string NetworkSocketWinsock::V6AddressToString(const unsigned char *address){ char buf[INET6_ADDRSTRLEN]; sockaddr_in6 addr; ZeroMemory(&addr, sizeof(addr)); @@ -455,9 +505,9 @@ void NetworkSocketWinsock::StringToV6Address(std::string address, unsigned char memcpy(out, addr.sin6_addr.s6_addr, 16); } -void NetworkSocketWinsock::Connect(NetworkAddress *address, uint16_t port){ - IPv4Address* v4addr=dynamic_cast(address); - IPv6Address* v6addr=dynamic_cast(address); +void NetworkSocketWinsock::Connect(const NetworkAddress *address, uint16_t port){ + const IPv4Address* v4addr=dynamic_cast(address); + const IPv6Address* v6addr=dynamic_cast(address); sockaddr_in v4; sockaddr_in6 v6; sockaddr* addr=NULL; @@ -482,11 +532,13 @@ void NetworkSocketWinsock::Connect(NetworkAddress *address, uint16_t port){ return; } fd=socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP); - if(fd==0){ + if(fd==INVALID_SOCKET){ LOGE("Error creating TCP socket: %d", WSAGetLastError()); failed=true; return; } + u_long one=1; + ioctlsocket(fd, FIONBIO, &one); int opt=1; setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&opt, sizeof(opt)); DWORD timeout=5000; @@ -495,10 +547,13 @@ void NetworkSocketWinsock::Connect(NetworkAddress *address, uint16_t port){ setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout)); int res=connect(fd, (const sockaddr*) addr, addrLen); if(res!=0){ - LOGW("error connecting TCP socket to %s:%u: %d", address->ToString().c_str(), port, WSAGetLastError()); - closesocket(fd); - failed=true; - return; + int error=WSAGetLastError(); + if(error!=WSAEINPROGRESS && error!=WSAEWOULDBLOCK){ + LOGW("error connecting TCP socket to %s:%u: %d / %s", address->ToString().c_str(), port, error, WindowsSpecific::GetErrorMessage(error).c_str()); + closesocket(fd); + failed=true; + return; + } } tcpConnectedAddress=v4addr ? (NetworkAddress*)new IPv4Address(*v4addr) : (NetworkAddress*)new IPv6Address(*v6addr); tcpConnectedPort=port; @@ -540,9 +595,10 @@ void NetworkSocketWinsock::SetTimeouts(int sendTimeout, int recvTimeout){ setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout)); } -bool NetworkSocketWinsock::Select(std::vector &readFds, std::vector &errorFds, SocketSelectCanceller* _canceller){ +bool NetworkSocketWinsock::Select(std::vector &readFds, std::vector& writeFds, std::vector &errorFds, SocketSelectCanceller* _canceller){ fd_set readSet; fd_set errorSet; + fd_set writeSet; SocketSelectCancellerWin32* canceller=dynamic_cast(_canceller); timeval timeout={0, 10000}; bool anyFailed=false; @@ -550,6 +606,7 @@ bool NetworkSocketWinsock::Select(std::vector &readFds, std::ve do{ FD_ZERO(&readSet); + FD_ZERO(&writeSet); FD_ZERO(&errorSet); for(std::vector::iterator itr=readFds.begin();itr!=readFds.end();++itr){ @@ -561,6 +618,14 @@ bool NetworkSocketWinsock::Select(std::vector &readFds, std::ve FD_SET(sfd, &readSet); } + for(NetworkSocket*& s:writeFds){ + int sfd=GetDescriptorFromSocket(s); + if(sfd==0){ + LOGW("can't select on one of sockets because it's not a NetworkSocketWinsock instance"); + continue; + } + FD_SET(sfd, &writeSet); + } for(std::vector::iterator itr=errorFds.begin();itr!=errorFds.end();++itr){ int sfd=GetDescriptorFromSocket(*itr); @@ -568,12 +633,16 @@ bool NetworkSocketWinsock::Select(std::vector &readFds, std::ve LOGW("can't select on one of sockets because it's not a NetworkSocketWinsock instance"); continue; } + if((*itr)->timeout>0 && VoIPController::GetCurrentTime()-(*itr)->lastSuccessfulOperationTime>(*itr)->timeout){ + LOGW("Socket %d timed out", sfd); + (*itr)->failed=true; + } anyFailed |= (*itr)->IsFailed(); FD_SET(sfd, &errorSet); } if(canceller && canceller->canceled) break; - res=select(0, &readSet, NULL, &errorSet, &timeout); + res=select(0, &readSet, &writeSet, &errorSet, &timeout); //LOGV("select result %d", res); if(res==SOCKET_ERROR) LOGE("SELECT ERROR %d", WSAGetLastError()); @@ -591,13 +660,29 @@ bool NetworkSocketWinsock::Select(std::vector &readFds, std::ve std::vector::iterator itr=readFds.begin(); while(itr!=readFds.end()){ int sfd=GetDescriptorFromSocket(*itr); - if(sfd==0 || !FD_ISSET(sfd, &readSet)){ + if(FD_ISSET(sfd, &readSet)) + (*itr)->lastSuccessfulOperationTime=VoIPController::GetCurrentTime(); + if(sfd==0 || !FD_ISSET(sfd, &readSet) || !(*itr)->OnReadyToReceive()){ itr=readFds.erase(itr); }else{ ++itr; } } + itr=writeFds.begin(); + while(itr!=writeFds.end()){ + int sfd=GetDescriptorFromSocket(*itr); + if(FD_ISSET(sfd, &writeSet)){ + (*itr)->lastSuccessfulOperationTime=VoIPController::GetCurrentTime(); + LOGI("Socket %d is ready to send", sfd); + } + if(sfd==0 || !FD_ISSET(sfd, &writeSet) || !(*itr)->OnReadyToSend()){ + itr=writeFds.erase(itr); + }else{ + ++itr; + } + } + itr=errorFds.begin(); while(itr!=errorFds.end()){ int sfd=GetDescriptorFromSocket(*itr); diff --git a/libtgvoip/os/windows/NetworkSocketWinsock.h b/libtgvoip/os/windows/NetworkSocketWinsock.h index 101b792..6e94b4f 100644 --- a/libtgvoip/os/windows/NetworkSocketWinsock.h +++ b/libtgvoip/os/windows/NetworkSocketWinsock.h @@ -12,6 +12,7 @@ #include namespace tgvoip { +class Buffer; class SocketSelectCancellerWin32 : public SocketSelectCanceller{ friend class NetworkSocketWinsock; @@ -34,20 +35,18 @@ class NetworkSocketWinsock : public NetworkSocket{ virtual std::string GetLocalInterfaceInfo(IPv4Address* v4addr, IPv6Address* v6addr); virtual void OnActiveInterfaceChanged(); virtual uint16_t GetLocalPort(); - virtual void Connect(NetworkAddress* address, uint16_t port); + virtual void Connect(const NetworkAddress* address, uint16_t port); static std::string V4AddressToString(uint32_t address); - static std::string V6AddressToString(unsigned char address[16]); + static std::string V6AddressToString(const unsigned char address[16]); static uint32_t StringToV4Address(std::string address); static void StringToV6Address(std::string address, unsigned char* out); static IPv4Address* ResolveDomainName(std::string name); - static bool Select(std::vector& readFds, std::vector& errorFds, SocketSelectCanceller* canceller); - + static bool Select(std::vector& readFds, std::vector& writeFds, std::vector& errorFds, SocketSelectCanceller* canceller); virtual NetworkAddress *GetConnectedAddress(); - virtual uint16_t GetConnectedPort(); - virtual void SetTimeouts(int sendTimeout, int recvTimeout); + virtual bool OnReadyToSend() override; protected: virtual void SetMaxPriority(); @@ -65,6 +64,7 @@ class NetworkSocketWinsock : public NetworkSocket{ bool closing; NetworkAddress* tcpConnectedAddress; uint16_t tcpConnectedPort; + Buffer* pendingOutgoingPacket=NULL; }; } diff --git a/libtgvoip/os/windows/WindowsSandboxUtils.h b/libtgvoip/os/windows/WindowsSandboxUtils.h index 54654f7..aeddca0 100644 --- a/libtgvoip/os/windows/WindowsSandboxUtils.h +++ b/libtgvoip/os/windows/WindowsSandboxUtils.h @@ -1,10 +1,12 @@ - // // libtgvoip is free and unencumbered public domain software. // For more information, see http://unlicense.org or the UNLICENSE file // you should have received with this source code distribution. // +#ifndef LIBTGVOIP_WINDOWS_SANDBOX_UTILS +#define LIBTGVOIP_WINDOWS_SANDBOX_UTILS + #include #include #ifndef TGVOIP_WP_SILVERLIGHT @@ -36,3 +38,5 @@ namespace tgvoip { static IAudioClient2* ActivateAudioDevice(const wchar_t* devID, HRESULT* callResult, HRESULT* actResult); }; } + +#endif // LIBTGVOIP_WINDOWS_SANDBOX_UTILS diff --git a/libtgvoip/os/windows/WindowsSpecific.cpp b/libtgvoip/os/windows/WindowsSpecific.cpp new file mode 100755 index 0000000..3a1a23f --- /dev/null +++ b/libtgvoip/os/windows/WindowsSpecific.cpp @@ -0,0 +1,9 @@ +#include "WindowsSpecific.h" + +using namespace tgvoip; + +std::string WindowsSpecific::GetErrorMessage(DWORD code){ + char buf[1024]={0}; + FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, code, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), buf, sizeof(buf), NULL); + return std::string(buf); +} \ No newline at end of file diff --git a/libtgvoip/os/windows/WindowsSpecific.h b/libtgvoip/os/windows/WindowsSpecific.h new file mode 100755 index 0000000..617e0d5 --- /dev/null +++ b/libtgvoip/os/windows/WindowsSpecific.h @@ -0,0 +1,16 @@ +#ifndef LIBTGVOIP_WINDOWS_SPECIFIC_H +#define LIBTGVOIP_WINDOWS_SPECIFIC_H + +#include +#include + +namespace tgvoip{ + + class WindowsSpecific{ + public: + static std::string GetErrorMessage(DWORD code); + }; + +} + +#endif // LIBTGVOIP_WINDOWS_SPECIFIC_H \ No newline at end of file diff --git a/libtgvoip/tests/libtgvoipTests.mm b/libtgvoip/tests/libtgvoipTests.mm index 3fbe69a..cbb9c54 100644 --- a/libtgvoip/tests/libtgvoipTests.mm +++ b/libtgvoip/tests/libtgvoipTests.mm @@ -9,7 +9,7 @@ #import "MockReflector.h" #include "../VoIPController.h" #include -#include "../webrtc_dsp/webrtc/common_audio/wav_file.h" +#include "../webrtc_dsp/common_audio/wav_file.h" @interface libtgvoipTests : XCTestCase @@ -44,10 +44,10 @@ - (void)initControllers{ std::vector endpoints1; IPv4Address localhost("127.0.0.1"); IPv6Address emptyV6; - endpoints1.push_back(Endpoint(1, 1033, localhost, emptyV6, Endpoint::TYPE_UDP_RELAY, peerTags[0].data())); + endpoints1.push_back(Endpoint(1, 1033, localhost, emptyV6, Endpoint::Type::UDP_RELAY, peerTags[0].data())); controller1->SetRemoteEndpoints(endpoints1, false, 76); std::vector endpoints2; - endpoints2.push_back(Endpoint(1, 1033, localhost, emptyV6, Endpoint::TYPE_UDP_RELAY, peerTags[1].data())); + endpoints2.push_back(Endpoint(1, 1033, localhost, emptyV6, Endpoint::Type::UDP_RELAY, peerTags[1].data())); controller2->SetRemoteEndpoints(endpoints2, false, 76); char encryptionKey[256]; diff --git a/libtgvoip/threading.h b/libtgvoip/threading.h old mode 100644 new mode 100755 index 2b5c19c..9dc2554 --- a/libtgvoip/threading.h +++ b/libtgvoip/threading.h @@ -7,31 +7,7 @@ #ifndef __THREADING_H #define __THREADING_H -namespace tgvoip{ - class MethodPointerBase{ - public: - virtual ~MethodPointerBase(){ - - } - virtual void Invoke(void* arg)=0; - }; - - template class MethodPointer : public MethodPointerBase{ - public: - MethodPointer(void (T::*method)(void*), T* obj){ - this->method=method; - this->obj=obj; - } - - virtual void Invoke(void* arg){ - (obj->*method)(arg); - } - - private: - void (T::*method)(void*); - T* obj; - }; -} +#include #if defined(_POSIX_THREADS) || defined(_POSIX_VERSION) || defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)) @@ -73,12 +49,13 @@ namespace tgvoip{ class Thread{ public: - Thread(MethodPointerBase* entry, void* arg) : entry(entry), arg(arg){ + Thread(std::function entry) : entry(entry){ name=NULL; + thread=0; } virtual ~Thread(){ - delete entry; + } void Start(){ @@ -124,11 +101,10 @@ namespace tgvoip{ } #endif } - self->entry->Invoke(self->arg); + self->entry(); return NULL; } - MethodPointerBase* entry; - void* arg; + std::function entry; pthread_t thread; const char* name; bool maxPriority=false; @@ -244,13 +220,12 @@ namespace tgvoip{ class Thread{ public: - Thread(MethodPointerBase* entry, void* arg) : entry(entry), arg(arg){ + Thread(std::function entry) : entry(entry){ name=NULL; thread=NULL; } ~Thread(){ - delete entry; } void Start(){ @@ -309,11 +284,10 @@ namespace tgvoip{ RaiseException(MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info); }__except(EXCEPTION_EXECUTE_HANDLER){} } - self->entry->Invoke(self->arg); + self->entry(); return 0; } - MethodPointerBase* entry; - void* arg; + std::function entry; HANDLE thread; DWORD id; const char* name; diff --git a/libtgvoip/video/VideoRenderer.cpp b/libtgvoip/video/VideoRenderer.cpp new file mode 100644 index 0000000..52dfc2b --- /dev/null +++ b/libtgvoip/video/VideoRenderer.cpp @@ -0,0 +1,23 @@ +// +// Created by Grishka on 10.08.2018. +// + +#include "VideoRenderer.h" + +#ifdef __ANDROID__ +#include "../os/android/VideoRendererAndroid.h" +#endif + +std::vector tgvoip::video::VideoRenderer::GetAvailableDecoders(){ +#ifdef __ANDROID__ + return VideoRendererAndroid::availableDecoders; +#endif + return std::vector(); +} + +int tgvoip::video::VideoRenderer::GetMaximumResolution(){ +#ifdef __ANDROID__ + return VideoRendererAndroid::maxResolution; +#endif + return 0; +} diff --git a/libtgvoip/video/VideoRenderer.h b/libtgvoip/video/VideoRenderer.h new file mode 100644 index 0000000..96d64d0 --- /dev/null +++ b/libtgvoip/video/VideoRenderer.h @@ -0,0 +1,25 @@ +// +// Created by Grishka on 10.08.2018. +// + +#ifndef LIBTGVOIP_VIDEORENDERER_H +#define LIBTGVOIP_VIDEORENDERER_H + +#include +#include "../Buffers.h" + +namespace tgvoip{ + namespace video{ + class VideoRenderer{ + public: + static std::vector GetAvailableDecoders(); + virtual ~VideoRenderer(){}; + virtual void Reset(uint32_t codec, unsigned int width, unsigned int height, std::vector& csd)=0; + virtual void DecodeAndDisplay(Buffer frame, uint32_t pts)=0; + virtual void SetStreamEnabled(bool enabled)=0; + static int GetMaximumResolution(); + }; + } +} + +#endif //LIBTGVOIP_VIDEORENDERER_H diff --git a/libtgvoip/video/VideoSource.cpp b/libtgvoip/video/VideoSource.cpp new file mode 100755 index 0000000..a20d730 --- /dev/null +++ b/libtgvoip/video/VideoSource.cpp @@ -0,0 +1,40 @@ +// +// Created by Grishka on 10.08.2018. +// + +#include "VideoSource.h" + +#ifdef __ANDROID__ +#include "../os/android/VideoSourceAndroid.h" +#endif + +using namespace tgvoip; +using namespace tgvoip::video; + +std::shared_ptr VideoSource::Create(){ +#ifdef __ANDROID__ + //return std::make_shared(); + return nullptr; +#endif + return nullptr; +} + + +void VideoSource::SetCallback(std::function callback){ + this->callback=callback; +} + +bool VideoSource::Failed(){ + return failed; +} + +std::string VideoSource::GetErrorDescription(){ + return error; +} + +std::vector VideoSource::GetAvailableEncoders(){ +#ifdef __ANDROID__ + return VideoSourceAndroid::availableEncoders; +#endif + return std::vector(); +} diff --git a/libtgvoip/video/VideoSource.h b/libtgvoip/video/VideoSource.h new file mode 100644 index 0000000..0094e9b --- /dev/null +++ b/libtgvoip/video/VideoSource.h @@ -0,0 +1,49 @@ +// +// Created by Grishka on 10.08.2018. +// + +#ifndef LIBTGVOIP_VIDEOSOURCE_H +#define LIBTGVOIP_VIDEOSOURCE_H + +#include +#include +#include +#include +#include "../Buffers.h" + +namespace tgvoip{ + namespace video { + class VideoSource{ + public: + virtual ~VideoSource(){}; + static std::shared_ptr Create(); + static std::vector GetAvailableEncoders(); + void SetCallback(std::function callback); + virtual void Start()=0; + virtual void Stop()=0; + virtual void Reset(uint32_t codec, int maxResolution)=0; + virtual void RequestKeyFrame()=0; + bool Failed(); + std::string GetErrorDescription(); + std::vector& GetCodecSpecificData(){ + return csd; + } + unsigned int GetFrameWidth(){ + return width; + } + unsigned int GetFrameHeight(){ + return height; + } + + protected: + std::function callback; + bool failed; + std::string error; + unsigned int width=0; + unsigned int height=0; + std::vector csd; + }; + } +} + +#endif //LIBTGVOIP_VIDEOSOURCE_H diff --git a/libtgvoip/webrtc_dsp/absl/algorithm/algorithm.h b/libtgvoip/webrtc_dsp/absl/algorithm/algorithm.h new file mode 100755 index 0000000..3d65864 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/algorithm/algorithm.h @@ -0,0 +1,150 @@ +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ----------------------------------------------------------------------------- +// File: algorithm.h +// ----------------------------------------------------------------------------- +// +// This header file contains Google extensions to the standard C++ +// header. + +#ifndef ABSL_ALGORITHM_ALGORITHM_H_ +#define ABSL_ALGORITHM_ALGORITHM_H_ + +#include +#include +#include + +namespace absl { + +namespace algorithm_internal { + +// Performs comparisons with operator==, similar to C++14's `std::equal_to<>`. +struct EqualTo { + template + bool operator()(const T& a, const U& b) const { + return a == b; + } +}; + +template +bool EqualImpl(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2, Pred pred, std::input_iterator_tag, + std::input_iterator_tag) { + while (true) { + if (first1 == last1) return first2 == last2; + if (first2 == last2) return false; + if (!pred(*first1, *first2)) return false; + ++first1; + ++first2; + } +} + +template +bool EqualImpl(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2, Pred&& pred, std::random_access_iterator_tag, + std::random_access_iterator_tag) { + return (last1 - first1 == last2 - first2) && + std::equal(first1, last1, first2, std::forward(pred)); +} + +// When we are using our own internal predicate that just applies operator==, we +// forward to the non-predicate form of std::equal. This enables an optimization +// in libstdc++ that can result in std::memcmp being used for integer types. +template +bool EqualImpl(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2, algorithm_internal::EqualTo /* unused */, + std::random_access_iterator_tag, + std::random_access_iterator_tag) { + return (last1 - first1 == last2 - first2) && + std::equal(first1, last1, first2); +} + +template +It RotateImpl(It first, It middle, It last, std::true_type) { + return std::rotate(first, middle, last); +} + +template +It RotateImpl(It first, It middle, It last, std::false_type) { + std::rotate(first, middle, last); + return std::next(first, std::distance(middle, last)); +} + +} // namespace algorithm_internal + +// Compares the equality of two ranges specified by pairs of iterators, using +// the given predicate, returning true iff for each corresponding iterator i1 +// and i2 in the first and second range respectively, pred(*i1, *i2) == true +// +// This comparison takes at most min(`last1` - `first1`, `last2` - `first2`) +// invocations of the predicate. Additionally, if InputIter1 and InputIter2 are +// both random-access iterators, and `last1` - `first1` != `last2` - `first2`, +// then the predicate is never invoked and the function returns false. +// +// This is a C++11-compatible implementation of C++14 `std::equal`. See +// http://en.cppreference.com/w/cpp/algorithm/equal for more information. +template +bool equal(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2, Pred&& pred) { + return algorithm_internal::EqualImpl( + first1, last1, first2, last2, std::forward(pred), + typename std::iterator_traits::iterator_category{}, + typename std::iterator_traits::iterator_category{}); +} + +// Performs comparison of two ranges specified by pairs of iterators using +// operator==. +template +bool equal(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2) { + return absl::equal(first1, last1, first2, last2, + algorithm_internal::EqualTo{}); +} + +// Performs a linear search for `value` using the iterator `first` up to +// but not including `last`, returning true if [`first`, `last`) contains an +// element equal to `value`. +// +// A linear search is of O(n) complexity which is guaranteed to make at most +// n = (`last` - `first`) comparisons. A linear search over short containers +// may be faster than a binary search, even when the container is sorted. +template +bool linear_search(InputIterator first, InputIterator last, + const EqualityComparable& value) { + return std::find(first, last, value) != last; +} + +// Performs a left rotation on a range of elements (`first`, `last`) such that +// `middle` is now the first element. `rotate()` returns an iterator pointing to +// the first element before rotation. This function is exactly the same as +// `std::rotate`, but fixes a bug in gcc +// <= 4.9 where `std::rotate` returns `void` instead of an iterator. +// +// The complexity of this algorithm is the same as that of `std::rotate`, but if +// `ForwardIterator` is not a random-access iterator, then `absl::rotate` +// performs an additional pass over the range to construct the return value. + +template +ForwardIterator rotate(ForwardIterator first, ForwardIterator middle, + ForwardIterator last) { + return algorithm_internal::RotateImpl( + first, middle, last, + std::is_same()); +} + +} // namespace absl + +#endif // ABSL_ALGORITHM_ALGORITHM_H_ diff --git a/libtgvoip/webrtc_dsp/absl/base/attributes.h b/libtgvoip/webrtc_dsp/absl/base/attributes.h new file mode 100755 index 0000000..291ad89 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/base/attributes.h @@ -0,0 +1,597 @@ +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// This header file defines macros for declaring attributes for functions, +// types, and variables. +// +// These macros are used within Abseil and allow the compiler to optimize, where +// applicable, certain function calls. +// +// This file is used for both C and C++! +// +// Most macros here are exposing GCC or Clang features, and are stubbed out for +// other compilers. +// +// GCC attributes documentation: +// https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Function-Attributes.html +// https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Variable-Attributes.html +// https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Type-Attributes.html +// +// Most attributes in this file are already supported by GCC 4.7. However, some +// of them are not supported in older version of Clang. Thus, we check +// `__has_attribute()` first. If the check fails, we check if we are on GCC and +// assume the attribute exists on GCC (which is verified on GCC 4.7). +// +// ----------------------------------------------------------------------------- +// Sanitizer Attributes +// ----------------------------------------------------------------------------- +// +// Sanitizer-related attributes are not "defined" in this file (and indeed +// are not defined as such in any file). To utilize the following +// sanitizer-related attributes within your builds, define the following macros +// within your build using a `-D` flag, along with the given value for +// `-fsanitize`: +// +// * `ADDRESS_SANITIZER` + `-fsanitize=address` (Clang, GCC 4.8) +// * `MEMORY_SANITIZER` + `-fsanitize=memory` (Clang-only) +// * `THREAD_SANITIZER + `-fsanitize=thread` (Clang, GCC 4.8+) +// * `UNDEFINED_BEHAVIOR_SANITIZER` + `-fsanitize=undefined` (Clang, GCC 4.9+) +// * `CONTROL_FLOW_INTEGRITY` + -fsanitize=cfi (Clang-only) +// +// Example: +// +// // Enable branches in the Abseil code that are tagged for ASan: +// $ bazel build --copt=-DADDRESS_SANITIZER --copt=-fsanitize=address +// --linkopt=-fsanitize=address *target* +// +// Since these macro names are only supported by GCC and Clang, we only check +// for `__GNUC__` (GCC or Clang) and the above macros. +#ifndef ABSL_BASE_ATTRIBUTES_H_ +#define ABSL_BASE_ATTRIBUTES_H_ + +// ABSL_HAVE_ATTRIBUTE +// +// A function-like feature checking macro that is a wrapper around +// `__has_attribute`, which is defined by GCC 5+ and Clang and evaluates to a +// nonzero constant integer if the attribute is supported or 0 if not. +// +// It evaluates to zero if `__has_attribute` is not defined by the compiler. +// +// GCC: https://gcc.gnu.org/gcc-5/changes.html +// Clang: https://clang.llvm.org/docs/LanguageExtensions.html +#ifdef __has_attribute +#define ABSL_HAVE_ATTRIBUTE(x) __has_attribute(x) +#else +#define ABSL_HAVE_ATTRIBUTE(x) 0 +#endif + +// ABSL_HAVE_CPP_ATTRIBUTE +// +// A function-like feature checking macro that accepts C++11 style attributes. +// It's a wrapper around `__has_cpp_attribute`, defined by ISO C++ SD-6 +// (http://en.cppreference.com/w/cpp/experimental/feature_test). If we don't +// find `__has_cpp_attribute`, will evaluate to 0. +#if defined(__cplusplus) && defined(__has_cpp_attribute) +// NOTE: requiring __cplusplus above should not be necessary, but +// works around https://bugs.llvm.org/show_bug.cgi?id=23435. +#define ABSL_HAVE_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +#define ABSL_HAVE_CPP_ATTRIBUTE(x) 0 +#endif + +// ----------------------------------------------------------------------------- +// Function Attributes +// ----------------------------------------------------------------------------- +// +// GCC: https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html +// Clang: https://clang.llvm.org/docs/AttributeReference.html + +// ABSL_PRINTF_ATTRIBUTE +// ABSL_SCANF_ATTRIBUTE +// +// Tells the compiler to perform `printf` format string checking if the +// compiler supports it; see the 'format' attribute in +// . +// +// Note: As the GCC manual states, "[s]ince non-static C++ methods +// have an implicit 'this' argument, the arguments of such methods +// should be counted from two, not one." +#if ABSL_HAVE_ATTRIBUTE(format) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_PRINTF_ATTRIBUTE(string_index, first_to_check) \ + __attribute__((__format__(__printf__, string_index, first_to_check))) +#define ABSL_SCANF_ATTRIBUTE(string_index, first_to_check) \ + __attribute__((__format__(__scanf__, string_index, first_to_check))) +#else +#define ABSL_PRINTF_ATTRIBUTE(string_index, first_to_check) +#define ABSL_SCANF_ATTRIBUTE(string_index, first_to_check) +#endif + +// ABSL_ATTRIBUTE_ALWAYS_INLINE +// ABSL_ATTRIBUTE_NOINLINE +// +// Forces functions to either inline or not inline. Introduced in gcc 3.1. +#if ABSL_HAVE_ATTRIBUTE(always_inline) || \ + (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_ALWAYS_INLINE __attribute__((always_inline)) +#define ABSL_HAVE_ATTRIBUTE_ALWAYS_INLINE 1 +#else +#define ABSL_ATTRIBUTE_ALWAYS_INLINE +#endif + +#if ABSL_HAVE_ATTRIBUTE(noinline) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_NOINLINE __attribute__((noinline)) +#define ABSL_HAVE_ATTRIBUTE_NOINLINE 1 +#else +#define ABSL_ATTRIBUTE_NOINLINE +#endif + +// ABSL_ATTRIBUTE_NO_TAIL_CALL +// +// Prevents the compiler from optimizing away stack frames for functions which +// end in a call to another function. +#if ABSL_HAVE_ATTRIBUTE(disable_tail_calls) +#define ABSL_HAVE_ATTRIBUTE_NO_TAIL_CALL 1 +#define ABSL_ATTRIBUTE_NO_TAIL_CALL __attribute__((disable_tail_calls)) +#elif defined(__GNUC__) && !defined(__clang__) +#define ABSL_HAVE_ATTRIBUTE_NO_TAIL_CALL 1 +#define ABSL_ATTRIBUTE_NO_TAIL_CALL \ + __attribute__((optimize("no-optimize-sibling-calls"))) +#else +#define ABSL_ATTRIBUTE_NO_TAIL_CALL +#define ABSL_HAVE_ATTRIBUTE_NO_TAIL_CALL 0 +#endif + +// ABSL_ATTRIBUTE_WEAK +// +// Tags a function as weak for the purposes of compilation and linking. +// Weak attributes currently do not work properly in LLVM's Windows backend, +// so disable them there. See https://bugs.llvm.org/show_bug.cgi?id=37598 +// for futher information. +#if (ABSL_HAVE_ATTRIBUTE(weak) || \ + (defined(__GNUC__) && !defined(__clang__))) && \ + !(defined(__llvm__) && defined(_WIN32)) +#undef ABSL_ATTRIBUTE_WEAK +#define ABSL_ATTRIBUTE_WEAK __attribute__((weak)) +#define ABSL_HAVE_ATTRIBUTE_WEAK 1 +#else +#define ABSL_ATTRIBUTE_WEAK +#define ABSL_HAVE_ATTRIBUTE_WEAK 0 +#endif + +// ABSL_ATTRIBUTE_NONNULL +// +// Tells the compiler either (a) that a particular function parameter +// should be a non-null pointer, or (b) that all pointer arguments should +// be non-null. +// +// Note: As the GCC manual states, "[s]ince non-static C++ methods +// have an implicit 'this' argument, the arguments of such methods +// should be counted from two, not one." +// +// Args are indexed starting at 1. +// +// For non-static class member functions, the implicit `this` argument +// is arg 1, and the first explicit argument is arg 2. For static class member +// functions, there is no implicit `this`, and the first explicit argument is +// arg 1. +// +// Example: +// +// /* arg_a cannot be null, but arg_b can */ +// void Function(void* arg_a, void* arg_b) ABSL_ATTRIBUTE_NONNULL(1); +// +// class C { +// /* arg_a cannot be null, but arg_b can */ +// void Method(void* arg_a, void* arg_b) ABSL_ATTRIBUTE_NONNULL(2); +// +// /* arg_a cannot be null, but arg_b can */ +// static void StaticMethod(void* arg_a, void* arg_b) +// ABSL_ATTRIBUTE_NONNULL(1); +// }; +// +// If no arguments are provided, then all pointer arguments should be non-null. +// +// /* No pointer arguments may be null. */ +// void Function(void* arg_a, void* arg_b, int arg_c) ABSL_ATTRIBUTE_NONNULL(); +// +// NOTE: The GCC nonnull attribute actually accepts a list of arguments, but +// ABSL_ATTRIBUTE_NONNULL does not. +#if ABSL_HAVE_ATTRIBUTE(nonnull) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_NONNULL(arg_index) __attribute__((nonnull(arg_index))) +#else +#define ABSL_ATTRIBUTE_NONNULL(...) +#endif + +// ABSL_ATTRIBUTE_NORETURN +// +// Tells the compiler that a given function never returns. +#if ABSL_HAVE_ATTRIBUTE(noreturn) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_NORETURN __attribute__((noreturn)) +#elif defined(_MSC_VER) +#define ABSL_ATTRIBUTE_NORETURN __declspec(noreturn) +#else +#define ABSL_ATTRIBUTE_NORETURN +#endif + +// ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS +// +// Tells the AddressSanitizer (or other memory testing tools) to ignore a given +// function. Useful for cases when a function reads random locations on stack, +// calls _exit from a cloned subprocess, deliberately accesses buffer +// out of bounds or does other scary things with memory. +// NOTE: GCC supports AddressSanitizer(asan) since 4.8. +// https://gcc.gnu.org/gcc-4.8/changes.html +#if defined(__GNUC__) && defined(ADDRESS_SANITIZER) +#define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) +#else +#define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS +#endif + +// ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY +// +// Tells the MemorySanitizer to relax the handling of a given function. All +// "Use of uninitialized value" warnings from such functions will be suppressed, +// and all values loaded from memory will be considered fully initialized. +// This attribute is similar to the ADDRESS_SANITIZER attribute above, but deals +// with initialized-ness rather than addressability issues. +// NOTE: MemorySanitizer(msan) is supported by Clang but not GCC. +#if defined(__GNUC__) && defined(MEMORY_SANITIZER) +#define ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize_memory)) +#else +#define ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY +#endif + +// ABSL_ATTRIBUTE_NO_SANITIZE_THREAD +// +// Tells the ThreadSanitizer to not instrument a given function. +// NOTE: GCC supports ThreadSanitizer(tsan) since 4.8. +// https://gcc.gnu.org/gcc-4.8/changes.html +#if defined(__GNUC__) && defined(THREAD_SANITIZER) +#define ABSL_ATTRIBUTE_NO_SANITIZE_THREAD __attribute__((no_sanitize_thread)) +#else +#define ABSL_ATTRIBUTE_NO_SANITIZE_THREAD +#endif + +// ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED +// +// Tells the UndefinedSanitizer to ignore a given function. Useful for cases +// where certain behavior (eg. division by zero) is being used intentionally. +// NOTE: GCC supports UndefinedBehaviorSanitizer(ubsan) since 4.9. +// https://gcc.gnu.org/gcc-4.9/changes.html +#if defined(__GNUC__) && \ + (defined(UNDEFINED_BEHAVIOR_SANITIZER) || defined(ADDRESS_SANITIZER)) +#define ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED \ + __attribute__((no_sanitize("undefined"))) +#else +#define ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED +#endif + +// ABSL_ATTRIBUTE_NO_SANITIZE_CFI +// +// Tells the ControlFlowIntegrity sanitizer to not instrument a given function. +// See https://clang.llvm.org/docs/ControlFlowIntegrity.html for details. +#if defined(__GNUC__) && defined(CONTROL_FLOW_INTEGRITY) +#define ABSL_ATTRIBUTE_NO_SANITIZE_CFI __attribute__((no_sanitize("cfi"))) +#else +#define ABSL_ATTRIBUTE_NO_SANITIZE_CFI +#endif + +// ABSL_ATTRIBUTE_RETURNS_NONNULL +// +// Tells the compiler that a particular function never returns a null pointer. +#if ABSL_HAVE_ATTRIBUTE(returns_nonnull) || \ + (defined(__GNUC__) && \ + (__GNUC__ > 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)) && \ + !defined(__clang__)) +#define ABSL_ATTRIBUTE_RETURNS_NONNULL __attribute__((returns_nonnull)) +#else +#define ABSL_ATTRIBUTE_RETURNS_NONNULL +#endif + +// ABSL_HAVE_ATTRIBUTE_SECTION +// +// Indicates whether labeled sections are supported. Weak symbol support is +// a prerequisite. Labeled sections are not supported on Darwin/iOS. +#ifdef ABSL_HAVE_ATTRIBUTE_SECTION +#error ABSL_HAVE_ATTRIBUTE_SECTION cannot be directly set +#elif (ABSL_HAVE_ATTRIBUTE(section) || \ + (defined(__GNUC__) && !defined(__clang__))) && \ + !defined(__APPLE__) && ABSL_HAVE_ATTRIBUTE_WEAK +#define ABSL_HAVE_ATTRIBUTE_SECTION 1 + +// ABSL_ATTRIBUTE_SECTION +// +// Tells the compiler/linker to put a given function into a section and define +// `__start_ ## name` and `__stop_ ## name` symbols to bracket the section. +// This functionality is supported by GNU linker. Any function annotated with +// `ABSL_ATTRIBUTE_SECTION` must not be inlined, or it will be placed into +// whatever section its caller is placed into. +// +#ifndef ABSL_ATTRIBUTE_SECTION +#define ABSL_ATTRIBUTE_SECTION(name) \ + __attribute__((section(#name))) __attribute__((noinline)) +#endif + + +// ABSL_ATTRIBUTE_SECTION_VARIABLE +// +// Tells the compiler/linker to put a given variable into a section and define +// `__start_ ## name` and `__stop_ ## name` symbols to bracket the section. +// This functionality is supported by GNU linker. +#ifndef ABSL_ATTRIBUTE_SECTION_VARIABLE +#define ABSL_ATTRIBUTE_SECTION_VARIABLE(name) __attribute__((section(#name))) +#endif + +// ABSL_DECLARE_ATTRIBUTE_SECTION_VARS +// +// A weak section declaration to be used as a global declaration +// for ABSL_ATTRIBUTE_SECTION_START|STOP(name) to compile and link +// even without functions with ABSL_ATTRIBUTE_SECTION(name). +// ABSL_DEFINE_ATTRIBUTE_SECTION should be in the exactly one file; it's +// a no-op on ELF but not on Mach-O. +// +#ifndef ABSL_DECLARE_ATTRIBUTE_SECTION_VARS +#define ABSL_DECLARE_ATTRIBUTE_SECTION_VARS(name) \ + extern char __start_##name[] ABSL_ATTRIBUTE_WEAK; \ + extern char __stop_##name[] ABSL_ATTRIBUTE_WEAK +#endif +#ifndef ABSL_DEFINE_ATTRIBUTE_SECTION_VARS +#define ABSL_INIT_ATTRIBUTE_SECTION_VARS(name) +#define ABSL_DEFINE_ATTRIBUTE_SECTION_VARS(name) +#endif + +// ABSL_ATTRIBUTE_SECTION_START +// +// Returns `void*` pointers to start/end of a section of code with +// functions having ABSL_ATTRIBUTE_SECTION(name). +// Returns 0 if no such functions exist. +// One must ABSL_DECLARE_ATTRIBUTE_SECTION_VARS(name) for this to compile and +// link. +// +#define ABSL_ATTRIBUTE_SECTION_START(name) \ + (reinterpret_cast(__start_##name)) +#define ABSL_ATTRIBUTE_SECTION_STOP(name) \ + (reinterpret_cast(__stop_##name)) + +#else // !ABSL_HAVE_ATTRIBUTE_SECTION + +#define ABSL_HAVE_ATTRIBUTE_SECTION 0 + +// provide dummy definitions +#define ABSL_ATTRIBUTE_SECTION(name) +#define ABSL_ATTRIBUTE_SECTION_VARIABLE(name) +#define ABSL_INIT_ATTRIBUTE_SECTION_VARS(name) +#define ABSL_DEFINE_ATTRIBUTE_SECTION_VARS(name) +#define ABSL_DECLARE_ATTRIBUTE_SECTION_VARS(name) +#define ABSL_ATTRIBUTE_SECTION_START(name) (reinterpret_cast(0)) +#define ABSL_ATTRIBUTE_SECTION_STOP(name) (reinterpret_cast(0)) + +#endif // ABSL_ATTRIBUTE_SECTION + +// ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC +// +// Support for aligning the stack on 32-bit x86. +#if ABSL_HAVE_ATTRIBUTE(force_align_arg_pointer) || \ + (defined(__GNUC__) && !defined(__clang__)) +#if defined(__i386__) +#define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC \ + __attribute__((force_align_arg_pointer)) +#define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (0) +#elif defined(__x86_64__) +#define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (1) +#define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC +#else // !__i386__ && !__x86_64 +#define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (0) +#define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC +#endif // __i386__ +#else +#define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC +#define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (0) +#endif + +// ABSL_MUST_USE_RESULT +// +// Tells the compiler to warn about unused results. +// +// When annotating a function, it must appear as the first part of the +// declaration or definition. The compiler will warn if the return value from +// such a function is unused: +// +// ABSL_MUST_USE_RESULT Sprocket* AllocateSprocket(); +// AllocateSprocket(); // Triggers a warning. +// +// When annotating a class, it is equivalent to annotating every function which +// returns an instance. +// +// class ABSL_MUST_USE_RESULT Sprocket {}; +// Sprocket(); // Triggers a warning. +// +// Sprocket MakeSprocket(); +// MakeSprocket(); // Triggers a warning. +// +// Note that references and pointers are not instances: +// +// Sprocket* SprocketPointer(); +// SprocketPointer(); // Does *not* trigger a warning. +// +// ABSL_MUST_USE_RESULT allows using cast-to-void to suppress the unused result +// warning. For that, warn_unused_result is used only for clang but not for gcc. +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425 +// +// Note: past advice was to place the macro after the argument list. +#if ABSL_HAVE_ATTRIBUTE(nodiscard) +#define ABSL_MUST_USE_RESULT [[nodiscard]] +#elif defined(__clang__) && ABSL_HAVE_ATTRIBUTE(warn_unused_result) +#define ABSL_MUST_USE_RESULT __attribute__((warn_unused_result)) +#else +#define ABSL_MUST_USE_RESULT +#endif + +// ABSL_ATTRIBUTE_HOT, ABSL_ATTRIBUTE_COLD +// +// Tells GCC that a function is hot or cold. GCC can use this information to +// improve static analysis, i.e. a conditional branch to a cold function +// is likely to be not-taken. +// This annotation is used for function declarations. +// +// Example: +// +// int foo() ABSL_ATTRIBUTE_HOT; +#if ABSL_HAVE_ATTRIBUTE(hot) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_HOT __attribute__((hot)) +#else +#define ABSL_ATTRIBUTE_HOT +#endif + +#if ABSL_HAVE_ATTRIBUTE(cold) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_COLD __attribute__((cold)) +#else +#define ABSL_ATTRIBUTE_COLD +#endif + +// ABSL_XRAY_ALWAYS_INSTRUMENT, ABSL_XRAY_NEVER_INSTRUMENT, ABSL_XRAY_LOG_ARGS +// +// We define the ABSL_XRAY_ALWAYS_INSTRUMENT and ABSL_XRAY_NEVER_INSTRUMENT +// macro used as an attribute to mark functions that must always or never be +// instrumented by XRay. Currently, this is only supported in Clang/LLVM. +// +// For reference on the LLVM XRay instrumentation, see +// http://llvm.org/docs/XRay.html. +// +// A function with the XRAY_ALWAYS_INSTRUMENT macro attribute in its declaration +// will always get the XRay instrumentation sleds. These sleds may introduce +// some binary size and runtime overhead and must be used sparingly. +// +// These attributes only take effect when the following conditions are met: +// +// * The file/target is built in at least C++11 mode, with a Clang compiler +// that supports XRay attributes. +// * The file/target is built with the -fxray-instrument flag set for the +// Clang/LLVM compiler. +// * The function is defined in the translation unit (the compiler honors the +// attribute in either the definition or the declaration, and must match). +// +// There are cases when, even when building with XRay instrumentation, users +// might want to control specifically which functions are instrumented for a +// particular build using special-case lists provided to the compiler. These +// special case lists are provided to Clang via the +// -fxray-always-instrument=... and -fxray-never-instrument=... flags. The +// attributes in source take precedence over these special-case lists. +// +// To disable the XRay attributes at build-time, users may define +// ABSL_NO_XRAY_ATTRIBUTES. Do NOT define ABSL_NO_XRAY_ATTRIBUTES on specific +// packages/targets, as this may lead to conflicting definitions of functions at +// link-time. +// +#if ABSL_HAVE_CPP_ATTRIBUTE(clang::xray_always_instrument) && \ + !defined(ABSL_NO_XRAY_ATTRIBUTES) +#define ABSL_XRAY_ALWAYS_INSTRUMENT [[clang::xray_always_instrument]] +#define ABSL_XRAY_NEVER_INSTRUMENT [[clang::xray_never_instrument]] +#if ABSL_HAVE_CPP_ATTRIBUTE(clang::xray_log_args) +#define ABSL_XRAY_LOG_ARGS(N) \ + [[clang::xray_always_instrument, clang::xray_log_args(N)]] +#else +#define ABSL_XRAY_LOG_ARGS(N) [[clang::xray_always_instrument]] +#endif +#else +#define ABSL_XRAY_ALWAYS_INSTRUMENT +#define ABSL_XRAY_NEVER_INSTRUMENT +#define ABSL_XRAY_LOG_ARGS(N) +#endif + +// ABSL_ATTRIBUTE_REINITIALIZES +// +// Indicates that a member function reinitializes the entire object to a known +// state, independent of the previous state of the object. +// +// The clang-tidy check bugprone-use-after-move allows member functions marked +// with this attribute to be called on objects that have been moved from; +// without the attribute, this would result in a use-after-move warning. +#if ABSL_HAVE_CPP_ATTRIBUTE(clang::reinitializes) +#define ABSL_ATTRIBUTE_REINITIALIZES [[clang::reinitializes]] +#else +#define ABSL_ATTRIBUTE_REINITIALIZES +#endif + +// ----------------------------------------------------------------------------- +// Variable Attributes +// ----------------------------------------------------------------------------- + +// ABSL_ATTRIBUTE_UNUSED +// +// Prevents the compiler from complaining about variables that appear unused. +#if ABSL_HAVE_ATTRIBUTE(unused) || (defined(__GNUC__) && !defined(__clang__)) +#undef ABSL_ATTRIBUTE_UNUSED +#define ABSL_ATTRIBUTE_UNUSED __attribute__((__unused__)) +#else +#define ABSL_ATTRIBUTE_UNUSED +#endif + +// ABSL_ATTRIBUTE_INITIAL_EXEC +// +// Tells the compiler to use "initial-exec" mode for a thread-local variable. +// See http://people.redhat.com/drepper/tls.pdf for the gory details. +#if ABSL_HAVE_ATTRIBUTE(tls_model) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_INITIAL_EXEC __attribute__((tls_model("initial-exec"))) +#else +#define ABSL_ATTRIBUTE_INITIAL_EXEC +#endif + +// ABSL_ATTRIBUTE_PACKED +// +// Prevents the compiler from padding a structure to natural alignment +#if ABSL_HAVE_ATTRIBUTE(packed) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_PACKED __attribute__((__packed__)) +#else +#define ABSL_ATTRIBUTE_PACKED +#endif + +// ABSL_ATTRIBUTE_FUNC_ALIGN +// +// Tells the compiler to align the function start at least to certain +// alignment boundary +#if ABSL_HAVE_ATTRIBUTE(aligned) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_FUNC_ALIGN(bytes) __attribute__((aligned(bytes))) +#else +#define ABSL_ATTRIBUTE_FUNC_ALIGN(bytes) +#endif + +// ABSL_CONST_INIT +// +// A variable declaration annotated with the `ABSL_CONST_INIT` attribute will +// not compile (on supported platforms) unless the variable has a constant +// initializer. This is useful for variables with static and thread storage +// duration, because it guarantees that they will not suffer from the so-called +// "static init order fiasco". Prefer to put this attribute on the most visible +// declaration of the variable, if there's more than one, because code that +// accesses the variable can then use the attribute for optimization. +// +// Example: +// +// class MyClass { +// public: +// ABSL_CONST_INIT static MyType my_var; +// }; +// +// MyType MyClass::my_var = MakeMyType(...); +// +// Note that this attribute is redundant if the variable is declared constexpr. +#if ABSL_HAVE_CPP_ATTRIBUTE(clang::require_constant_initialization) +// NOLINTNEXTLINE(whitespace/braces) +#define ABSL_CONST_INIT [[clang::require_constant_initialization]] +#else +#define ABSL_CONST_INIT +#endif // ABSL_HAVE_CPP_ATTRIBUTE(clang::require_constant_initialization) + +#endif // ABSL_BASE_ATTRIBUTES_H_ diff --git a/libtgvoip/webrtc_dsp/absl/base/config.h b/libtgvoip/webrtc_dsp/absl/base/config.h new file mode 100755 index 0000000..ca089f6 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/base/config.h @@ -0,0 +1,443 @@ +// +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ----------------------------------------------------------------------------- +// File: config.h +// ----------------------------------------------------------------------------- +// +// This header file defines a set of macros for checking the presence of +// important compiler and platform features. Such macros can be used to +// produce portable code by parameterizing compilation based on the presence or +// lack of a given feature. +// +// We define a "feature" as some interface we wish to program to: for example, +// a library function or system call. A value of `1` indicates support for +// that feature; any other value indicates the feature support is undefined. +// +// Example: +// +// Suppose a programmer wants to write a program that uses the 'mmap()' system +// call. The Abseil macro for that feature (`ABSL_HAVE_MMAP`) allows you to +// selectively include the `mmap.h` header and bracket code using that feature +// in the macro: +// +// #include "absl/base/config.h" +// +// #ifdef ABSL_HAVE_MMAP +// #include "sys/mman.h" +// #endif //ABSL_HAVE_MMAP +// +// ... +// #ifdef ABSL_HAVE_MMAP +// void *ptr = mmap(...); +// ... +// #endif // ABSL_HAVE_MMAP + +#ifndef ABSL_BASE_CONFIG_H_ +#define ABSL_BASE_CONFIG_H_ + +// Included for the __GLIBC__ macro (or similar macros on other systems). +#include + +#ifdef __cplusplus +// Included for __GLIBCXX__, _LIBCPP_VERSION +#include +#endif // __cplusplus + +#if defined(__APPLE__) +// Included for TARGET_OS_IPHONE, __IPHONE_OS_VERSION_MIN_REQUIRED, +// __IPHONE_8_0. +#include +#include +#endif + +#include "absl/base/policy_checks.h" + +// ----------------------------------------------------------------------------- +// Compiler Feature Checks +// ----------------------------------------------------------------------------- + +// ABSL_HAVE_BUILTIN() +// +// Checks whether the compiler supports a Clang Feature Checking Macro, and if +// so, checks whether it supports the provided builtin function "x" where x +// is one of the functions noted in +// https://clang.llvm.org/docs/LanguageExtensions.html +// +// Note: Use this macro to avoid an extra level of #ifdef __has_builtin check. +// http://releases.llvm.org/3.3/tools/clang/docs/LanguageExtensions.html +#ifdef __has_builtin +#define ABSL_HAVE_BUILTIN(x) __has_builtin(x) +#else +#define ABSL_HAVE_BUILTIN(x) 0 +#endif + +// ABSL_HAVE_TLS is defined to 1 when __thread should be supported. +// We assume __thread is supported on Linux when compiled with Clang or compiled +// against libstdc++ with _GLIBCXX_HAVE_TLS defined. +#ifdef ABSL_HAVE_TLS +#error ABSL_HAVE_TLS cannot be directly set +#elif defined(__linux__) && (defined(__clang__) || defined(_GLIBCXX_HAVE_TLS)) +#define ABSL_HAVE_TLS 1 +#endif + +// ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE +// +// Checks whether `std::is_trivially_destructible` is supported. +// +// Notes: All supported compilers using libc++ support this feature, as does +// gcc >= 4.8.1 using libstdc++, and Visual Studio. +#ifdef ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE +#error ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE cannot be directly set +#elif defined(_LIBCPP_VERSION) || \ + (!defined(__clang__) && defined(__GNUC__) && defined(__GLIBCXX__) && \ + (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) || \ + defined(_MSC_VER) +#define ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE 1 +#endif + +// ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE +// +// Checks whether `std::is_trivially_default_constructible` and +// `std::is_trivially_copy_constructible` are supported. + +// ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE +// +// Checks whether `std::is_trivially_copy_assignable` is supported. + +// Notes: Clang with libc++ supports these features, as does gcc >= 5.1 with +// either libc++ or libstdc++, and Visual Studio. +#if defined(ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE) +#error ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE cannot be directly set +#elif defined(ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE) +#error ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE cannot directly set +#elif (defined(__clang__) && defined(_LIBCPP_VERSION)) || \ + (!defined(__clang__) && defined(__GNUC__) && \ + (__GNUC__ > 5 || (__GNUC__ == 5 && __GNUC_MINOR__ >= 1)) && \ + (defined(_LIBCPP_VERSION) || defined(__GLIBCXX__))) || \ + defined(_MSC_VER) +#define ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE 1 +#define ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE 1 +#endif + +// ABSL_HAVE_THREAD_LOCAL +// +// Checks whether C++11's `thread_local` storage duration specifier is +// supported. +#ifdef ABSL_HAVE_THREAD_LOCAL +#error ABSL_HAVE_THREAD_LOCAL cannot be directly set +#elif defined(__APPLE__) +// Notes: +// * Xcode's clang did not support `thread_local` until version 8, and +// even then not for all iOS < 9.0. +// * Xcode 9.3 started disallowing `thread_local` for 32-bit iOS simulator +// targeting iOS 9.x. +// * Xcode 10 moves the deployment target check for iOS < 9.0 to link time +// making __has_feature unreliable there. +// +// Otherwise, `__has_feature` is only supported by Clang so it has be inside +// `defined(__APPLE__)` check. +#if __has_feature(cxx_thread_local) && \ + !(TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0) +#define ABSL_HAVE_THREAD_LOCAL 1 +#endif +#else // !defined(__APPLE__) +#define ABSL_HAVE_THREAD_LOCAL 1 +#endif + +// There are platforms for which TLS should not be used even though the compiler +// makes it seem like it's supported (Android NDK < r12b for example). +// This is primarily because of linker problems and toolchain misconfiguration: +// Abseil does not intend to support this indefinitely. Currently, the newest +// toolchain that we intend to support that requires this behavior is the +// r11 NDK - allowing for a 5 year support window on that means this option +// is likely to be removed around June of 2021. +// TLS isn't supported until NDK r12b per +// https://developer.android.com/ndk/downloads/revision_history.html +// Since NDK r16, `__NDK_MAJOR__` and `__NDK_MINOR__` are defined in +// . For NDK < r16, users should define these macros, +// e.g. `-D__NDK_MAJOR__=11 -D__NKD_MINOR__=0` for NDK r11. +#if defined(__ANDROID__) && defined(__clang__) +#if __has_include() +#include +#endif // __has_include() +#if defined(__ANDROID__) && defined(__clang__) && defined(__NDK_MAJOR__) && \ + defined(__NDK_MINOR__) && \ + ((__NDK_MAJOR__ < 12) || ((__NDK_MAJOR__ == 12) && (__NDK_MINOR__ < 1))) +#undef ABSL_HAVE_TLS +#undef ABSL_HAVE_THREAD_LOCAL +#endif +#endif // defined(__ANDROID__) && defined(__clang__) + +// ABSL_HAVE_INTRINSIC_INT128 +// +// Checks whether the __int128 compiler extension for a 128-bit integral type is +// supported. +// +// Note: __SIZEOF_INT128__ is defined by Clang and GCC when __int128 is +// supported, but we avoid using it in certain cases: +// * On Clang: +// * Building using Clang for Windows, where the Clang runtime library has +// 128-bit support only on LP64 architectures, but Windows is LLP64. +// * Building for aarch64, where __int128 exists but has exhibits a sporadic +// compiler crashing bug. +// * On Nvidia's nvcc: +// * nvcc also defines __GNUC__ and __SIZEOF_INT128__, but not all versions +// actually support __int128. +#ifdef ABSL_HAVE_INTRINSIC_INT128 +#error ABSL_HAVE_INTRINSIC_INT128 cannot be directly set +#elif defined(__SIZEOF_INT128__) +#if (defined(__clang__) && !defined(_WIN32) && !defined(__aarch64__)) || \ + (defined(__CUDACC__) && __CUDACC_VER_MAJOR__ >= 9) || \ + (defined(__GNUC__) && !defined(__clang__) && !defined(__CUDACC__)) +#define ABSL_HAVE_INTRINSIC_INT128 1 +#elif defined(__CUDACC__) +// __CUDACC_VER__ is a full version number before CUDA 9, and is defined to a +// string explaining that it has been removed starting with CUDA 9. We use +// nested #ifs because there is no short-circuiting in the preprocessor. +// NOTE: `__CUDACC__` could be undefined while `__CUDACC_VER__` is defined. +#if __CUDACC_VER__ >= 70000 +#define ABSL_HAVE_INTRINSIC_INT128 1 +#endif // __CUDACC_VER__ >= 70000 +#endif // defined(__CUDACC__) +#endif // ABSL_HAVE_INTRINSIC_INT128 + +// ABSL_HAVE_EXCEPTIONS +// +// Checks whether the compiler both supports and enables exceptions. Many +// compilers support a "no exceptions" mode that disables exceptions. +// +// Generally, when ABSL_HAVE_EXCEPTIONS is not defined: +// +// * Code using `throw` and `try` may not compile. +// * The `noexcept` specifier will still compile and behave as normal. +// * The `noexcept` operator may still return `false`. +// +// For further details, consult the compiler's documentation. +#ifdef ABSL_HAVE_EXCEPTIONS +#error ABSL_HAVE_EXCEPTIONS cannot be directly set. + +#elif defined(__clang__) +// TODO(calabrese) +// Switch to using __cpp_exceptions when we no longer support versions < 3.6. +// For details on this check, see: +// http://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html#the-exceptions-macro +#if defined(__EXCEPTIONS) && __has_feature(cxx_exceptions) +#define ABSL_HAVE_EXCEPTIONS 1 +#endif // defined(__EXCEPTIONS) && __has_feature(cxx_exceptions) + +// Handle remaining special cases and default to exceptions being supported. +#elif !(defined(__GNUC__) && (__GNUC__ < 5) && !defined(__EXCEPTIONS)) && \ + !(defined(__GNUC__) && (__GNUC__ >= 5) && !defined(__cpp_exceptions)) && \ + !(defined(_MSC_VER) && !defined(_CPPUNWIND)) +#define ABSL_HAVE_EXCEPTIONS 1 +#endif + +// ----------------------------------------------------------------------------- +// Platform Feature Checks +// ----------------------------------------------------------------------------- + +// Currently supported operating systems and associated preprocessor +// symbols: +// +// Linux and Linux-derived __linux__ +// Android __ANDROID__ (implies __linux__) +// Linux (non-Android) __linux__ && !__ANDROID__ +// Darwin (Mac OS X and iOS) __APPLE__ +// Akaros (http://akaros.org) __ros__ +// Windows _WIN32 +// NaCL __native_client__ +// AsmJS __asmjs__ +// WebAssembly __wasm__ +// Fuchsia __Fuchsia__ +// +// Note that since Android defines both __ANDROID__ and __linux__, one +// may probe for either Linux or Android by simply testing for __linux__. + +// ABSL_HAVE_MMAP +// +// Checks whether the platform has an mmap(2) implementation as defined in +// POSIX.1-2001. +#ifdef ABSL_HAVE_MMAP +#error ABSL_HAVE_MMAP cannot be directly set +#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ + defined(__ros__) || defined(__native_client__) || defined(__asmjs__) || \ + defined(__wasm__) || defined(__Fuchsia__) || defined(__sun) || \ + defined(__ASYLO__) +#define ABSL_HAVE_MMAP 1 +#endif + +// ABSL_HAVE_PTHREAD_GETSCHEDPARAM +// +// Checks whether the platform implements the pthread_(get|set)schedparam(3) +// functions as defined in POSIX.1-2001. +#ifdef ABSL_HAVE_PTHREAD_GETSCHEDPARAM +#error ABSL_HAVE_PTHREAD_GETSCHEDPARAM cannot be directly set +#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ + defined(__ros__) +#define ABSL_HAVE_PTHREAD_GETSCHEDPARAM 1 +#endif + +// ABSL_HAVE_SCHED_YIELD +// +// Checks whether the platform implements sched_yield(2) as defined in +// POSIX.1-2001. +#ifdef ABSL_HAVE_SCHED_YIELD +#error ABSL_HAVE_SCHED_YIELD cannot be directly set +#elif defined(__linux__) || defined(__ros__) || defined(__native_client__) +#define ABSL_HAVE_SCHED_YIELD 1 +#endif + +// ABSL_HAVE_SEMAPHORE_H +// +// Checks whether the platform supports the header and sem_open(3) +// family of functions as standardized in POSIX.1-2001. +// +// Note: While Apple provides for both iOS and macOS, it is +// explicitly deprecated and will cause build failures if enabled for those +// platforms. We side-step the issue by not defining it here for Apple +// platforms. +#ifdef ABSL_HAVE_SEMAPHORE_H +#error ABSL_HAVE_SEMAPHORE_H cannot be directly set +#elif defined(__linux__) || defined(__ros__) +#define ABSL_HAVE_SEMAPHORE_H 1 +#endif + +// ABSL_HAVE_ALARM +// +// Checks whether the platform supports the header and alarm(2) +// function as standardized in POSIX.1-2001. +#ifdef ABSL_HAVE_ALARM +#error ABSL_HAVE_ALARM cannot be directly set +#elif defined(__GOOGLE_GRTE_VERSION__) +// feature tests for Google's GRTE +#define ABSL_HAVE_ALARM 1 +#elif defined(__GLIBC__) +// feature test for glibc +#define ABSL_HAVE_ALARM 1 +#elif defined(_MSC_VER) +// feature tests for Microsoft's library +#elif defined(__EMSCRIPTEN__) +// emscripten doesn't support signals +#elif defined(__native_client__) +#else +// other standard libraries +#define ABSL_HAVE_ALARM 1 +#endif + +// ABSL_IS_LITTLE_ENDIAN +// ABSL_IS_BIG_ENDIAN +// +// Checks the endianness of the platform. +// +// Notes: uses the built in endian macros provided by GCC (since 4.6) and +// Clang (since 3.2); see +// https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html. +// Otherwise, if _WIN32, assume little endian. Otherwise, bail with an error. +#if defined(ABSL_IS_BIG_ENDIAN) +#error "ABSL_IS_BIG_ENDIAN cannot be directly set." +#endif +#if defined(ABSL_IS_LITTLE_ENDIAN) +#error "ABSL_IS_LITTLE_ENDIAN cannot be directly set." +#endif + +#if (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ + __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +#define ABSL_IS_LITTLE_ENDIAN 1 +#elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \ + __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +#define ABSL_IS_BIG_ENDIAN 1 +#elif defined(_WIN32) +#define ABSL_IS_LITTLE_ENDIAN 1 +#else +#error "absl endian detection needs to be set up for your compiler" +#endif + +// ABSL_HAVE_STD_ANY +// +// Checks whether C++17 std::any is available by checking whether exists. +#ifdef ABSL_HAVE_STD_ANY +#error "ABSL_HAVE_STD_ANY cannot be directly set." +#endif + +#ifdef __has_include +#if __has_include() && __cplusplus >= 201703L +#define ABSL_HAVE_STD_ANY 1 +#endif +#endif + +// ABSL_HAVE_STD_OPTIONAL +// +// Checks whether C++17 std::optional is available. +#ifdef ABSL_HAVE_STD_OPTIONAL +#error "ABSL_HAVE_STD_OPTIONAL cannot be directly set." +#endif + +#ifdef __has_include +#if __has_include() && __cplusplus >= 201703L +#define ABSL_HAVE_STD_OPTIONAL 1 +#endif +#endif + +// ABSL_HAVE_STD_VARIANT +// +// Checks whether C++17 std::variant is available. +#ifdef ABSL_HAVE_STD_VARIANT +#error "ABSL_HAVE_STD_VARIANT cannot be directly set." +#endif + +#ifdef __has_include +#if __has_include() && __cplusplus >= 201703L +#define ABSL_HAVE_STD_VARIANT 1 +#endif +#endif + +// ABSL_HAVE_STD_STRING_VIEW +// +// Checks whether C++17 std::string_view is available. +#ifdef ABSL_HAVE_STD_STRING_VIEW +#error "ABSL_HAVE_STD_STRING_VIEW cannot be directly set." +#endif + +#ifdef __has_include +#if __has_include() && __cplusplus >= 201703L +#define ABSL_HAVE_STD_STRING_VIEW 1 +#endif +#endif + +// For MSVC, `__has_include` is supported in VS 2017 15.3, which is later than +// the support for , , , . So we use +// _MSC_VER to check whether we have VS 2017 RTM (when , , +// , is implemented) or higher. Also, `__cplusplus` is +// not correctly set by MSVC, so we use `_MSVC_LANG` to check the language +// version. +// TODO(zhangxy): fix tests before enabling aliasing for `std::any`. +#if defined(_MSC_VER) && _MSC_VER >= 1910 && \ + ((defined(_MSVC_LANG) && _MSVC_LANG > 201402) || __cplusplus > 201402) +// #define ABSL_HAVE_STD_ANY 1 +#define ABSL_HAVE_STD_OPTIONAL 1 +#define ABSL_HAVE_STD_VARIANT 1 +#define ABSL_HAVE_STD_STRING_VIEW 1 +#endif + +// In debug mode, MSVC 2017's std::variant throws a EXCEPTION_ACCESS_VIOLATION +// SEH exception from emplace for variant when constructing the +// struct can throw. This defeats some of variant_test and +// variant_exception_safety_test. +#if defined(_MSC_VER) && _MSC_VER >= 1700 && defined(_DEBUG) +#define ABSL_INTERNAL_MSVC_2017_DBG_MODE +#endif + +#endif // ABSL_BASE_CONFIG_H_ diff --git a/libtgvoip/webrtc_dsp/absl/base/internal/atomic_hook.h b/libtgvoip/webrtc_dsp/absl/base/internal/atomic_hook.h new file mode 100755 index 0000000..b458511 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/base/internal/atomic_hook.h @@ -0,0 +1,165 @@ +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef ABSL_BASE_INTERNAL_ATOMIC_HOOK_H_ +#define ABSL_BASE_INTERNAL_ATOMIC_HOOK_H_ + +#include +#include +#include +#include + +#ifdef _MSC_FULL_VER +#define ABSL_HAVE_WORKING_ATOMIC_POINTER 0 +#else +#define ABSL_HAVE_WORKING_ATOMIC_POINTER 1 +#endif + +namespace absl { +namespace base_internal { + +template +class AtomicHook; + +// AtomicHook is a helper class, templatized on a raw function pointer type, for +// implementing Abseil customization hooks. It is a callable object that +// dispatches to the registered hook. +// +// A default constructed object performs a no-op (and returns a default +// constructed object) if no hook has been registered. +// +// Hooks can be pre-registered via constant initialization, for example, +// ABSL_CONST_INIT static AtomicHook my_hook(DefaultAction); +// and then changed at runtime via a call to Store(). +// +// Reads and writes guarantee memory_order_acquire/memory_order_release +// semantics. +template +class AtomicHook { + public: + using FnPtr = ReturnType (*)(Args...); + + // Constructs an object that by default performs a no-op (and + // returns a default constructed object) when no hook as been registered. + constexpr AtomicHook() : AtomicHook(DummyFunction) {} + + // Constructs an object that by default dispatches to/returns the + // pre-registered default_fn when no hook has been registered at runtime. +#if ABSL_HAVE_WORKING_ATOMIC_POINTER + explicit constexpr AtomicHook(FnPtr default_fn) + : hook_(default_fn), default_fn_(default_fn) {} +#else + explicit constexpr AtomicHook(FnPtr default_fn) + : hook_(kUninitialized), default_fn_(default_fn) {} +#endif + + // Stores the provided function pointer as the value for this hook. + // + // This is intended to be called once. Multiple calls are legal only if the + // same function pointer is provided for each call. The store is implemented + // as a memory_order_release operation, and read accesses are implemented as + // memory_order_acquire. + void Store(FnPtr fn) { + bool success = DoStore(fn); + static_cast(success); + assert(success); + } + + // Invokes the registered callback. If no callback has yet been registered, a + // default-constructed object of the appropriate type is returned instead. + template + ReturnType operator()(CallArgs&&... args) const { + return DoLoad()(std::forward(args)...); + } + + // Returns the registered callback, or nullptr if none has been registered. + // Useful if client code needs to conditionalize behavior based on whether a + // callback was registered. + // + // Note that atomic_hook.Load()() and atomic_hook() have different semantics: + // operator()() will perform a no-op if no callback was registered, while + // Load()() will dereference a null function pointer. Prefer operator()() to + // Load()() unless you must conditionalize behavior on whether a hook was + // registered. + FnPtr Load() const { + FnPtr ptr = DoLoad(); + return (ptr == DummyFunction) ? nullptr : ptr; + } + + private: + static ReturnType DummyFunction(Args...) { + return ReturnType(); + } + + // Current versions of MSVC (as of September 2017) have a broken + // implementation of std::atomic: Its constructor attempts to do the + // equivalent of a reinterpret_cast in a constexpr context, which is not + // allowed. + // + // This causes an issue when building with LLVM under Windows. To avoid this, + // we use a less-efficient, intptr_t-based implementation on Windows. +#if ABSL_HAVE_WORKING_ATOMIC_POINTER + // Return the stored value, or DummyFunction if no value has been stored. + FnPtr DoLoad() const { return hook_.load(std::memory_order_acquire); } + + // Store the given value. Returns false if a different value was already + // stored to this object. + bool DoStore(FnPtr fn) { + assert(fn); + FnPtr expected = default_fn_; + const bool store_succeeded = hook_.compare_exchange_strong( + expected, fn, std::memory_order_acq_rel, std::memory_order_acquire); + const bool same_value_already_stored = (expected == fn); + return store_succeeded || same_value_already_stored; + } + + std::atomic hook_; +#else // !ABSL_HAVE_WORKING_ATOMIC_POINTER + // Use a sentinel value unlikely to be the address of an actual function. + static constexpr intptr_t kUninitialized = 0; + + static_assert(sizeof(intptr_t) >= sizeof(FnPtr), + "intptr_t can't contain a function pointer"); + + FnPtr DoLoad() const { + const intptr_t value = hook_.load(std::memory_order_acquire); + if (value == kUninitialized) { + return default_fn_; + } + return reinterpret_cast(value); + } + + bool DoStore(FnPtr fn) { + assert(fn); + const auto value = reinterpret_cast(fn); + intptr_t expected = kUninitialized; + const bool store_succeeded = hook_.compare_exchange_strong( + expected, value, std::memory_order_acq_rel, std::memory_order_acquire); + const bool same_value_already_stored = (expected == value); + return store_succeeded || same_value_already_stored; + } + + std::atomic hook_; +#endif + + const FnPtr default_fn_; +}; + +#undef ABSL_HAVE_WORKING_ATOMIC_POINTER + +} // namespace base_internal +} // namespace absl + +#endif // ABSL_BASE_INTERNAL_ATOMIC_HOOK_H_ diff --git a/libtgvoip/webrtc_dsp/absl/base/internal/identity.h b/libtgvoip/webrtc_dsp/absl/base/internal/identity.h new file mode 100755 index 0000000..a1a5d70 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/base/internal/identity.h @@ -0,0 +1,33 @@ +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef ABSL_BASE_INTERNAL_IDENTITY_H_ +#define ABSL_BASE_INTERNAL_IDENTITY_H_ + +namespace absl { +namespace internal { + +template +struct identity { + typedef T type; +}; + +template +using identity_t = typename identity::type; + +} // namespace internal +} // namespace absl + +#endif // ABSL_BASE_INTERNAL_IDENTITY_H_ diff --git a/libtgvoip/webrtc_dsp/absl/base/internal/inline_variable.h b/libtgvoip/webrtc_dsp/absl/base/internal/inline_variable.h new file mode 100755 index 0000000..f7bb8c5 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/base/internal/inline_variable.h @@ -0,0 +1,107 @@ +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_BASE_INTERNAL_INLINE_VARIABLE_EMULATION_H_ +#define ABSL_BASE_INTERNAL_INLINE_VARIABLE_EMULATION_H_ + +#include + +#include "absl/base/internal/identity.h" + +// File: +// This file define a macro that allows the creation of or emulation of C++17 +// inline variables based on whether or not the feature is supported. + +//////////////////////////////////////////////////////////////////////////////// +// Macro: ABSL_INTERNAL_INLINE_CONSTEXPR(type, name, init) +// +// Description: +// Expands to the equivalent of an inline constexpr instance of the specified +// `type` and `name`, initialized to the value `init`. If the compiler being +// used is detected as supporting actual inline variables as a language +// feature, then the macro expands to an actual inline variable definition. +// +// Requires: +// `type` is a type that is usable in an extern variable declaration. +// +// Requires: `name` is a valid identifier +// +// Requires: +// `init` is an expression that can be used in the following definition: +// constexpr type name = init; +// +// Usage: +// +// // Equivalent to: `inline constexpr size_t variant_npos = -1;` +// ABSL_INTERNAL_INLINE_CONSTEXPR(size_t, variant_npos, -1); +// +// Differences in implementation: +// For a direct, language-level inline variable, decltype(name) will be the +// type that was specified along with const qualification, whereas for +// emulated inline variables, decltype(name) may be different (in practice +// it will likely be a reference type). +//////////////////////////////////////////////////////////////////////////////// + +#ifdef __cpp_inline_variables + +// Clang's -Wmissing-variable-declarations option erroneously warned that +// inline constexpr objects need to be pre-declared. This has now been fixed, +// but we will need to support this workaround for people building with older +// versions of clang. +// +// Bug: https://bugs.llvm.org/show_bug.cgi?id=35862 +// +// Note: +// identity_t is used here so that the const and name are in the +// appropriate place for pointer types, reference types, function pointer +// types, etc.. +#if defined(__clang__) +#define ABSL_INTERNAL_EXTERN_DECL(type, name) \ + extern const ::absl::internal::identity_t name; +#else // Otherwise, just define the macro to do nothing. +#define ABSL_INTERNAL_EXTERN_DECL(type, name) +#endif // defined(__clang__) + +// See above comment at top of file for details. +#define ABSL_INTERNAL_INLINE_CONSTEXPR(type, name, init) \ + ABSL_INTERNAL_EXTERN_DECL(type, name) \ + inline constexpr ::absl::internal::identity_t name = init + +#else + +// See above comment at top of file for details. +// +// Note: +// identity_t is used here so that the const and name are in the +// appropriate place for pointer types, reference types, function pointer +// types, etc.. +#define ABSL_INTERNAL_INLINE_CONSTEXPR(var_type, name, init) \ + template \ + struct AbslInternalInlineVariableHolder##name { \ + static constexpr ::absl::internal::identity_t kInstance = init; \ + }; \ + \ + template \ + constexpr ::absl::internal::identity_t \ + AbslInternalInlineVariableHolder##name::kInstance; \ + \ + static constexpr const ::absl::internal::identity_t& \ + name = /* NOLINT */ \ + AbslInternalInlineVariableHolder##name<>::kInstance; \ + static_assert(sizeof(void (*)(decltype(name))) != 0, \ + "Silence unused variable warnings.") + +#endif // __cpp_inline_variables + +#endif // ABSL_BASE_INTERNAL_INLINE_VARIABLE_EMULATION_H_ diff --git a/libtgvoip/webrtc_dsp/absl/base/internal/invoke.h b/libtgvoip/webrtc_dsp/absl/base/internal/invoke.h new file mode 100755 index 0000000..8c3f4f6 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/base/internal/invoke.h @@ -0,0 +1,188 @@ +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// absl::base_internal::Invoke(f, args...) is an implementation of +// INVOKE(f, args...) from section [func.require] of the C++ standard. +// +// [func.require] +// Define INVOKE (f, t1, t2, ..., tN) as follows: +// 1. (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T +// and t1 is an object of type T or a reference to an object of type T or a +// reference to an object of a type derived from T; +// 2. ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a +// class T and t1 is not one of the types described in the previous item; +// 3. t1.*f when N == 1 and f is a pointer to member data of a class T and t1 is +// an object of type T or a reference to an object of type T or a reference +// to an object of a type derived from T; +// 4. (*t1).*f when N == 1 and f is a pointer to member data of a class T and t1 +// is not one of the types described in the previous item; +// 5. f(t1, t2, ..., tN) in all other cases. +// +// The implementation is SFINAE-friendly: substitution failure within Invoke() +// isn't an error. + +#ifndef ABSL_BASE_INTERNAL_INVOKE_H_ +#define ABSL_BASE_INTERNAL_INVOKE_H_ + +#include +#include +#include + +// The following code is internal implementation detail. See the comment at the +// top of this file for the API documentation. + +namespace absl { +namespace base_internal { + +// The five classes below each implement one of the clauses from the definition +// of INVOKE. The inner class template Accept checks whether the +// clause is applicable; static function template Invoke(f, args...) does the +// invocation. +// +// By separating the clause selection logic from invocation we make sure that +// Invoke() does exactly what the standard says. + +template +struct StrippedAccept { + template + struct Accept : Derived::template AcceptImpl::type>::type...> {}; +}; + +// (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T +// and t1 is an object of type T or a reference to an object of type T or a +// reference to an object of a type derived from T. +struct MemFunAndRef : StrippedAccept { + template + struct AcceptImpl : std::false_type {}; + + template + struct AcceptImpl + : std::is_base_of {}; + + template + struct AcceptImpl + : std::is_base_of {}; + + template + static decltype((std::declval().* + std::declval())(std::declval()...)) + Invoke(MemFun&& mem_fun, Obj&& obj, Args&&... args) { + return (std::forward(obj).* + std::forward(mem_fun))(std::forward(args)...); + } +}; + +// ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a +// class T and t1 is not one of the types described in the previous item. +struct MemFunAndPtr : StrippedAccept { + template + struct AcceptImpl : std::false_type {}; + + template + struct AcceptImpl + : std::integral_constant::value> {}; + + template + struct AcceptImpl + : std::integral_constant::value> {}; + + template + static decltype(((*std::declval()).* + std::declval())(std::declval()...)) + Invoke(MemFun&& mem_fun, Ptr&& ptr, Args&&... args) { + return ((*std::forward(ptr)).* + std::forward(mem_fun))(std::forward(args)...); + } +}; + +// t1.*f when N == 1 and f is a pointer to member data of a class T and t1 is +// an object of type T or a reference to an object of type T or a reference +// to an object of a type derived from T. +struct DataMemAndRef : StrippedAccept { + template + struct AcceptImpl : std::false_type {}; + + template + struct AcceptImpl : std::is_base_of {}; + + template + static decltype(std::declval().*std::declval()) Invoke( + DataMem&& data_mem, Ref&& ref) { + return std::forward(ref).*std::forward(data_mem); + } +}; + +// (*t1).*f when N == 1 and f is a pointer to member data of a class T and t1 +// is not one of the types described in the previous item. +struct DataMemAndPtr : StrippedAccept { + template + struct AcceptImpl : std::false_type {}; + + template + struct AcceptImpl + : std::integral_constant::value> {}; + + template + static decltype((*std::declval()).*std::declval()) Invoke( + DataMem&& data_mem, Ptr&& ptr) { + return (*std::forward(ptr)).*std::forward(data_mem); + } +}; + +// f(t1, t2, ..., tN) in all other cases. +struct Callable { + // Callable doesn't have Accept because it's the last clause that gets picked + // when none of the previous clauses are applicable. + template + static decltype(std::declval()(std::declval()...)) Invoke( + F&& f, Args&&... args) { + return std::forward(f)(std::forward(args)...); + } +}; + +// Resolves to the first matching clause. +template +struct Invoker { + typedef typename std::conditional< + MemFunAndRef::Accept::value, MemFunAndRef, + typename std::conditional< + MemFunAndPtr::Accept::value, MemFunAndPtr, + typename std::conditional< + DataMemAndRef::Accept::value, DataMemAndRef, + typename std::conditional::value, + DataMemAndPtr, Callable>::type>::type>:: + type>::type type; +}; + +// The result type of Invoke. +template +using InvokeT = decltype(Invoker::type::Invoke( + std::declval(), std::declval()...)); + +// Invoke(f, args...) is an implementation of INVOKE(f, args...) from section +// [func.require] of the C++ standard. +template +InvokeT Invoke(F&& f, Args&&... args) { + return Invoker::type::Invoke(std::forward(f), + std::forward(args)...); +} +} // namespace base_internal +} // namespace absl + +#endif // ABSL_BASE_INTERNAL_INVOKE_H_ diff --git a/libtgvoip/webrtc_dsp/absl/base/internal/raw_logging.cc b/libtgvoip/webrtc_dsp/absl/base/internal/raw_logging.cc new file mode 100755 index 0000000..d9485a6 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/base/internal/raw_logging.cc @@ -0,0 +1,234 @@ +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/base/internal/raw_logging.h" + +#include +#include +#include +#include +#include + +#include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/base/internal/atomic_hook.h" +#include "absl/base/log_severity.h" + +// We know how to perform low-level writes to stderr in POSIX and Windows. For +// these platforms, we define the token ABSL_LOW_LEVEL_WRITE_SUPPORTED. +// Much of raw_logging.cc becomes a no-op when we can't output messages, +// although a FATAL ABSL_RAW_LOG message will still abort the process. + +// ABSL_HAVE_POSIX_WRITE is defined when the platform provides posix write() +// (as from unistd.h) +// +// This preprocessor token is also defined in raw_io.cc. If you need to copy +// this, consider moving both to config.h instead. +#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ + defined(__Fuchsia__) || defined(__native_client__) +#include + + +#define ABSL_HAVE_POSIX_WRITE 1 +#define ABSL_LOW_LEVEL_WRITE_SUPPORTED 1 +#else +#undef ABSL_HAVE_POSIX_WRITE +#endif + +// ABSL_HAVE_SYSCALL_WRITE is defined when the platform provides the syscall +// syscall(SYS_write, /*int*/ fd, /*char* */ buf, /*size_t*/ len); +// for low level operations that want to avoid libc. +#if (defined(__linux__) || defined(__FreeBSD__)) && !defined(__ANDROID__) +#include +#define ABSL_HAVE_SYSCALL_WRITE 1 +#define ABSL_LOW_LEVEL_WRITE_SUPPORTED 1 +#else +#undef ABSL_HAVE_SYSCALL_WRITE +#endif + +#ifdef _WIN32 +#include + +#define ABSL_HAVE_RAW_IO 1 +#define ABSL_LOW_LEVEL_WRITE_SUPPORTED 1 +#else +#undef ABSL_HAVE_RAW_IO +#endif + +// TODO(gfalcon): We want raw-logging to work on as many platforms as possible. +// Explicitly #error out when not ABSL_LOW_LEVEL_WRITE_SUPPORTED, except for a +// whitelisted set of platforms for which we expect not to be able to raw log. + +ABSL_CONST_INIT static absl::base_internal::AtomicHook< + absl::raw_logging_internal::LogPrefixHook> log_prefix_hook; +ABSL_CONST_INIT static absl::base_internal::AtomicHook< + absl::raw_logging_internal::AbortHook> abort_hook; + +#ifdef ABSL_LOW_LEVEL_WRITE_SUPPORTED +static const char kTruncated[] = " ... (message truncated)\n"; + +// sprintf the format to the buffer, adjusting *buf and *size to reflect the +// consumed bytes, and return whether the message fit without truncation. If +// truncation occurred, if possible leave room in the buffer for the message +// kTruncated[]. +inline static bool VADoRawLog(char** buf, int* size, const char* format, + va_list ap) ABSL_PRINTF_ATTRIBUTE(3, 0); +inline static bool VADoRawLog(char** buf, int* size, + const char* format, va_list ap) { + int n = vsnprintf(*buf, *size, format, ap); + bool result = true; + if (n < 0 || n > *size) { + result = false; + if (static_cast(*size) > sizeof(kTruncated)) { + n = *size - sizeof(kTruncated); // room for truncation message + } else { + n = 0; // no room for truncation message + } + } + *size -= n; + *buf += n; + return result; +} +#endif // ABSL_LOW_LEVEL_WRITE_SUPPORTED + +static constexpr int kLogBufSize = 3000; + +namespace { + +// CAVEAT: vsnprintf called from *DoRawLog below has some (exotic) code paths +// that invoke malloc() and getenv() that might acquire some locks. + +// Helper for RawLog below. +// *DoRawLog writes to *buf of *size and move them past the written portion. +// It returns true iff there was no overflow or error. +bool DoRawLog(char** buf, int* size, const char* format, ...) + ABSL_PRINTF_ATTRIBUTE(3, 4); +bool DoRawLog(char** buf, int* size, const char* format, ...) { + va_list ap; + va_start(ap, format); + int n = vsnprintf(*buf, *size, format, ap); + va_end(ap); + if (n < 0 || n > *size) return false; + *size -= n; + *buf += n; + return true; +} + +void RawLogVA(absl::LogSeverity severity, const char* file, int line, + const char* format, va_list ap) ABSL_PRINTF_ATTRIBUTE(4, 0); +void RawLogVA(absl::LogSeverity severity, const char* file, int line, + const char* format, va_list ap) { + char buffer[kLogBufSize]; + char* buf = buffer; + int size = sizeof(buffer); +#ifdef ABSL_LOW_LEVEL_WRITE_SUPPORTED + bool enabled = true; +#else + bool enabled = false; +#endif + +#ifdef ABSL_MIN_LOG_LEVEL + if (severity < static_cast(ABSL_MIN_LOG_LEVEL) && + severity < absl::LogSeverity::kFatal) { + enabled = false; + } +#endif + + auto log_prefix_hook_ptr = log_prefix_hook.Load(); + if (log_prefix_hook_ptr) { + enabled = log_prefix_hook_ptr(severity, file, line, &buf, &size); + } else { + if (enabled) { + DoRawLog(&buf, &size, "[%s : %d] RAW: ", file, line); + } + } + const char* const prefix_end = buf; + +#ifdef ABSL_LOW_LEVEL_WRITE_SUPPORTED + if (enabled) { + bool no_chop = VADoRawLog(&buf, &size, format, ap); + if (no_chop) { + DoRawLog(&buf, &size, "\n"); + } else { + DoRawLog(&buf, &size, "%s", kTruncated); + } + absl::raw_logging_internal::SafeWriteToStderr(buffer, strlen(buffer)); + } +#else + static_cast(format); + static_cast(ap); +#endif + + // Abort the process after logging a FATAL message, even if the output itself + // was suppressed. + if (severity == absl::LogSeverity::kFatal) { + abort_hook(file, line, buffer, prefix_end, buffer + kLogBufSize); + abort(); + } +} + +} // namespace + +namespace absl { +namespace raw_logging_internal { +void SafeWriteToStderr(const char *s, size_t len) { +#if defined(ABSL_HAVE_SYSCALL_WRITE) + syscall(SYS_write, STDERR_FILENO, s, len); +#elif defined(ABSL_HAVE_POSIX_WRITE) + write(STDERR_FILENO, s, len); +#elif defined(ABSL_HAVE_RAW_IO) + _write(/* stderr */ 2, s, len); +#else + // stderr logging unsupported on this platform + (void) s; + (void) len; +#endif +} + +void RawLog(absl::LogSeverity severity, const char* file, int line, + const char* format, ...) ABSL_PRINTF_ATTRIBUTE(4, 5); +void RawLog(absl::LogSeverity severity, const char* file, int line, + const char* format, ...) { + va_list ap; + va_start(ap, format); + RawLogVA(severity, file, line, format, ap); + va_end(ap); +} + +// Non-formatting version of RawLog(). +// +// TODO(gfalcon): When string_view no longer depends on base, change this +// interface to take its message as a string_view instead. +static void DefaultInternalLog(absl::LogSeverity severity, const char* file, + int line, const std::string& message) { + RawLog(severity, file, line, "%s", message.c_str()); +} + +bool RawLoggingFullySupported() { +#ifdef ABSL_LOW_LEVEL_WRITE_SUPPORTED + return true; +#else // !ABSL_LOW_LEVEL_WRITE_SUPPORTED + return false; +#endif // !ABSL_LOW_LEVEL_WRITE_SUPPORTED +} + +ABSL_CONST_INIT absl::base_internal::AtomicHook + internal_log_function(DefaultInternalLog); + +void RegisterInternalLogFunction(InternalLogFunction func) { + internal_log_function.Store(func); +} + +} // namespace raw_logging_internal +} // namespace absl diff --git a/libtgvoip/webrtc_dsp/absl/base/internal/raw_logging.h b/libtgvoip/webrtc_dsp/absl/base/internal/raw_logging.h new file mode 100755 index 0000000..79a7bb9 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/base/internal/raw_logging.h @@ -0,0 +1,180 @@ +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Thread-safe logging routines that do not allocate any memory or +// acquire any locks, and can therefore be used by low-level memory +// allocation, synchronization, and signal-handling code. + +#ifndef ABSL_BASE_INTERNAL_RAW_LOGGING_H_ +#define ABSL_BASE_INTERNAL_RAW_LOGGING_H_ + +#include + +#include "absl/base/attributes.h" +#include "absl/base/internal/atomic_hook.h" +#include "absl/base/log_severity.h" +#include "absl/base/macros.h" +#include "absl/base/port.h" + +// This is similar to LOG(severity) << format..., but +// * it is to be used ONLY by low-level modules that can't use normal LOG() +// * it is designed to be a low-level logger that does not allocate any +// memory and does not need any locks, hence: +// * it logs straight and ONLY to STDERR w/o buffering +// * it uses an explicit printf-format and arguments list +// * it will silently chop off really long message strings +// Usage example: +// ABSL_RAW_LOG(ERROR, "Failed foo with %i: %s", status, error); +// This will print an almost standard log line like this to stderr only: +// E0821 211317 file.cc:123] RAW: Failed foo with 22: bad_file +#define ABSL_RAW_LOG(severity, ...) \ + do { \ + constexpr const char* absl_raw_logging_internal_basename = \ + ::absl::raw_logging_internal::Basename(__FILE__, \ + sizeof(__FILE__) - 1); \ + ::absl::raw_logging_internal::RawLog(ABSL_RAW_LOGGING_INTERNAL_##severity, \ + absl_raw_logging_internal_basename, \ + __LINE__, __VA_ARGS__); \ + } while (0) + +// Similar to CHECK(condition) << message, but for low-level modules: +// we use only ABSL_RAW_LOG that does not allocate memory. +// We do not want to provide args list here to encourage this usage: +// if (!cond) ABSL_RAW_LOG(FATAL, "foo ...", hard_to_compute_args); +// so that the args are not computed when not needed. +#define ABSL_RAW_CHECK(condition, message) \ + do { \ + if (ABSL_PREDICT_FALSE(!(condition))) { \ + ABSL_RAW_LOG(FATAL, "Check %s failed: %s", #condition, message); \ + } \ + } while (0) + +// ABSL_INTERNAL_LOG and ABSL_INTERNAL_CHECK work like the RAW variants above, +// except that if the richer log library is linked into the binary, we dispatch +// to that instead. This is potentially useful for internal logging and +// assertions, where we are using RAW_LOG neither for its async-signal-safety +// nor for its non-allocating nature, but rather because raw logging has very +// few other dependencies. +// +// The API is a subset of the above: each macro only takes two arguments. Use +// StrCat if you need to build a richer message. +#define ABSL_INTERNAL_LOG(severity, message) \ + do { \ + constexpr const char* absl_raw_logging_internal_basename = \ + ::absl::raw_logging_internal::Basename(__FILE__, \ + sizeof(__FILE__) - 1); \ + ::absl::raw_logging_internal::internal_log_function( \ + ABSL_RAW_LOGGING_INTERNAL_##severity, \ + absl_raw_logging_internal_basename, __LINE__, message); \ + } while (0) + +#define ABSL_INTERNAL_CHECK(condition, message) \ + do { \ + if (ABSL_PREDICT_FALSE(!(condition))) { \ + std::string death_message = "Check " #condition " failed: "; \ + death_message += std::string(message); \ + ABSL_INTERNAL_LOG(FATAL, death_message); \ + } \ + } while (0) + +#define ABSL_RAW_LOGGING_INTERNAL_INFO ::absl::LogSeverity::kInfo +#define ABSL_RAW_LOGGING_INTERNAL_WARNING ::absl::LogSeverity::kWarning +#define ABSL_RAW_LOGGING_INTERNAL_ERROR ::absl::LogSeverity::kError +#define ABSL_RAW_LOGGING_INTERNAL_FATAL ::absl::LogSeverity::kFatal +#define ABSL_RAW_LOGGING_INTERNAL_LEVEL(severity) \ + ::absl::NormalizeLogSeverity(severity) + +namespace absl { +namespace raw_logging_internal { + +// Helper function to implement ABSL_RAW_LOG +// Logs format... at "severity" level, reporting it +// as called from file:line. +// This does not allocate memory or acquire locks. +void RawLog(absl::LogSeverity severity, const char* file, int line, + const char* format, ...) ABSL_PRINTF_ATTRIBUTE(4, 5); + +// Writes the provided buffer directly to stderr, in a safe, low-level manner. +// +// In POSIX this means calling write(), which is async-signal safe and does +// not malloc. If the platform supports the SYS_write syscall, we invoke that +// directly to side-step any libc interception. +void SafeWriteToStderr(const char *s, size_t len); + +// compile-time function to get the "base" filename, that is, the part of +// a filename after the last "/" or "\" path separator. The search starts at +// the end of the string; the second parameter is the length of the string. +constexpr const char* Basename(const char* fname, int offset) { + return offset == 0 || fname[offset - 1] == '/' || fname[offset - 1] == '\\' + ? fname + offset + : Basename(fname, offset - 1); +} + +// For testing only. +// Returns true if raw logging is fully supported. When it is not +// fully supported, no messages will be emitted, but a log at FATAL +// severity will cause an abort. +// +// TODO(gfalcon): Come up with a better name for this method. +bool RawLoggingFullySupported(); + +// Function type for a raw_logging customization hook for suppressing messages +// by severity, and for writing custom prefixes on non-suppressed messages. +// +// The installed hook is called for every raw log invocation. The message will +// be logged to stderr only if the hook returns true. FATAL errors will cause +// the process to abort, even if writing to stderr is suppressed. The hook is +// also provided with an output buffer, where it can write a custom log message +// prefix. +// +// The raw_logging system does not allocate memory or grab locks. User-provided +// hooks must avoid these operations, and must not throw exceptions. +// +// 'severity' is the severity level of the message being written. +// 'file' and 'line' are the file and line number where the ABSL_RAW_LOG macro +// was located. +// 'buffer' and 'buf_size' are pointers to the buffer and buffer size. If the +// hook writes a prefix, it must increment *buffer and decrement *buf_size +// accordingly. +using LogPrefixHook = bool (*)(absl::LogSeverity severity, const char* file, + int line, char** buffer, int* buf_size); + +// Function type for a raw_logging customization hook called to abort a process +// when a FATAL message is logged. If the provided AbortHook() returns, the +// logging system will call abort(). +// +// 'file' and 'line' are the file and line number where the ABSL_RAW_LOG macro +// was located. +// The null-terminated logged message lives in the buffer between 'buf_start' +// and 'buf_end'. 'prefix_end' points to the first non-prefix character of the +// buffer (as written by the LogPrefixHook.) +using AbortHook = void (*)(const char* file, int line, const char* buf_start, + const char* prefix_end, const char* buf_end); + +// Internal logging function for ABSL_INTERNAL_LOG to dispatch to. +// +// TODO(gfalcon): When string_view no longer depends on base, change this +// interface to take its message as a string_view instead. +using InternalLogFunction = void (*)(absl::LogSeverity severity, + const char* file, int line, + const std::string& message); + +extern base_internal::AtomicHook internal_log_function; + +void RegisterInternalLogFunction(InternalLogFunction func); + +} // namespace raw_logging_internal +} // namespace absl + +#endif // ABSL_BASE_INTERNAL_RAW_LOGGING_H_ diff --git a/libtgvoip/webrtc_dsp/absl/base/internal/throw_delegate.cc b/libtgvoip/webrtc_dsp/absl/base/internal/throw_delegate.cc new file mode 100755 index 0000000..46dc573 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/base/internal/throw_delegate.cc @@ -0,0 +1,106 @@ +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/base/internal/throw_delegate.h" + +#include +#include +#include +#include +#include "absl/base/config.h" +#include "absl/base/internal/raw_logging.h" + +namespace absl { +namespace base_internal { + +namespace { +template +[[noreturn]] void Throw(const T& error) { +#ifdef ABSL_HAVE_EXCEPTIONS + throw error; +#else + ABSL_RAW_LOG(ERROR, "%s", error.what()); + abort(); +#endif +} +} // namespace + +void ThrowStdLogicError(const std::string& what_arg) { + Throw(std::logic_error(what_arg)); +} +void ThrowStdLogicError(const char* what_arg) { + Throw(std::logic_error(what_arg)); +} +void ThrowStdInvalidArgument(const std::string& what_arg) { + Throw(std::invalid_argument(what_arg)); +} +void ThrowStdInvalidArgument(const char* what_arg) { + Throw(std::invalid_argument(what_arg)); +} + +void ThrowStdDomainError(const std::string& what_arg) { + Throw(std::domain_error(what_arg)); +} +void ThrowStdDomainError(const char* what_arg) { + Throw(std::domain_error(what_arg)); +} + +void ThrowStdLengthError(const std::string& what_arg) { + Throw(std::length_error(what_arg)); +} +void ThrowStdLengthError(const char* what_arg) { + Throw(std::length_error(what_arg)); +} + +void ThrowStdOutOfRange(const std::string& what_arg) { + Throw(std::out_of_range(what_arg)); +} +void ThrowStdOutOfRange(const char* what_arg) { + Throw(std::out_of_range(what_arg)); +} + +void ThrowStdRuntimeError(const std::string& what_arg) { + Throw(std::runtime_error(what_arg)); +} +void ThrowStdRuntimeError(const char* what_arg) { + Throw(std::runtime_error(what_arg)); +} + +void ThrowStdRangeError(const std::string& what_arg) { + Throw(std::range_error(what_arg)); +} +void ThrowStdRangeError(const char* what_arg) { + Throw(std::range_error(what_arg)); +} + +void ThrowStdOverflowError(const std::string& what_arg) { + Throw(std::overflow_error(what_arg)); +} +void ThrowStdOverflowError(const char* what_arg) { + Throw(std::overflow_error(what_arg)); +} + +void ThrowStdUnderflowError(const std::string& what_arg) { + Throw(std::underflow_error(what_arg)); +} +void ThrowStdUnderflowError(const char* what_arg) { + Throw(std::underflow_error(what_arg)); +} + +void ThrowStdBadFunctionCall() { Throw(std::bad_function_call()); } + +void ThrowStdBadAlloc() { Throw(std::bad_alloc()); } + +} // namespace base_internal +} // namespace absl diff --git a/libtgvoip/webrtc_dsp/absl/base/internal/throw_delegate.h b/libtgvoip/webrtc_dsp/absl/base/internal/throw_delegate.h new file mode 100755 index 0000000..70e2d77 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/base/internal/throw_delegate.h @@ -0,0 +1,71 @@ +// +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef ABSL_BASE_INTERNAL_THROW_DELEGATE_H_ +#define ABSL_BASE_INTERNAL_THROW_DELEGATE_H_ + +#include + +namespace absl { +namespace base_internal { + +// Helper functions that allow throwing exceptions consistently from anywhere. +// The main use case is for header-based libraries (eg templates), as they will +// be built by many different targets with their own compiler options. +// In particular, this will allow a safe way to throw exceptions even if the +// caller is compiled with -fno-exceptions. This is intended for implementing +// things like map<>::at(), which the standard documents as throwing an +// exception on error. +// +// Using other techniques like #if tricks could lead to ODR violations. +// +// You shouldn't use it unless you're writing code that you know will be built +// both with and without exceptions and you need to conform to an interface +// that uses exceptions. + +[[noreturn]] void ThrowStdLogicError(const std::string& what_arg); +[[noreturn]] void ThrowStdLogicError(const char* what_arg); +[[noreturn]] void ThrowStdInvalidArgument(const std::string& what_arg); +[[noreturn]] void ThrowStdInvalidArgument(const char* what_arg); +[[noreturn]] void ThrowStdDomainError(const std::string& what_arg); +[[noreturn]] void ThrowStdDomainError(const char* what_arg); +[[noreturn]] void ThrowStdLengthError(const std::string& what_arg); +[[noreturn]] void ThrowStdLengthError(const char* what_arg); +[[noreturn]] void ThrowStdOutOfRange(const std::string& what_arg); +[[noreturn]] void ThrowStdOutOfRange(const char* what_arg); +[[noreturn]] void ThrowStdRuntimeError(const std::string& what_arg); +[[noreturn]] void ThrowStdRuntimeError(const char* what_arg); +[[noreturn]] void ThrowStdRangeError(const std::string& what_arg); +[[noreturn]] void ThrowStdRangeError(const char* what_arg); +[[noreturn]] void ThrowStdOverflowError(const std::string& what_arg); +[[noreturn]] void ThrowStdOverflowError(const char* what_arg); +[[noreturn]] void ThrowStdUnderflowError(const std::string& what_arg); +[[noreturn]] void ThrowStdUnderflowError(const char* what_arg); + +[[noreturn]] void ThrowStdBadFunctionCall(); +[[noreturn]] void ThrowStdBadAlloc(); + +// ThrowStdBadArrayNewLength() cannot be consistently supported because +// std::bad_array_new_length is missing in libstdc++ until 4.9.0. +// https://gcc.gnu.org/onlinedocs/gcc-4.8.3/libstdc++/api/a01379_source.html +// https://gcc.gnu.org/onlinedocs/gcc-4.9.0/libstdc++/api/a01327_source.html +// libcxx (as of 3.2) and msvc (as of 2015) both have it. +// [[noreturn]] void ThrowStdBadArrayNewLength(); + +} // namespace base_internal +} // namespace absl + +#endif // ABSL_BASE_INTERNAL_THROW_DELEGATE_H_ diff --git a/libtgvoip/webrtc_dsp/absl/base/log_severity.h b/libtgvoip/webrtc_dsp/absl/base/log_severity.h new file mode 100755 index 0000000..5770d36 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/base/log_severity.h @@ -0,0 +1,67 @@ +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef ABSL_BASE_INTERNAL_LOG_SEVERITY_H_ +#define ABSL_BASE_INTERNAL_LOG_SEVERITY_H_ + +#include + +#include "absl/base/attributes.h" + +namespace absl { + +// Four severity levels are defined. Logging APIs should terminate the program +// when a message is logged at severity `kFatal`; the other levels have no +// special semantics. +enum class LogSeverity : int { + kInfo = 0, + kWarning = 1, + kError = 2, + kFatal = 3, +}; + +// Returns an iterable of all standard `absl::LogSeverity` values, ordered from +// least to most severe. +constexpr std::array LogSeverities() { + return {{absl::LogSeverity::kInfo, absl::LogSeverity::kWarning, + absl::LogSeverity::kError, absl::LogSeverity::kFatal}}; +} + +// Returns the all-caps string representation (e.g. "INFO") of the specified +// severity level if it is one of the normal levels and "UNKNOWN" otherwise. +constexpr const char* LogSeverityName(absl::LogSeverity s) { + return s == absl::LogSeverity::kInfo + ? "INFO" + : s == absl::LogSeverity::kWarning + ? "WARNING" + : s == absl::LogSeverity::kError + ? "ERROR" + : s == absl::LogSeverity::kFatal ? "FATAL" : "UNKNOWN"; +} + +// Values less than `kInfo` normalize to `kInfo`; values greater than `kFatal` +// normalize to `kError` (**NOT** `kFatal`). +constexpr absl::LogSeverity NormalizeLogSeverity(absl::LogSeverity s) { + return s < absl::LogSeverity::kInfo + ? absl::LogSeverity::kInfo + : s > absl::LogSeverity::kFatal ? absl::LogSeverity::kError : s; +} +constexpr absl::LogSeverity NormalizeLogSeverity(int s) { + return NormalizeLogSeverity(static_cast(s)); +} + +} // namespace absl + +#endif // ABSL_BASE_INTERNAL_LOG_SEVERITY_H_ diff --git a/libtgvoip/webrtc_dsp/absl/base/macros.h b/libtgvoip/webrtc_dsp/absl/base/macros.h new file mode 100755 index 0000000..9e7ab37 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/base/macros.h @@ -0,0 +1,212 @@ +// +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ----------------------------------------------------------------------------- +// File: macros.h +// ----------------------------------------------------------------------------- +// +// This header file defines the set of language macros used within Abseil code. +// For the set of macros used to determine supported compilers and platforms, +// see absl/base/config.h instead. +// +// This code is compiled directly on many platforms, including client +// platforms like Windows, Mac, and embedded systems. Before making +// any changes here, make sure that you're not breaking any platforms. +// + +#ifndef ABSL_BASE_MACROS_H_ +#define ABSL_BASE_MACROS_H_ + +#include +#include + +#include "absl/base/port.h" + +// ABSL_ARRAYSIZE() +// +// Returns the number of elements in an array as a compile-time constant, which +// can be used in defining new arrays. If you use this macro on a pointer by +// mistake, you will get a compile-time error. +#define ABSL_ARRAYSIZE(array) \ + (sizeof(::absl::macros_internal::ArraySizeHelper(array))) + +namespace absl { +namespace macros_internal { +// Note: this internal template function declaration is used by ABSL_ARRAYSIZE. +// The function doesn't need a definition, as we only use its type. +template +auto ArraySizeHelper(const T (&array)[N]) -> char (&)[N]; +} // namespace macros_internal +} // namespace absl + +// kLinkerInitialized +// +// An enum used only as a constructor argument to indicate that a variable has +// static storage duration, and that the constructor should do nothing to its +// state. Use of this macro indicates to the reader that it is legal to +// declare a static instance of the class, provided the constructor is given +// the absl::base_internal::kLinkerInitialized argument. +// +// Normally, it is unsafe to declare a static variable that has a constructor or +// a destructor because invocation order is undefined. However, if the type can +// be zero-initialized (which the loader does for static variables) into a valid +// state and the type's destructor does not affect storage, then a constructor +// for static initialization can be declared. +// +// Example: +// // Declaration +// explicit MyClass(absl::base_internal:LinkerInitialized x) {} +// +// // Invocation +// static MyClass my_global(absl::base_internal::kLinkerInitialized); +namespace absl { +namespace base_internal { +enum LinkerInitialized { + kLinkerInitialized = 0, +}; +} // namespace base_internal +} // namespace absl + +// ABSL_FALLTHROUGH_INTENDED +// +// Annotates implicit fall-through between switch labels, allowing a case to +// indicate intentional fallthrough and turn off warnings about any lack of a +// `break` statement. The ABSL_FALLTHROUGH_INTENDED macro should be followed by +// a semicolon and can be used in most places where `break` can, provided that +// no statements exist between it and the next switch label. +// +// Example: +// +// switch (x) { +// case 40: +// case 41: +// if (truth_is_out_there) { +// ++x; +// ABSL_FALLTHROUGH_INTENDED; // Use instead of/along with annotations +// // in comments +// } else { +// return x; +// } +// case 42: +// ... +// +// Notes: when compiled with clang in C++11 mode, the ABSL_FALLTHROUGH_INTENDED +// macro is expanded to the [[clang::fallthrough]] attribute, which is analysed +// when performing switch labels fall-through diagnostic +// (`-Wimplicit-fallthrough`). See clang documentation on language extensions +// for details: +// http://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough +// +// When used with unsupported compilers, the ABSL_FALLTHROUGH_INTENDED macro +// has no effect on diagnostics. In any case this macro has no effect on runtime +// behavior and performance of code. +#ifdef ABSL_FALLTHROUGH_INTENDED +#error "ABSL_FALLTHROUGH_INTENDED should not be defined." +#endif + +// TODO(zhangxy): Use c++17 standard [[fallthrough]] macro, when supported. +#if defined(__clang__) && defined(__has_warning) +#if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough") +#define ABSL_FALLTHROUGH_INTENDED [[clang::fallthrough]] +#endif +#elif defined(__GNUC__) && __GNUC__ >= 7 +#define ABSL_FALLTHROUGH_INTENDED [[gnu::fallthrough]] +#endif + +#ifndef ABSL_FALLTHROUGH_INTENDED +#define ABSL_FALLTHROUGH_INTENDED \ + do { \ + } while (0) +#endif + +// ABSL_DEPRECATED() +// +// Marks a deprecated class, struct, enum, function, method and variable +// declarations. The macro argument is used as a custom diagnostic message (e.g. +// suggestion of a better alternative). +// +// Example: +// +// class ABSL_DEPRECATED("Use Bar instead") Foo {...}; +// ABSL_DEPRECATED("Use Baz instead") void Bar() {...} +// +// Every usage of a deprecated entity will trigger a warning when compiled with +// clang's `-Wdeprecated-declarations` option. This option is turned off by +// default, but the warnings will be reported by clang-tidy. +#if defined(__clang__) && __cplusplus >= 201103L +#define ABSL_DEPRECATED(message) __attribute__((deprecated(message))) +#endif + +#ifndef ABSL_DEPRECATED +#define ABSL_DEPRECATED(message) +#endif + +// ABSL_BAD_CALL_IF() +// +// Used on a function overload to trap bad calls: any call that matches the +// overload will cause a compile-time error. This macro uses a clang-specific +// "enable_if" attribute, as described at +// http://clang.llvm.org/docs/AttributeReference.html#enable-if +// +// Overloads which use this macro should be bracketed by +// `#ifdef ABSL_BAD_CALL_IF`. +// +// Example: +// +// int isdigit(int c); +// #ifdef ABSL_BAD_CALL_IF +// int isdigit(int c) +// ABSL_BAD_CALL_IF(c <= -1 || c > 255, +// "'c' must have the value of an unsigned char or EOF"); +// #endif // ABSL_BAD_CALL_IF + +#if defined(__clang__) +# if __has_attribute(enable_if) +# define ABSL_BAD_CALL_IF(expr, msg) \ + __attribute__((enable_if(expr, "Bad call trap"), unavailable(msg))) +# endif +#endif + +// ABSL_ASSERT() +// +// In C++11, `assert` can't be used portably within constexpr functions. +// ABSL_ASSERT functions as a runtime assert but works in C++11 constexpr +// functions. Example: +// +// constexpr double Divide(double a, double b) { +// return ABSL_ASSERT(b != 0), a / b; +// } +// +// This macro is inspired by +// https://akrzemi1.wordpress.com/2017/05/18/asserts-in-constexpr-functions/ +#if defined(NDEBUG) +#define ABSL_ASSERT(expr) (false ? (void)(expr) : (void)0) +#else +#define ABSL_ASSERT(expr) \ + (ABSL_PREDICT_TRUE((expr)) ? (void)0 \ + : [] { assert(false && #expr); }()) // NOLINT +#endif + +#ifdef ABSL_HAVE_EXCEPTIONS +#define ABSL_INTERNAL_TRY try +#define ABSL_INTERNAL_CATCH_ANY catch (...) +#define ABSL_INTERNAL_RETHROW do { throw; } while (false) +#else // ABSL_HAVE_EXCEPTIONS +#define ABSL_INTERNAL_TRY if (true) +#define ABSL_INTERNAL_CATCH_ANY else if (false) +#define ABSL_INTERNAL_RETHROW do {} while (false) +#endif // ABSL_HAVE_EXCEPTIONS + +#endif // ABSL_BASE_MACROS_H_ diff --git a/libtgvoip/webrtc_dsp/absl/base/optimization.h b/libtgvoip/webrtc_dsp/absl/base/optimization.h new file mode 100755 index 0000000..2fddfc8 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/base/optimization.h @@ -0,0 +1,165 @@ +// +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ----------------------------------------------------------------------------- +// File: optimization.h +// ----------------------------------------------------------------------------- +// +// This header file defines portable macros for performance optimization. + +#ifndef ABSL_BASE_OPTIMIZATION_H_ +#define ABSL_BASE_OPTIMIZATION_H_ + +#include "absl/base/config.h" + +// ABSL_BLOCK_TAIL_CALL_OPTIMIZATION +// +// Instructs the compiler to avoid optimizing tail-call recursion. Use of this +// macro is useful when you wish to preserve the existing function order within +// a stack trace for logging, debugging, or profiling purposes. +// +// Example: +// +// int f() { +// int result = g(); +// ABSL_BLOCK_TAIL_CALL_OPTIMIZATION(); +// return result; +// } +#if defined(__pnacl__) +#define ABSL_BLOCK_TAIL_CALL_OPTIMIZATION() if (volatile int x = 0) { (void)x; } +#elif defined(__clang__) +// Clang will not tail call given inline volatile assembly. +#define ABSL_BLOCK_TAIL_CALL_OPTIMIZATION() __asm__ __volatile__("") +#elif defined(__GNUC__) +// GCC will not tail call given inline volatile assembly. +#define ABSL_BLOCK_TAIL_CALL_OPTIMIZATION() __asm__ __volatile__("") +#elif defined(_MSC_VER) +#include +// The __nop() intrinsic blocks the optimisation. +#define ABSL_BLOCK_TAIL_CALL_OPTIMIZATION() __nop() +#else +#define ABSL_BLOCK_TAIL_CALL_OPTIMIZATION() if (volatile int x = 0) { (void)x; } +#endif + +// ABSL_CACHELINE_SIZE +// +// Explicitly defines the size of the L1 cache for purposes of alignment. +// Setting the cacheline size allows you to specify that certain objects be +// aligned on a cacheline boundary with `ABSL_CACHELINE_ALIGNED` declarations. +// (See below.) +// +// NOTE: this macro should be replaced with the following C++17 features, when +// those are generally available: +// +// * `std::hardware_constructive_interference_size` +// * `std::hardware_destructive_interference_size` +// +// See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0154r1.html +// for more information. +#if defined(__GNUC__) +// Cache line alignment +#if defined(__i386__) || defined(__x86_64__) +#define ABSL_CACHELINE_SIZE 64 +#elif defined(__powerpc64__) +#define ABSL_CACHELINE_SIZE 128 +#elif defined(__aarch64__) +// We would need to read special register ctr_el0 to find out L1 dcache size. +// This value is a good estimate based on a real aarch64 machine. +#define ABSL_CACHELINE_SIZE 64 +#elif defined(__arm__) +// Cache line sizes for ARM: These values are not strictly correct since +// cache line sizes depend on implementations, not architectures. There +// are even implementations with cache line sizes configurable at boot +// time. +#if defined(__ARM_ARCH_5T__) +#define ABSL_CACHELINE_SIZE 32 +#elif defined(__ARM_ARCH_7A__) +#define ABSL_CACHELINE_SIZE 64 +#endif +#endif + +#ifndef ABSL_CACHELINE_SIZE +// A reasonable default guess. Note that overestimates tend to waste more +// space, while underestimates tend to waste more time. +#define ABSL_CACHELINE_SIZE 64 +#endif + +// ABSL_CACHELINE_ALIGNED +// +// Indicates that the declared object be cache aligned using +// `ABSL_CACHELINE_SIZE` (see above). Cacheline aligning objects allows you to +// load a set of related objects in the L1 cache for performance improvements. +// Cacheline aligning objects properly allows constructive memory sharing and +// prevents destructive (or "false") memory sharing. +// +// NOTE: this macro should be replaced with usage of `alignas()` using +// `std::hardware_constructive_interference_size` and/or +// `std::hardware_destructive_interference_size` when available within C++17. +// +// See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0154r1.html +// for more information. +// +// On some compilers, `ABSL_CACHELINE_ALIGNED` expands to +// `__attribute__((aligned(ABSL_CACHELINE_SIZE)))`. For compilers where this is +// not known to work, the macro expands to nothing. +// +// No further guarantees are made here. The result of applying the macro +// to variables and types is always implementation-defined. +// +// WARNING: It is easy to use this attribute incorrectly, even to the point +// of causing bugs that are difficult to diagnose, crash, etc. It does not +// of itself guarantee that objects are aligned to a cache line. +// +// Recommendations: +// +// 1) Consult compiler documentation; this comment is not kept in sync as +// toolchains evolve. +// 2) Verify your use has the intended effect. This often requires inspecting +// the generated machine code. +// 3) Prefer applying this attribute to individual variables. Avoid +// applying it to types. This tends to localize the effect. +#define ABSL_CACHELINE_ALIGNED __attribute__((aligned(ABSL_CACHELINE_SIZE))) + +#else // not GCC +#define ABSL_CACHELINE_SIZE 64 +#define ABSL_CACHELINE_ALIGNED +#endif + +// ABSL_PREDICT_TRUE, ABSL_PREDICT_FALSE +// +// Enables the compiler to prioritize compilation using static analysis for +// likely paths within a boolean branch. +// +// Example: +// +// if (ABSL_PREDICT_TRUE(expression)) { +// return result; // Faster if more likely +// } else { +// return 0; +// } +// +// Compilers can use the information that a certain branch is not likely to be +// taken (for instance, a CHECK failure) to optimize for the common case in +// the absence of better information (ie. compiling gcc with `-fprofile-arcs`). +#if ABSL_HAVE_BUILTIN(__builtin_expect) || \ + (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_PREDICT_FALSE(x) (__builtin_expect(x, 0)) +#define ABSL_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1)) +#else +#define ABSL_PREDICT_FALSE(x) (x) +#define ABSL_PREDICT_TRUE(x) (x) +#endif + +#endif // ABSL_BASE_OPTIMIZATION_H_ diff --git a/libtgvoip/webrtc_dsp/absl/base/policy_checks.h b/libtgvoip/webrtc_dsp/absl/base/policy_checks.h new file mode 100755 index 0000000..0a07fc0 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/base/policy_checks.h @@ -0,0 +1,121 @@ +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ----------------------------------------------------------------------------- +// File: policy_checks.h +// ----------------------------------------------------------------------------- +// +// This header enforces a minimum set of policies at build time, such as the +// supported compiler and library versions. Unsupported configurations are +// reported with `#error`. This enforcement is best effort, so successfully +// compiling this header does not guarantee a supported configuration. + +#ifndef ABSL_BASE_POLICY_CHECKS_H_ +#define ABSL_BASE_POLICY_CHECKS_H_ + +// Included for the __GLIBC_PREREQ macro used below. +#include + +// Included for the _STLPORT_VERSION macro used below. +#if defined(__cplusplus) +#include +#endif + +// ----------------------------------------------------------------------------- +// Operating System Check +// ----------------------------------------------------------------------------- + +#if defined(__CYGWIN__) +#error "Cygwin is not supported." +#endif + +// ----------------------------------------------------------------------------- +// Compiler Check +// ----------------------------------------------------------------------------- + +// We support MSVC++ 14.0 update 2 and later. +// This minimum will go up. +#if defined(_MSC_FULL_VER) && _MSC_FULL_VER < 190023918 && !defined(__clang__) +#error "This package requires Visual Studio 2015 Update 2 or higher." +#endif + +// We support gcc 4.7 and later. +// This minimum will go up. +#if defined(__GNUC__) && !defined(__clang__) +#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 7) +#error "This package requires gcc 4.7 or higher." +#endif +#endif + +// We support Apple Xcode clang 4.2.1 (version 421.11.65) and later. +// This corresponds to Apple Xcode version 4.5. +// This minimum will go up. +#if defined(__apple_build_version__) && __apple_build_version__ < 4211165 +#error "This package requires __apple_build_version__ of 4211165 or higher." +#endif + +// ----------------------------------------------------------------------------- +// C++ Version Check +// ----------------------------------------------------------------------------- + +// Enforce C++11 as the minimum. Note that Visual Studio has not +// advanced __cplusplus despite being good enough for our purposes, so +// so we exempt it from the check. +#if defined(__cplusplus) && !defined(_MSC_VER) +#if __cplusplus < 201103L +#error "C++ versions less than C++11 are not supported." +#endif +#endif + +// ----------------------------------------------------------------------------- +// Standard Library Check +// ----------------------------------------------------------------------------- + +// We have chosen glibc 2.12 as the minimum as it was tagged for release +// in May, 2010 and includes some functionality used in Google software +// (for instance pthread_setname_np): +// https://sourceware.org/ml/libc-alpha/2010-05/msg00000.html +#if defined(__GLIBC__) && defined(__GLIBC_PREREQ) +#if !__GLIBC_PREREQ(2, 12) +#error "Minimum required version of glibc is 2.12." +#endif +#endif + +#if defined(_STLPORT_VERSION) +#error "STLPort is not supported." +#endif + +// ----------------------------------------------------------------------------- +// `char` Size Check +// ----------------------------------------------------------------------------- + +// Abseil currently assumes CHAR_BIT == 8. If you would like to use Abseil on a +// platform where this is not the case, please provide us with the details about +// your platform so we can consider relaxing this requirement. +#if CHAR_BIT != 8 +#error "Abseil assumes CHAR_BIT == 8." +#endif + +// ----------------------------------------------------------------------------- +// `int` Size Check +// ----------------------------------------------------------------------------- + +// Abseil currently assumes that an int is 4 bytes. If you would like to use +// Abseil on a platform where this is not the case, please provide us with the +// details about your platform so we can consider relaxing this requirement. +#if INT_MAX < 2147483647 +#error "Abseil assumes that int is at least 4 bytes. " +#endif + +#endif // ABSL_BASE_POLICY_CHECKS_H_ diff --git a/libtgvoip/webrtc_dsp/absl/base/port.h b/libtgvoip/webrtc_dsp/absl/base/port.h new file mode 100755 index 0000000..1c67257 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/base/port.h @@ -0,0 +1,26 @@ +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// This files is a forwarding header for other headers containing various +// portability macros and functions. +// This file is used for both C and C++! + +#ifndef ABSL_BASE_PORT_H_ +#define ABSL_BASE_PORT_H_ + +#include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/base/optimization.h" + +#endif // ABSL_BASE_PORT_H_ diff --git a/libtgvoip/webrtc_dsp/absl/container/inlined_vector.h b/libtgvoip/webrtc_dsp/absl/container/inlined_vector.h new file mode 100755 index 0000000..642dae6 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/container/inlined_vector.h @@ -0,0 +1,1451 @@ +// Copyright 2018 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ----------------------------------------------------------------------------- +// File: inlined_vector.h +// ----------------------------------------------------------------------------- +// +// This header file contains the declaration and definition of an "inlined +// vector" which behaves in an equivalent fashion to a `std::vector`, except +// that storage for small sequences of the vector are provided inline without +// requiring any heap allocation. +// +// An `absl::InlinedVector` specifies the default capacity `N` as one of +// its template parameters. Instances where `size() <= N` hold contained +// elements in inline space. Typically `N` is very small so that sequences that +// are expected to be short do not require allocations. +// +// An `absl::InlinedVector` does not usually require a specific allocator. If +// the inlined vector grows beyond its initial constraints, it will need to +// allocate (as any normal `std::vector` would). This is usually performed with +// the default allocator (defined as `std::allocator`). Optionally, a custom +// allocator type may be specified as `A` in `absl::InlinedVector`. + +#ifndef ABSL_CONTAINER_INLINED_VECTOR_H_ +#define ABSL_CONTAINER_INLINED_VECTOR_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "absl/algorithm/algorithm.h" +#include "absl/base/internal/throw_delegate.h" +#include "absl/base/optimization.h" +#include "absl/base/port.h" +#include "absl/memory/memory.h" + +namespace absl { + +// ----------------------------------------------------------------------------- +// InlinedVector +// ----------------------------------------------------------------------------- +// +// An `absl::InlinedVector` is designed to be a drop-in replacement for +// `std::vector` for use cases where the vector's size is sufficiently small +// that it can be inlined. If the inlined vector does grow beyond its estimated +// capacity, it will trigger an initial allocation on the heap, and will behave +// as a `std:vector`. The API of the `absl::InlinedVector` within this file is +// designed to cover the same API footprint as covered by `std::vector`. +template > +class InlinedVector { + constexpr static typename A::size_type inlined_capacity() { + return static_cast(N); + } + + static_assert(inlined_capacity() > 0, "InlinedVector needs inlined capacity"); + + template + using DisableIfIntegral = + absl::enable_if_t::value>; + + template + using EnableIfInputIterator = absl::enable_if_t::iterator_category, + std::input_iterator_tag>::value>; + + template + using IteratorCategory = + typename std::iterator_traits::iterator_category; + + using rvalue_reference = typename A::value_type&&; + + public: + using allocator_type = A; + using value_type = typename allocator_type::value_type; + using pointer = typename allocator_type::pointer; + using const_pointer = typename allocator_type::const_pointer; + using reference = typename allocator_type::reference; + using const_reference = typename allocator_type::const_reference; + using size_type = typename allocator_type::size_type; + using difference_type = typename allocator_type::difference_type; + using iterator = pointer; + using const_iterator = const_pointer; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + // --------------------------------------------------------------------------- + // InlinedVector Constructors and Destructor + // --------------------------------------------------------------------------- + + // Creates an empty inlined vector with a default initialized allocator. + InlinedVector() noexcept(noexcept(allocator_type())) + : allocator_and_tag_(allocator_type()) {} + + // Creates an empty inlined vector with a specified allocator. + explicit InlinedVector(const allocator_type& alloc) noexcept + : allocator_and_tag_(alloc) {} + + // Creates an inlined vector with `n` copies of `value_type()`. + explicit InlinedVector(size_type n, + const allocator_type& alloc = allocator_type()) + : allocator_and_tag_(alloc) { + InitAssign(n); + } + + // Creates an inlined vector with `n` copies of `v`. + InlinedVector(size_type n, const_reference v, + const allocator_type& alloc = allocator_type()) + : allocator_and_tag_(alloc) { + InitAssign(n, v); + } + + // Creates an inlined vector of copies of the values in `init_list`. + InlinedVector(std::initializer_list init_list, + const allocator_type& alloc = allocator_type()) + : allocator_and_tag_(alloc) { + AppendRange(init_list.begin(), init_list.end()); + } + + // Creates an inlined vector with elements constructed from the provided + // Iterator range [`first`, `last`). + // + // NOTE: The `enable_if` prevents ambiguous interpretation between a call to + // this constructor with two integral arguments and a call to the above + // `InlinedVector(size_type, const_reference)` constructor. + template * = nullptr> + InlinedVector(InputIterator first, InputIterator last, + const allocator_type& alloc = allocator_type()) + : allocator_and_tag_(alloc) { + AppendRange(first, last); + } + + // Creates a copy of `other` using `other`'s allocator. + InlinedVector(const InlinedVector& other); + + // Creates a copy of `other` but with a specified allocator. + InlinedVector(const InlinedVector& other, const allocator_type& alloc); + + // Creates an inlined vector by moving in the contents of `other`. + // + // NOTE: This move constructor does not allocate and only moves the underlying + // objects, so its `noexcept` specification depends on whether moving the + // underlying objects can throw or not. We assume: + // a) move constructors should only throw due to allocation failure and + // b) if `value_type`'s move constructor allocates, it uses the same + // allocation function as the `InlinedVector`'s allocator, so the move + // constructor is non-throwing if the allocator is non-throwing or + // `value_type`'s move constructor is specified as `noexcept`. + InlinedVector(InlinedVector&& v) noexcept( + absl::allocator_is_nothrow::value || + std::is_nothrow_move_constructible::value); + + // Creates an inlined vector by moving in the contents of `other`. + // + // NOTE: This move constructor allocates and subsequently moves the underlying + // objects, so its `noexcept` specification depends on whether the allocation + // can throw and whether moving the underlying objects can throw. Based on the + // same assumptions as above, the `noexcept` specification is dominated by + // whether the allocation can throw regardless of whether `value_type`'s move + // constructor is specified as `noexcept`. + InlinedVector(InlinedVector&& v, const allocator_type& alloc) noexcept( + absl::allocator_is_nothrow::value); + + ~InlinedVector() { clear(); } + + // --------------------------------------------------------------------------- + // InlinedVector Member Accessors + // --------------------------------------------------------------------------- + + // `InlinedVector::empty()` + // + // Checks if the inlined vector has no elements. + bool empty() const noexcept { return !size(); } + + // `InlinedVector::size()` + // + // Returns the number of elements in the inlined vector. + size_type size() const noexcept { return tag().size(); } + + // `InlinedVector::max_size()` + // + // Returns the maximum number of elements the vector can hold. + size_type max_size() const noexcept { + // One bit of the size storage is used to indicate whether the inlined + // vector is allocated. As a result, the maximum size of the container that + // we can express is half of the max for `size_type`. + return (std::numeric_limits::max)() / 2; + } + + // `InlinedVector::capacity()` + // + // Returns the number of elements that can be stored in the inlined vector + // without requiring a reallocation of underlying memory. + // + // NOTE: For most inlined vectors, `capacity()` should equal + // `inlined_capacity()`. For inlined vectors which exceed this capacity, they + // will no longer be inlined and `capacity()` will equal its capacity on the + // allocated heap. + size_type capacity() const noexcept { + return allocated() ? allocation().capacity() : inlined_capacity(); + } + + // `InlinedVector::data()` + // + // Returns a `pointer` to elements of the inlined vector. This pointer can be + // used to access and modify the contained elements. + // Only results within the range [`0`, `size()`) are defined. + pointer data() noexcept { + return allocated() ? allocated_space() : inlined_space(); + } + + // Overload of `InlinedVector::data()` to return a `const_pointer` to elements + // of the inlined vector. This pointer can be used to access (but not modify) + // the contained elements. + const_pointer data() const noexcept { + return allocated() ? allocated_space() : inlined_space(); + } + + // `InlinedVector::operator[]()` + // + // Returns a `reference` to the `i`th element of the inlined vector using the + // array operator. + reference operator[](size_type i) { + assert(i < size()); + return data()[i]; + } + + // Overload of `InlinedVector::operator[]()` to return a `const_reference` to + // the `i`th element of the inlined vector. + const_reference operator[](size_type i) const { + assert(i < size()); + return data()[i]; + } + + // `InlinedVector::at()` + // + // Returns a `reference` to the `i`th element of the inlined vector. + reference at(size_type i) { + if (ABSL_PREDICT_FALSE(i >= size())) { + base_internal::ThrowStdOutOfRange( + "InlinedVector::at() failed bounds check"); + } + return data()[i]; + } + + // Overload of `InlinedVector::at()` to return a `const_reference` to the + // `i`th element of the inlined vector. + const_reference at(size_type i) const { + if (ABSL_PREDICT_FALSE(i >= size())) { + base_internal::ThrowStdOutOfRange( + "InlinedVector::at() failed bounds check"); + } + return data()[i]; + } + + // `InlinedVector::front()` + // + // Returns a `reference` to the first element of the inlined vector. + reference front() { + assert(!empty()); + return at(0); + } + + // Overload of `InlinedVector::front()` returns a `const_reference` to the + // first element of the inlined vector. + const_reference front() const { + assert(!empty()); + return at(0); + } + + // `InlinedVector::back()` + // + // Returns a `reference` to the last element of the inlined vector. + reference back() { + assert(!empty()); + return at(size() - 1); + } + + // Overload of `InlinedVector::back()` to return a `const_reference` to the + // last element of the inlined vector. + const_reference back() const { + assert(!empty()); + return at(size() - 1); + } + + // `InlinedVector::begin()` + // + // Returns an `iterator` to the beginning of the inlined vector. + iterator begin() noexcept { return data(); } + + // Overload of `InlinedVector::begin()` to return a `const_iterator` to + // the beginning of the inlined vector. + const_iterator begin() const noexcept { return data(); } + + // `InlinedVector::end()` + // + // Returns an `iterator` to the end of the inlined vector. + iterator end() noexcept { return data() + size(); } + + // Overload of `InlinedVector::end()` to return a `const_iterator` to the + // end of the inlined vector. + const_iterator end() const noexcept { return data() + size(); } + + // `InlinedVector::cbegin()` + // + // Returns a `const_iterator` to the beginning of the inlined vector. + const_iterator cbegin() const noexcept { return begin(); } + + // `InlinedVector::cend()` + // + // Returns a `const_iterator` to the end of the inlined vector. + const_iterator cend() const noexcept { return end(); } + + // `InlinedVector::rbegin()` + // + // Returns a `reverse_iterator` from the end of the inlined vector. + reverse_iterator rbegin() noexcept { return reverse_iterator(end()); } + + // Overload of `InlinedVector::rbegin()` to return a + // `const_reverse_iterator` from the end of the inlined vector. + const_reverse_iterator rbegin() const noexcept { + return const_reverse_iterator(end()); + } + + // `InlinedVector::rend()` + // + // Returns a `reverse_iterator` from the beginning of the inlined vector. + reverse_iterator rend() noexcept { return reverse_iterator(begin()); } + + // Overload of `InlinedVector::rend()` to return a `const_reverse_iterator` + // from the beginning of the inlined vector. + const_reverse_iterator rend() const noexcept { + return const_reverse_iterator(begin()); + } + + // `InlinedVector::crbegin()` + // + // Returns a `const_reverse_iterator` from the end of the inlined vector. + const_reverse_iterator crbegin() const noexcept { return rbegin(); } + + // `InlinedVector::crend()` + // + // Returns a `const_reverse_iterator` from the beginning of the inlined + // vector. + const_reverse_iterator crend() const noexcept { return rend(); } + + // `InlinedVector::get_allocator()` + // + // Returns a copy of the allocator of the inlined vector. + allocator_type get_allocator() const { return allocator(); } + + + // --------------------------------------------------------------------------- + // InlinedVector Member Mutators + // --------------------------------------------------------------------------- + + // `InlinedVector::operator=()` + // + // Replaces the contents of the inlined vector with copies of the elements in + // the provided `std::initializer_list`. + InlinedVector& operator=(std::initializer_list init_list) { + AssignRange(init_list.begin(), init_list.end()); + return *this; + } + + // Overload of `InlinedVector::operator=()` to replace the contents of the + // inlined vector with the contents of `other`. + InlinedVector& operator=(const InlinedVector& other) { + if (ABSL_PREDICT_FALSE(this == &other)) return *this; + + // Optimized to avoid reallocation. + // Prefer reassignment to copy construction for elements. + if (size() < other.size()) { // grow + reserve(other.size()); + std::copy(other.begin(), other.begin() + size(), begin()); + std::copy(other.begin() + size(), other.end(), std::back_inserter(*this)); + } else { // maybe shrink + erase(begin() + other.size(), end()); + std::copy(other.begin(), other.end(), begin()); + } + return *this; + } + + // Overload of `InlinedVector::operator=()` to replace the contents of the + // inlined vector with the contents of `other`. + // + // NOTE: As a result of calling this overload, `other` may be empty or it's + // contents may be left in a moved-from state. + InlinedVector& operator=(InlinedVector&& other) { + if (ABSL_PREDICT_FALSE(this == &other)) return *this; + + if (other.allocated()) { + clear(); + tag().set_allocated_size(other.size()); + init_allocation(other.allocation()); + other.tag() = Tag(); + } else { + if (allocated()) clear(); + // Both are inlined now. + if (size() < other.size()) { + auto mid = std::make_move_iterator(other.begin() + size()); + std::copy(std::make_move_iterator(other.begin()), mid, begin()); + UninitializedCopy(mid, std::make_move_iterator(other.end()), end()); + } else { + auto new_end = std::copy(std::make_move_iterator(other.begin()), + std::make_move_iterator(other.end()), begin()); + Destroy(new_end, end()); + } + tag().set_inline_size(other.size()); + } + return *this; + } + + // `InlinedVector::assign()` + // + // Replaces the contents of the inlined vector with `n` copies of `v`. + void assign(size_type n, const_reference v) { + if (n <= size()) { // Possibly shrink + std::fill_n(begin(), n, v); + erase(begin() + n, end()); + return; + } + // Grow + reserve(n); + std::fill_n(begin(), size(), v); + if (allocated()) { + UninitializedFill(allocated_space() + size(), allocated_space() + n, v); + tag().set_allocated_size(n); + } else { + UninitializedFill(inlined_space() + size(), inlined_space() + n, v); + tag().set_inline_size(n); + } + } + + // Overload of `InlinedVector::assign()` to replace the contents of the + // inlined vector with copies of the values in the provided + // `std::initializer_list`. + void assign(std::initializer_list init_list) { + AssignRange(init_list.begin(), init_list.end()); + } + + // Overload of `InlinedVector::assign()` to replace the contents of the + // inlined vector with values constructed from the range [`first`, `last`). + template * = nullptr> + void assign(InputIterator first, InputIterator last) { + AssignRange(first, last); + } + + // `InlinedVector::resize()` + // + // Resizes the inlined vector to contain `n` elements. If `n` is smaller than + // the inlined vector's current size, extra elements are destroyed. If `n` is + // larger than the initial size, new elements are value-initialized. + void resize(size_type n); + + // Overload of `InlinedVector::resize()` to resize the inlined vector to + // contain `n` elements where, if `n` is larger than `size()`, the new values + // will be copy-constructed from `v`. + void resize(size_type n, const_reference v); + + // `InlinedVector::insert()` + // + // Copies `v` into `position`, returning an `iterator` pointing to the newly + // inserted element. + iterator insert(const_iterator position, const_reference v) { + return emplace(position, v); + } + + // Overload of `InlinedVector::insert()` for moving `v` into `position`, + // returning an iterator pointing to the newly inserted element. + iterator insert(const_iterator position, rvalue_reference v) { + return emplace(position, std::move(v)); + } + + // Overload of `InlinedVector::insert()` for inserting `n` contiguous copies + // of `v` starting at `position`. Returns an `iterator` pointing to the first + // of the newly inserted elements. + iterator insert(const_iterator position, size_type n, const_reference v) { + return InsertWithCount(position, n, v); + } + + // Overload of `InlinedVector::insert()` for copying the contents of the + // `std::initializer_list` into the vector starting at `position`. Returns an + // `iterator` pointing to the first of the newly inserted elements. + iterator insert(const_iterator position, + std::initializer_list init_list) { + return insert(position, init_list.begin(), init_list.end()); + } + + // Overload of `InlinedVector::insert()` for inserting elements constructed + // from the range [`first`, `last`). Returns an `iterator` pointing to the + // first of the newly inserted elements. + // + // NOTE: The `enable_if` is intended to disambiguate the two three-argument + // overloads of `insert()`. + template > + iterator insert(const_iterator position, InputIterator first, + InputIterator last) { + return InsertWithRange(position, first, last, + IteratorCategory()); + } + + // `InlinedVector::emplace()` + // + // Constructs and inserts an object in the inlined vector at the given + // `position`, returning an `iterator` pointing to the newly emplaced element. + template + iterator emplace(const_iterator position, Args&&... args); + + // `InlinedVector::emplace_back()` + // + // Constructs and appends a new element to the end of the inlined vector, + // returning a `reference` to the emplaced element. + template + reference emplace_back(Args&&... args) { + size_type s = size(); + assert(s <= capacity()); + if (ABSL_PREDICT_FALSE(s == capacity())) { + return GrowAndEmplaceBack(std::forward(args)...); + } + assert(s < capacity()); + + pointer space; + if (allocated()) { + tag().set_allocated_size(s + 1); + space = allocated_space(); + } else { + tag().set_inline_size(s + 1); + space = inlined_space(); + } + return Construct(space + s, std::forward(args)...); + } + + // `InlinedVector::push_back()` + // + // Appends a copy of `v` to the end of the inlined vector. + void push_back(const_reference v) { static_cast(emplace_back(v)); } + + // Overload of `InlinedVector::push_back()` for moving `v` into a newly + // appended element. + void push_back(rvalue_reference v) { + static_cast(emplace_back(std::move(v))); + } + + // `InlinedVector::pop_back()` + // + // Destroys the element at the end of the inlined vector and shrinks the size + // by `1` (unless the inlined vector is empty, in which case this is a no-op). + void pop_back() noexcept { + assert(!empty()); + size_type s = size(); + if (allocated()) { + Destroy(allocated_space() + s - 1, allocated_space() + s); + tag().set_allocated_size(s - 1); + } else { + Destroy(inlined_space() + s - 1, inlined_space() + s); + tag().set_inline_size(s - 1); + } + } + + // `InlinedVector::erase()` + // + // Erases the element at `position` of the inlined vector, returning an + // `iterator` pointing to the first element following the erased element. + // + // NOTE: May return the end iterator, which is not dereferencable. + iterator erase(const_iterator position) { + assert(position >= begin()); + assert(position < end()); + + iterator pos = const_cast(position); + std::move(pos + 1, end(), pos); + pop_back(); + return pos; + } + + // Overload of `InlinedVector::erase()` for erasing all elements in the + // range [`from`, `to`) in the inlined vector. Returns an `iterator` pointing + // to the first element following the range erased or the end iterator if `to` + // was the end iterator. + iterator erase(const_iterator from, const_iterator to); + + // `InlinedVector::clear()` + // + // Destroys all elements in the inlined vector, sets the size of `0` and + // deallocates the heap allocation if the inlined vector was allocated. + void clear() noexcept { + size_type s = size(); + if (allocated()) { + Destroy(allocated_space(), allocated_space() + s); + allocation().Dealloc(allocator()); + } else if (s != 0) { // do nothing for empty vectors + Destroy(inlined_space(), inlined_space() + s); + } + tag() = Tag(); + } + + // `InlinedVector::reserve()` + // + // Enlarges the underlying representation of the inlined vector so it can hold + // at least `n` elements. This method does not change `size()` or the actual + // contents of the vector. + // + // NOTE: If `n` does not exceed `capacity()`, `reserve()` will have no + // effects. Otherwise, `reserve()` will reallocate, performing an n-time + // element-wise move of everything contained. + void reserve(size_type n) { + if (n > capacity()) { + // Make room for new elements + EnlargeBy(n - size()); + } + } + + // `InlinedVector::shrink_to_fit()` + // + // Reduces memory usage by freeing unused memory. After this call, calls to + // `capacity()` will be equal to `(std::max)(inlined_capacity(), size())`. + // + // If `size() <= inlined_capacity()` and the elements are currently stored on + // the heap, they will be moved to the inlined storage and the heap memory + // will be deallocated. + // + // If `size() > inlined_capacity()` and `size() < capacity()` the elements + // will be moved to a smaller heap allocation. + void shrink_to_fit() { + const auto s = size(); + if (ABSL_PREDICT_FALSE(!allocated() || s == capacity())) return; + + if (s <= inlined_capacity()) { + // Move the elements to the inlined storage. + // We have to do this using a temporary, because `inlined_storage` and + // `allocation_storage` are in a union field. + auto temp = std::move(*this); + assign(std::make_move_iterator(temp.begin()), + std::make_move_iterator(temp.end())); + return; + } + + // Reallocate storage and move elements. + // We can't simply use the same approach as above, because `assign()` would + // call into `reserve()` internally and reserve larger capacity than we need + Allocation new_allocation(allocator(), s); + UninitializedCopy(std::make_move_iterator(allocated_space()), + std::make_move_iterator(allocated_space() + s), + new_allocation.buffer()); + ResetAllocation(new_allocation, s); + } + + // `InlinedVector::swap()` + // + // Swaps the contents of this inlined vector with the contents of `other`. + void swap(InlinedVector& other); + + template + friend Hash AbslHashValue(Hash hash, const InlinedVector& inlined_vector) { + const_pointer p = inlined_vector.data(); + size_type n = inlined_vector.size(); + return Hash::combine(Hash::combine_contiguous(std::move(hash), p, n), n); + } + + private: + // Holds whether the vector is allocated or not in the lowest bit and the size + // in the high bits: + // `size_ = (size << 1) | is_allocated;` + class Tag { + public: + Tag() : size_(0) {} + size_type size() const { return size_ / 2; } + void add_size(size_type n) { size_ += n * 2; } + void set_inline_size(size_type n) { size_ = n * 2; } + void set_allocated_size(size_type n) { size_ = (n * 2) + 1; } + bool allocated() const { return size_ % 2; } + + private: + size_type size_; + }; + + // Derives from `allocator_type` to use the empty base class optimization. + // If the `allocator_type` is stateless, we can store our instance for free. + class AllocatorAndTag : private allocator_type { + public: + explicit AllocatorAndTag(const allocator_type& a) : allocator_type(a) {} + + Tag& tag() { return tag_; } + const Tag& tag() const { return tag_; } + + allocator_type& allocator() { return *this; } + const allocator_type& allocator() const { return *this; } + + private: + Tag tag_; + }; + + class Allocation { + public: + Allocation(allocator_type& a, size_type capacity) + : capacity_(capacity), buffer_(Create(a, capacity)) {} + + void Dealloc(allocator_type& a) { + std::allocator_traits::deallocate(a, buffer_, capacity_); + } + + size_type capacity() const { return capacity_; } + + const_pointer buffer() const { return buffer_; } + + pointer buffer() { return buffer_; } + + private: + static pointer Create(allocator_type& a, size_type n) { + return std::allocator_traits::allocate(a, n); + } + + size_type capacity_; + pointer buffer_; + }; + + const Tag& tag() const { return allocator_and_tag_.tag(); } + + Tag& tag() { return allocator_and_tag_.tag(); } + + Allocation& allocation() { + return reinterpret_cast(rep_.allocation_storage.allocation); + } + + const Allocation& allocation() const { + return reinterpret_cast( + rep_.allocation_storage.allocation); + } + + void init_allocation(const Allocation& allocation) { + new (&rep_.allocation_storage.allocation) Allocation(allocation); + } + + // TODO(absl-team): investigate whether the reinterpret_cast is appropriate. + pointer inlined_space() { + return reinterpret_cast( + std::addressof(rep_.inlined_storage.inlined[0])); + } + + const_pointer inlined_space() const { + return reinterpret_cast( + std::addressof(rep_.inlined_storage.inlined[0])); + } + + pointer allocated_space() { return allocation().buffer(); } + + const_pointer allocated_space() const { return allocation().buffer(); } + + const allocator_type& allocator() const { + return allocator_and_tag_.allocator(); + } + + allocator_type& allocator() { return allocator_and_tag_.allocator(); } + + bool allocated() const { return tag().allocated(); } + + // Enlarge the underlying representation so we can store `size_ + delta` elems + // in allocated space. The size is not changed, and any newly added memory is + // not initialized. + void EnlargeBy(size_type delta); + + // Shift all elements from `position` to `end()` by `n` places to the right. + // If the vector needs to be enlarged, memory will be allocated. + // Returns `iterator`s pointing to the start of the previously-initialized + // portion and the start of the uninitialized portion of the created gap. + // The number of initialized spots is `pair.second - pair.first`. The number + // of raw spots is `n - (pair.second - pair.first)`. + // + // Updates the size of the InlinedVector internally. + std::pair ShiftRight(const_iterator position, + size_type n); + + void ResetAllocation(Allocation new_allocation, size_type new_size) { + if (allocated()) { + Destroy(allocated_space(), allocated_space() + size()); + assert(begin() == allocated_space()); + allocation().Dealloc(allocator()); + allocation() = new_allocation; + } else { + Destroy(inlined_space(), inlined_space() + size()); + init_allocation(new_allocation); // bug: only init once + } + tag().set_allocated_size(new_size); + } + + template + reference GrowAndEmplaceBack(Args&&... args) { + assert(size() == capacity()); + const size_type s = size(); + + Allocation new_allocation(allocator(), 2 * capacity()); + + reference new_element = + Construct(new_allocation.buffer() + s, std::forward(args)...); + UninitializedCopy(std::make_move_iterator(data()), + std::make_move_iterator(data() + s), + new_allocation.buffer()); + + ResetAllocation(new_allocation, s + 1); + + return new_element; + } + + void InitAssign(size_type n); + + void InitAssign(size_type n, const_reference v); + + template + reference Construct(pointer p, Args&&... args) { + std::allocator_traits::construct( + allocator(), p, std::forward(args)...); + return *p; + } + + template + void UninitializedCopy(Iterator src, Iterator src_last, pointer dst) { + for (; src != src_last; ++dst, ++src) Construct(dst, *src); + } + + template + void UninitializedFill(pointer dst, pointer dst_last, const Args&... args) { + for (; dst != dst_last; ++dst) Construct(dst, args...); + } + + // Destroy [`from`, `to`) in place. + void Destroy(pointer from, pointer to); + + template + void AppendRange(Iterator first, Iterator last, std::input_iterator_tag) { + std::copy(first, last, std::back_inserter(*this)); + } + + template + void AppendRange(Iterator first, Iterator last, std::forward_iterator_tag); + + template + void AppendRange(Iterator first, Iterator last) { + AppendRange(first, last, IteratorCategory()); + } + + template + void AssignRange(Iterator first, Iterator last, std::input_iterator_tag); + + template + void AssignRange(Iterator first, Iterator last, std::forward_iterator_tag); + + template + void AssignRange(Iterator first, Iterator last) { + AssignRange(first, last, IteratorCategory()); + } + + iterator InsertWithCount(const_iterator position, size_type n, + const_reference v); + + template + iterator InsertWithRange(const_iterator position, InputIterator first, + InputIterator last, std::input_iterator_tag); + + template + iterator InsertWithRange(const_iterator position, ForwardIterator first, + ForwardIterator last, std::forward_iterator_tag); + + // Stores either the inlined or allocated representation + union Rep { + using ValueTypeBuffer = + absl::aligned_storage_t; + using AllocationBuffer = + absl::aligned_storage_t; + + // Structs wrap the buffers to perform indirection that solves a bizarre + // compilation error on Visual Studio (all known versions). + struct InlinedRep { + ValueTypeBuffer inlined[inlined_capacity()]; + }; + struct AllocatedRep { + AllocationBuffer allocation; + }; + + InlinedRep inlined_storage; + AllocatedRep allocation_storage; + }; + + AllocatorAndTag allocator_and_tag_; + Rep rep_; +}; + +// ----------------------------------------------------------------------------- +// InlinedVector Non-Member Functions +// ----------------------------------------------------------------------------- + +// `swap()` +// +// Swaps the contents of two inlined vectors. This convenience function +// simply calls `InlinedVector::swap()`. +template +void swap(InlinedVector& a, + InlinedVector& b) noexcept(noexcept(a.swap(b))) { + a.swap(b); +} + +// `operator==()` +// +// Tests the equivalency of the contents of two inlined vectors. +template +bool operator==(const InlinedVector& a, + const InlinedVector& b) { + return absl::equal(a.begin(), a.end(), b.begin(), b.end()); +} + +// `operator!=()` +// +// Tests the inequality of the contents of two inlined vectors. +template +bool operator!=(const InlinedVector& a, + const InlinedVector& b) { + return !(a == b); +} + +// `operator<()` +// +// Tests whether the contents of one inlined vector are less than the contents +// of another through a lexicographical comparison operation. +template +bool operator<(const InlinedVector& a, + const InlinedVector& b) { + return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end()); +} + +// `operator>()` +// +// Tests whether the contents of one inlined vector are greater than the +// contents of another through a lexicographical comparison operation. +template +bool operator>(const InlinedVector& a, + const InlinedVector& b) { + return b < a; +} + +// `operator<=()` +// +// Tests whether the contents of one inlined vector are less than or equal to +// the contents of another through a lexicographical comparison operation. +template +bool operator<=(const InlinedVector& a, + const InlinedVector& b) { + return !(b < a); +} + +// `operator>=()` +// +// Tests whether the contents of one inlined vector are greater than or equal to +// the contents of another through a lexicographical comparison operation. +template +bool operator>=(const InlinedVector& a, + const InlinedVector& b) { + return !(a < b); +} + +// ----------------------------------------------------------------------------- +// Implementation of InlinedVector +// +// Do not depend on any below implementation details! +// ----------------------------------------------------------------------------- + +template +InlinedVector::InlinedVector(const InlinedVector& other) + : allocator_and_tag_(other.allocator()) { + reserve(other.size()); + if (allocated()) { + UninitializedCopy(other.begin(), other.end(), allocated_space()); + tag().set_allocated_size(other.size()); + } else { + UninitializedCopy(other.begin(), other.end(), inlined_space()); + tag().set_inline_size(other.size()); + } +} + +template +InlinedVector::InlinedVector(const InlinedVector& other, + const allocator_type& alloc) + : allocator_and_tag_(alloc) { + reserve(other.size()); + if (allocated()) { + UninitializedCopy(other.begin(), other.end(), allocated_space()); + tag().set_allocated_size(other.size()); + } else { + UninitializedCopy(other.begin(), other.end(), inlined_space()); + tag().set_inline_size(other.size()); + } +} + +template +InlinedVector::InlinedVector(InlinedVector&& other) noexcept( + absl::allocator_is_nothrow::value || + std::is_nothrow_move_constructible::value) + : allocator_and_tag_(other.allocator_and_tag_) { + if (other.allocated()) { + // We can just steal the underlying buffer from the source. + // That leaves the source empty, so we clear its size. + init_allocation(other.allocation()); + other.tag() = Tag(); + } else { + UninitializedCopy( + std::make_move_iterator(other.inlined_space()), + std::make_move_iterator(other.inlined_space() + other.size()), + inlined_space()); + } +} + +template +InlinedVector::InlinedVector(InlinedVector&& other, + const allocator_type& alloc) noexcept( // + absl::allocator_is_nothrow::value) + : allocator_and_tag_(alloc) { + if (other.allocated()) { + if (alloc == other.allocator()) { + // We can just steal the allocation from the source. + tag() = other.tag(); + init_allocation(other.allocation()); + other.tag() = Tag(); + } else { + // We need to use our own allocator + reserve(other.size()); + UninitializedCopy(std::make_move_iterator(other.begin()), + std::make_move_iterator(other.end()), + allocated_space()); + tag().set_allocated_size(other.size()); + } + } else { + UninitializedCopy( + std::make_move_iterator(other.inlined_space()), + std::make_move_iterator(other.inlined_space() + other.size()), + inlined_space()); + tag().set_inline_size(other.size()); + } +} + +template +void InlinedVector::InitAssign(size_type n, const_reference v) { + if (n > inlined_capacity()) { + Allocation new_allocation(allocator(), n); + init_allocation(new_allocation); + UninitializedFill(allocated_space(), allocated_space() + n, v); + tag().set_allocated_size(n); + } else { + UninitializedFill(inlined_space(), inlined_space() + n, v); + tag().set_inline_size(n); + } +} + +template +void InlinedVector::InitAssign(size_type n) { + if (n > inlined_capacity()) { + Allocation new_allocation(allocator(), n); + init_allocation(new_allocation); + UninitializedFill(allocated_space(), allocated_space() + n); + tag().set_allocated_size(n); + } else { + UninitializedFill(inlined_space(), inlined_space() + n); + tag().set_inline_size(n); + } +} + +template +void InlinedVector::resize(size_type n) { + size_type s = size(); + if (n < s) { + erase(begin() + n, end()); + return; + } + reserve(n); + assert(capacity() >= n); + + // Fill new space with elements constructed in-place. + if (allocated()) { + UninitializedFill(allocated_space() + s, allocated_space() + n); + tag().set_allocated_size(n); + } else { + UninitializedFill(inlined_space() + s, inlined_space() + n); + tag().set_inline_size(n); + } +} + +template +void InlinedVector::resize(size_type n, const_reference v) { + size_type s = size(); + if (n < s) { + erase(begin() + n, end()); + return; + } + reserve(n); + assert(capacity() >= n); + + // Fill new space with copies of 'v'. + if (allocated()) { + UninitializedFill(allocated_space() + s, allocated_space() + n, v); + tag().set_allocated_size(n); + } else { + UninitializedFill(inlined_space() + s, inlined_space() + n, v); + tag().set_inline_size(n); + } +} + +template +template +auto InlinedVector::emplace(const_iterator position, Args&&... args) + -> iterator { + assert(position >= begin()); + assert(position <= end()); + if (ABSL_PREDICT_FALSE(position == end())) { + emplace_back(std::forward(args)...); + return end() - 1; + } + + T new_t = T(std::forward(args)...); + + auto range = ShiftRight(position, 1); + if (range.first == range.second) { + // constructing into uninitialized memory + Construct(range.first, std::move(new_t)); + } else { + // assigning into moved-from object + *range.first = T(std::move(new_t)); + } + + return range.first; +} + +template +auto InlinedVector::erase(const_iterator from, const_iterator to) + -> iterator { + assert(begin() <= from); + assert(from <= to); + assert(to <= end()); + + iterator range_start = const_cast(from); + iterator range_end = const_cast(to); + + size_type s = size(); + ptrdiff_t erase_gap = std::distance(range_start, range_end); + if (erase_gap > 0) { + pointer space; + if (allocated()) { + space = allocated_space(); + tag().set_allocated_size(s - erase_gap); + } else { + space = inlined_space(); + tag().set_inline_size(s - erase_gap); + } + std::move(range_end, space + s, range_start); + Destroy(space + s - erase_gap, space + s); + } + return range_start; +} + +template +void InlinedVector::swap(InlinedVector& other) { + using std::swap; // Augment ADL with `std::swap`. + if (ABSL_PREDICT_FALSE(this == &other)) return; + + if (allocated() && other.allocated()) { + // Both out of line, so just swap the tag, allocation, and allocator. + swap(tag(), other.tag()); + swap(allocation(), other.allocation()); + swap(allocator(), other.allocator()); + return; + } + if (!allocated() && !other.allocated()) { + // Both inlined: swap up to smaller size, then move remaining elements. + InlinedVector* a = this; + InlinedVector* b = &other; + if (size() < other.size()) { + swap(a, b); + } + + const size_type a_size = a->size(); + const size_type b_size = b->size(); + assert(a_size >= b_size); + // `a` is larger. Swap the elements up to the smaller array size. + std::swap_ranges(a->inlined_space(), a->inlined_space() + b_size, + b->inlined_space()); + + // Move the remaining elements: + // [`b_size`, `a_size`) from `a` -> [`b_size`, `a_size`) from `b` + b->UninitializedCopy(a->inlined_space() + b_size, + a->inlined_space() + a_size, + b->inlined_space() + b_size); + a->Destroy(a->inlined_space() + b_size, a->inlined_space() + a_size); + + swap(a->tag(), b->tag()); + swap(a->allocator(), b->allocator()); + assert(b->size() == a_size); + assert(a->size() == b_size); + return; + } + + // One is out of line, one is inline. + // We first move the elements from the inlined vector into the + // inlined space in the other vector. We then put the other vector's + // pointer/capacity into the originally inlined vector and swap + // the tags. + InlinedVector* a = this; + InlinedVector* b = &other; + if (a->allocated()) { + swap(a, b); + } + assert(!a->allocated()); + assert(b->allocated()); + const size_type a_size = a->size(); + const size_type b_size = b->size(); + // In an optimized build, `b_size` would be unused. + static_cast(b_size); + + // Made Local copies of `size()`, don't need `tag()` accurate anymore + swap(a->tag(), b->tag()); + + // Copy `b_allocation` out before `b`'s union gets clobbered by `inline_space` + Allocation b_allocation = b->allocation(); + + b->UninitializedCopy(a->inlined_space(), a->inlined_space() + a_size, + b->inlined_space()); + a->Destroy(a->inlined_space(), a->inlined_space() + a_size); + + a->allocation() = b_allocation; + + if (a->allocator() != b->allocator()) { + swap(a->allocator(), b->allocator()); + } + + assert(b->size() == a_size); + assert(a->size() == b_size); +} + +template +void InlinedVector::EnlargeBy(size_type delta) { + const size_type s = size(); + assert(s <= capacity()); + + size_type target = std::max(inlined_capacity(), s + delta); + + // Compute new capacity by repeatedly doubling current capacity + // TODO(psrc): Check and avoid overflow? + size_type new_capacity = capacity(); + while (new_capacity < target) { + new_capacity <<= 1; + } + + Allocation new_allocation(allocator(), new_capacity); + + UninitializedCopy(std::make_move_iterator(data()), + std::make_move_iterator(data() + s), + new_allocation.buffer()); + + ResetAllocation(new_allocation, s); +} + +template +auto InlinedVector::ShiftRight(const_iterator position, size_type n) + -> std::pair { + iterator start_used = const_cast(position); + iterator start_raw = const_cast(position); + size_type s = size(); + size_type required_size = s + n; + + if (required_size > capacity()) { + // Compute new capacity by repeatedly doubling current capacity + size_type new_capacity = capacity(); + while (new_capacity < required_size) { + new_capacity <<= 1; + } + // Move everyone into the new allocation, leaving a gap of `n` for the + // requested shift. + Allocation new_allocation(allocator(), new_capacity); + size_type index = position - begin(); + UninitializedCopy(std::make_move_iterator(data()), + std::make_move_iterator(data() + index), + new_allocation.buffer()); + UninitializedCopy(std::make_move_iterator(data() + index), + std::make_move_iterator(data() + s), + new_allocation.buffer() + index + n); + ResetAllocation(new_allocation, s); + + // New allocation means our iterator is invalid, so we'll recalculate. + // Since the entire gap is in new space, there's no used space to reuse. + start_raw = begin() + index; + start_used = start_raw; + } else { + // If we had enough space, it's a two-part move. Elements going into + // previously-unoccupied space need an `UninitializedCopy()`. Elements + // going into a previously-occupied space are just a `std::move()`. + iterator pos = const_cast(position); + iterator raw_space = end(); + size_type slots_in_used_space = raw_space - pos; + size_type new_elements_in_used_space = std::min(n, slots_in_used_space); + size_type new_elements_in_raw_space = n - new_elements_in_used_space; + size_type old_elements_in_used_space = + slots_in_used_space - new_elements_in_used_space; + + UninitializedCopy(std::make_move_iterator(pos + old_elements_in_used_space), + std::make_move_iterator(raw_space), + raw_space + new_elements_in_raw_space); + std::move_backward(pos, pos + old_elements_in_used_space, raw_space); + + // If the gap is entirely in raw space, the used space starts where the raw + // space starts, leaving no elements in used space. If the gap is entirely + // in used space, the raw space starts at the end of the gap, leaving all + // elements accounted for within the used space. + start_used = pos; + start_raw = pos + new_elements_in_used_space; + } + tag().add_size(n); + return std::make_pair(start_used, start_raw); +} + +template +void InlinedVector::Destroy(pointer from, pointer to) { + for (pointer cur = from; cur != to; ++cur) { + std::allocator_traits::destroy(allocator(), cur); + } +#ifndef NDEBUG + // Overwrite unused memory with `0xab` so we can catch uninitialized usage. + // Cast to `void*` to tell the compiler that we don't care that we might be + // scribbling on a vtable pointer. + if (from != to) { + auto len = sizeof(value_type) * std::distance(from, to); + std::memset(reinterpret_cast(from), 0xab, len); + } +#endif +} + +template +template +void InlinedVector::AppendRange(Iterator first, Iterator last, + std::forward_iterator_tag) { + auto length = std::distance(first, last); + reserve(size() + length); + if (allocated()) { + UninitializedCopy(first, last, allocated_space() + size()); + tag().set_allocated_size(size() + length); + } else { + UninitializedCopy(first, last, inlined_space() + size()); + tag().set_inline_size(size() + length); + } +} + +template +template +void InlinedVector::AssignRange(Iterator first, Iterator last, + std::input_iterator_tag) { + // Optimized to avoid reallocation. + // Prefer reassignment to copy construction for elements. + iterator out = begin(); + for (; first != last && out != end(); ++first, ++out) { + *out = *first; + } + erase(out, end()); + std::copy(first, last, std::back_inserter(*this)); +} + +template +template +void InlinedVector::AssignRange(Iterator first, Iterator last, + std::forward_iterator_tag) { + auto length = std::distance(first, last); + // Prefer reassignment to copy construction for elements. + if (static_cast(length) <= size()) { + erase(std::copy(first, last, begin()), end()); + return; + } + reserve(length); + iterator out = begin(); + for (; out != end(); ++first, ++out) *out = *first; + if (allocated()) { + UninitializedCopy(first, last, out); + tag().set_allocated_size(length); + } else { + UninitializedCopy(first, last, out); + tag().set_inline_size(length); + } +} + +template +auto InlinedVector::InsertWithCount(const_iterator position, + size_type n, const_reference v) + -> iterator { + assert(position >= begin() && position <= end()); + if (ABSL_PREDICT_FALSE(n == 0)) return const_cast(position); + + value_type copy = v; + std::pair it_pair = ShiftRight(position, n); + std::fill(it_pair.first, it_pair.second, copy); + UninitializedFill(it_pair.second, it_pair.first + n, copy); + + return it_pair.first; +} + +template +template +auto InlinedVector::InsertWithRange(const_iterator position, + InputIterator first, + InputIterator last, + std::input_iterator_tag) + -> iterator { + assert(position >= begin() && position <= end()); + size_type index = position - cbegin(); + size_type i = index; + while (first != last) insert(begin() + i++, *first++); + return begin() + index; +} + +template +template +auto InlinedVector::InsertWithRange(const_iterator position, + ForwardIterator first, + ForwardIterator last, + std::forward_iterator_tag) + -> iterator { + assert(position >= begin() && position <= end()); + if (ABSL_PREDICT_FALSE(first == last)) return const_cast(position); + + auto n = std::distance(first, last); + std::pair it_pair = ShiftRight(position, n); + size_type used_spots = it_pair.second - it_pair.first; + ForwardIterator open_spot = std::next(first, used_spots); + std::copy(first, open_spot, it_pair.first); + UninitializedCopy(open_spot, last, it_pair.second); + return it_pair.first; +} + +} // namespace absl + +#endif // ABSL_CONTAINER_INLINED_VECTOR_H_ diff --git a/libtgvoip/webrtc_dsp/absl/memory/memory.h b/libtgvoip/webrtc_dsp/absl/memory/memory.h new file mode 100755 index 0000000..8bf4fe8 --- /dev/null +++ b/libtgvoip/webrtc_dsp/absl/memory/memory.h @@ -0,0 +1,697 @@ +// Copyright 2017 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ----------------------------------------------------------------------------- +// File: memory.h +// ----------------------------------------------------------------------------- +// +// This header file contains utility functions for managing the creation and +// conversion of smart pointers. This file is an extension to the C++ +// standard library header file. + +#ifndef ABSL_MEMORY_MEMORY_H_ +#define ABSL_MEMORY_MEMORY_H_ + +#include +#include +#include +#include +#include +#include + +#include "absl/base/macros.h" +#include "absl/meta/type_traits.h" + +namespace absl { + +// ----------------------------------------------------------------------------- +// Function Template: WrapUnique() +// ----------------------------------------------------------------------------- +// +// Adopts ownership from a raw pointer and transfers it to the returned +// `std::unique_ptr`, whose type is deduced. Because of this deduction, *do not* +// specify the template type `T` when calling `WrapUnique`. +// +// Example: +// X* NewX(int, int); +// auto x = WrapUnique(NewX(1, 2)); // 'x' is std::unique_ptr. +// +// The purpose of WrapUnique is to automatically deduce the pointer type. If you +// wish to make the type explicit, for readability reasons or because you prefer +// to use a base-class pointer rather than a derived one, just use +// `std::unique_ptr` directly. +// +// Example: +// X* Factory(int, int); +// auto x = std::unique_ptr(Factory(1, 2)); +// - or - +// std::unique_ptr x(Factory(1, 2)); +// +// This has the added advantage of working whether Factory returns a raw +// pointer or a `std::unique_ptr`. +// +// While `absl::WrapUnique` is useful for capturing the output of a raw +// pointer factory, prefer 'absl::make_unique(args...)' over +// 'absl::WrapUnique(new T(args...))'. +// +// auto x = WrapUnique(new X(1, 2)); // works, but nonideal. +// auto x = make_unique(1, 2); // safer, standard, avoids raw 'new'. +// +// Note that `absl::WrapUnique(p)` is valid only if `delete p` is a valid +// expression. In particular, `absl::WrapUnique()` cannot wrap pointers to +// arrays, functions or void, and it must not be used to capture pointers +// obtained from array-new expressions (even though that would compile!). +template +std::unique_ptr WrapUnique(T* ptr) { + static_assert(!std::is_array::value, "array types are unsupported"); + static_assert(std::is_object::value, "non-object types are unsupported"); + return std::unique_ptr(ptr); +} + +namespace memory_internal { + +// Traits to select proper overload and return type for `absl::make_unique<>`. +template +struct MakeUniqueResult { + using scalar = std::unique_ptr; +}; +template +struct MakeUniqueResult { + using array = std::unique_ptr; +}; +template +struct MakeUniqueResult { + using invalid = void; +}; + +} // namespace memory_internal + +// gcc 4.8 has __cplusplus at 201301 but doesn't define make_unique. Other +// supported compilers either just define __cplusplus as 201103 but have +// make_unique (msvc), or have make_unique whenever __cplusplus > 201103 (clang) +#if (__cplusplus > 201103L || defined(_MSC_VER)) && \ + !(defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ == 8) +using std::make_unique; +#else +// ----------------------------------------------------------------------------- +// Function Template: make_unique() +// ----------------------------------------------------------------------------- +// +// Creates a `std::unique_ptr<>`, while avoiding issues creating temporaries +// during the construction process. `absl::make_unique<>` also avoids redundant +// type declarations, by avoiding the need to explicitly use the `new` operator. +// +// This implementation of `absl::make_unique<>` is designed for C++11 code and +// will be replaced in C++14 by the equivalent `std::make_unique<>` abstraction. +// `absl::make_unique<>` is designed to be 100% compatible with +// `std::make_unique<>` so that the eventual migration will involve a simple +// rename operation. +// +// For more background on why `std::unique_ptr(new T(a,b))` is problematic, +// see Herb Sutter's explanation on +// (Exception-Safe Function Calls)[http://herbsutter.com/gotw/_102/]. +// (In general, reviewers should treat `new T(a,b)` with scrutiny.) +// +// Example usage: +// +// auto p = make_unique(args...); // 'p' is a std::unique_ptr +// auto pa = make_unique(5); // 'pa' is a std::unique_ptr +// +// Three overloads of `absl::make_unique` are required: +// +// - For non-array T: +// +// Allocates a T with `new T(std::forward args...)`, +// forwarding all `args` to T's constructor. +// Returns a `std::unique_ptr` owning that object. +// +// - For an array of unknown bounds T[]: +// +// `absl::make_unique<>` will allocate an array T of type U[] with +// `new U[n]()` and return a `std::unique_ptr` owning that array. +// +// Note that 'U[n]()' is different from 'U[n]', and elements will be +// value-initialized. Note as well that `std::unique_ptr` will perform its +// own destruction of the array elements upon leaving scope, even though +// the array [] does not have a default destructor. +// +// NOTE: an array of unknown bounds T[] may still be (and often will be) +// initialized to have a size, and will still use this overload. E.g: +// +// auto my_array = absl::make_unique(10); +// +// - For an array of known bounds T[N]: +// +// `absl::make_unique<>` is deleted (like with `std::make_unique<>`) as +// this overload is not useful. +// +// NOTE: an array of known bounds T[N] is not considered a useful +// construction, and may cause undefined behavior in templates. E.g: +// +// auto my_array = absl::make_unique(); +// +// In those cases, of course, you can still use the overload above and +// simply initialize it to its desired size: +// +// auto my_array = absl::make_unique(10); + +// `absl::make_unique` overload for non-array types. +template +typename memory_internal::MakeUniqueResult::scalar make_unique( + Args&&... args) { + return std::unique_ptr(new T(std::forward(args)...)); +} + +// `absl::make_unique` overload for an array T[] of unknown bounds. +// The array allocation needs to use the `new T[size]` form and cannot take +// element constructor arguments. The `std::unique_ptr` will manage destructing +// these array elements. +template +typename memory_internal::MakeUniqueResult::array make_unique(size_t n) { + return std::unique_ptr(new typename absl::remove_extent_t[n]()); +} + +// `absl::make_unique` overload for an array T[N] of known bounds. +// This construction will be rejected. +template +typename memory_internal::MakeUniqueResult::invalid make_unique( + Args&&... /* args */) = delete; +#endif + +// ----------------------------------------------------------------------------- +// Function Template: RawPtr() +// ----------------------------------------------------------------------------- +// +// Extracts the raw pointer from a pointer-like value `ptr`. `absl::RawPtr` is +// useful within templates that need to handle a complement of raw pointers, +// `std::nullptr_t`, and smart pointers. +template +auto RawPtr(T&& ptr) -> decltype(std::addressof(*ptr)) { + // ptr is a forwarding reference to support Ts with non-const operators. + return (ptr != nullptr) ? std::addressof(*ptr) : nullptr; +} +inline std::nullptr_t RawPtr(std::nullptr_t) { return nullptr; } + +// ----------------------------------------------------------------------------- +// Function Template: ShareUniquePtr() +// ----------------------------------------------------------------------------- +// +// Adopts a `std::unique_ptr` rvalue and returns a `std::shared_ptr` of deduced +// type. Ownership (if any) of the held value is transferred to the returned +// shared pointer. +// +// Example: +// +// auto up = absl::make_unique(10); +// auto sp = absl::ShareUniquePtr(std::move(up)); // shared_ptr +// CHECK_EQ(*sp, 10); +// CHECK(up == nullptr); +// +// Note that this conversion is correct even when T is an array type, and more +// generally it works for *any* deleter of the `unique_ptr` (single-object +// deleter, array deleter, or any custom deleter), since the deleter is adopted +// by the shared pointer as well. The deleter is copied (unless it is a +// reference). +// +// Implements the resolution of [LWG 2415](http://wg21.link/lwg2415), by which a +// null shared pointer does not attempt to call the deleter. +template +std::shared_ptr ShareUniquePtr(std::unique_ptr&& ptr) { + return ptr ? std::shared_ptr(std::move(ptr)) : std::shared_ptr(); +} + +// ----------------------------------------------------------------------------- +// Function Template: WeakenPtr() +// ----------------------------------------------------------------------------- +// +// Creates a weak pointer associated with a given shared pointer. The returned +// value is a `std::weak_ptr` of deduced type. +// +// Example: +// +// auto sp = std::make_shared(10); +// auto wp = absl::WeakenPtr(sp); +// CHECK_EQ(sp.get(), wp.lock().get()); +// sp.reset(); +// CHECK(wp.lock() == nullptr); +// +template +std::weak_ptr WeakenPtr(const std::shared_ptr& ptr) { + return std::weak_ptr(ptr); +} + +namespace memory_internal { + +// ExtractOr::type evaluates to E if possible. Otherwise, D. +template