diff --git a/.gitignore b/.gitignore index c1b0826211..3b1ac87727 100644 --- a/.gitignore +++ b/.gitignore @@ -17,8 +17,9 @@ x86/ bld/ [Bb]in/ [Oo]bj/ +DerivedData/ # Visual Studio 2015 cache/options directory .vs/ -xcuserdata/ +xcuserdata/ \ No newline at end of file diff --git a/MediaStreamItf.cpp b/MediaStreamItf.cpp index a2a2a617ea..889dabc900 100644 --- a/MediaStreamItf.cpp +++ b/MediaStreamItf.cpp @@ -20,7 +20,9 @@ void MediaStreamItf::SetCallback(size_t (*f)(unsigned char *, size_t, void*), vo } size_t MediaStreamItf::InvokeCallback(unsigned char *data, size_t length){ - return (*callback)(data, length, callbackParam); + if(callback) + return (*callback)(data, length, callbackParam); + return NULL; } AudioMixer::AudioMixer() : bufferPool(960*2, 16), processedQueue(16), semaphore(16, 0){ diff --git a/VoIPController.cpp b/VoIPController.cpp index 7fe0d01147..84098b367d 100644 --- a/VoIPController.cpp +++ b/VoIPController.cpp @@ -52,6 +52,10 @@ int64_t VoIPController::win32TimeScale = 0; bool VoIPController::didInitWin32TimeScale = false; #endif +#if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) +#include "audio/AudioIOCallback.h" +#endif + #ifndef TGVOIP_USE_CUSTOM_CRYPTO extern "C" { #include @@ -2404,8 +2408,8 @@ void VoIPController::SetConfig(const Config& cfg){ #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 + // LOGW("Failed to open stats dump file %s for writing", config.statsDumpFilePath.c_str()); }else{ statsDump=NULL; } @@ -2655,17 +2659,11 @@ void VoIPController::StartAudio(){ encoder->SetEchoCanceller(echoCanceller); encoder->SetSecondaryEncoderEnabled(false); - encoder->Start(); - if(!micMuted){ - audioInput->Start(); - if(!audioInput->IsInitialized()){ - LOGE("Erorr initializing audio capture"); - lastError=ERROR_AUDIO_IO; - - SetState(STATE_FAILED); - return; - } - } +#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; @@ -2690,6 +2688,18 @@ void VoIPController::StartAudio(){ 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; + } + } } void VoIPController::OnAudioOutputReady(){ @@ -2793,6 +2803,17 @@ void VoIPController::ResetEndpointPingStats(){ } } +#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; +} + #pragma mark - Timer methods void VoIPController::SendUdpPings(){ diff --git a/VoIPController.h b/VoIPController.h index 7f94c1477f..12849d7ee6 100644 --- a/VoIPController.h +++ b/VoIPController.h @@ -35,7 +35,7 @@ #include "PacketReassembler.h" #include "MessageThread.h" -#define LIBTGVOIP_VERSION "2.2.3" +#define LIBTGVOIP_VERSION "2.2.4" #ifdef _WIN32 #undef GetCurrentTime @@ -362,6 +362,11 @@ namespace tgvoip{ */ void RequestCallUpgrade(); void SetEchoCancellationStrength(int strength); + int GetConnectionState(); + +#if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) + void SetAudioDataCallbacks(std::function input, std::function output); +#endif struct Callbacks{ void (*connectionStateChanged)(VoIPController*, int); @@ -604,6 +609,11 @@ namespace tgvoip{ uint32_t initTimeoutID=MessageThread::INVALID_ID; uint32_t noStreamsNopID=MessageThread::INVALID_ID; uint32_t udpPingTimeoutID=MessageThread::INVALID_ID; + +#if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) + std::function audioInputDataCallback; + std::function audioOutputDataCallback; +#endif /*** server config values ***/ uint32_t maxAudioBitrate; diff --git a/audio/AudioIO.cpp b/audio/AudioIO.cpp index 06beea77ae..45767c7f9f 100644 --- a/audio/AudioIO.cpp +++ b/audio/AudioIO.cpp @@ -12,7 +12,9 @@ #include "config.h" #endif -#if defined(__ANDROID__) +#if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) +#include "AudioIOCallback.h" +#elif defined(__ANDROID__) #include "../os/android/AudioInputAndroid.h" #include "../os/android/AudioOutputAndroid.h" #elif defined(__APPLE__) @@ -47,7 +49,9 @@ using namespace std; shared_ptr AudioIO::Create(){ std::string inputDevice="default", outputDevice="default"; -#if defined(__ANDROID__) +#if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) + return std::make_shared(); +#elif defined(__ANDROID__) return std::make_shared>(); #elif defined(__APPLE__) #if TARGET_OS_OSX diff --git a/audio/AudioIO.h b/audio/AudioIO.h index e922ecf95b..5a58e6517f 100644 --- a/audio/AudioIO.h +++ b/audio/AudioIO.h @@ -10,6 +10,7 @@ #include "AudioInput.h" #include "AudioOutput.h" +#include "../utils.h" #include #include @@ -17,7 +18,9 @@ namespace tgvoip{ namespace audio { class AudioIO{ public: + AudioIO(){}; virtual ~AudioIO(){}; + TGVOIP_DISALLOW_COPY_AND_ASSIGN(AudioIO); static std::shared_ptr Create(); virtual AudioInput* GetInput()=0; virtual AudioOutput* GetOutput()=0; diff --git a/audio/AudioIOCallback.cpp b/audio/AudioIOCallback.cpp new file mode 100644 index 0000000000..fd1a45928c --- /dev/null +++ b/audio/AudioIOCallback.cpp @@ -0,0 +1,121 @@ +// +// 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 "AudioIOCallback.h" +#include "../VoIPController.h" +#include "../logging.h" + +using namespace tgvoip; +using namespace tgvoip::audio; + +#pragma mark - IO + +AudioIOCallback::AudioIOCallback(){ + input=new AudioInputCallback(); + output=new AudioOutputCallback(); +} + +AudioIOCallback::~AudioIOCallback(){ + delete input; + delete output; +} + +AudioInput* AudioIOCallback::GetInput(){ + return input; +} + +AudioOutput* AudioIOCallback::GetOutput(){ + return output; +} + +#pragma mark - Input + +AudioInputCallback::AudioInputCallback(){ + thread=new Thread(new MethodPointer(&AudioInputCallback::RunThread, this), NULL); + thread->SetName("AudioInputCallback"); +} + +AudioInputCallback::~AudioInputCallback(){ + running=false; + thread->Join(); + delete thread; +} + +void AudioInputCallback::Start(){ + if(!running){ + running=true; + thread->Start(); + } + recording=true; +} + +void AudioInputCallback::Stop(){ + recording=false; +} + +void AudioInputCallback::SetDataCallback(std::function c){ + dataCallback=c; +} + +void AudioInputCallback::RunThread(void*){ + int16_t buf[960]; + while(running){ + double t=VoIPController::GetCurrentTime(); + memset(buf, 0, sizeof(buf)); + dataCallback(buf, 960); + InvokeCallback(reinterpret_cast(buf), 960*2); + double sl=0.02-(VoIPController::GetCurrentTime()-t); + if(sl>0) + Thread::Sleep(sl); + } +} + +#pragma mark - Output + +AudioOutputCallback::AudioOutputCallback(){ + thread=new Thread(new MethodPointer(&AudioOutputCallback::RunThread, this), NULL); + thread->SetName("AudioOutputCallback"); +} + +AudioOutputCallback::~AudioOutputCallback(){ + running=false; + thread->Join(); + delete thread; +} + +void AudioOutputCallback::Start(){ + if(!running){ + running=true; + thread->Start(); + } + playing=true; +} + +void AudioOutputCallback::Stop(){ + playing=false; +} + +bool AudioOutputCallback::IsPlaying(){ + return playing; +} + +void AudioOutputCallback::SetDataCallback(std::function c){ + dataCallback=c; +} + +void AudioOutputCallback::RunThread(void*){ + int16_t buf[960]; + while(running){ + double t=VoIPController::GetCurrentTime(); + InvokeCallback(reinterpret_cast(buf), 960*2); + dataCallback(buf, 960); + double sl=0.02-(VoIPController::GetCurrentTime()-t); + if(sl>0) + Thread::Sleep(sl); + } +} + + diff --git a/audio/AudioIOCallback.h b/audio/AudioIOCallback.h new file mode 100644 index 0000000000..36ba03b494 --- /dev/null +++ b/audio/AudioIOCallback.h @@ -0,0 +1,62 @@ +// +// 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_AUDIO_IO_CALLBACK +#define LIBTGVOIP_AUDIO_IO_CALLBACK + +#include +#include + +#include "../threading.h" + +namespace tgvoip{ + namespace audio{ + class AudioInputCallback : public AudioInput{ + public: + AudioInputCallback(); + virtual ~AudioInputCallback(); + virtual void Start() override; + virtual void Stop() override; + void SetDataCallback(std::function c); + private: + void RunThread(void*); + bool running=false; + bool recording=false; + Thread* thread; + std::function dataCallback; + }; + + class AudioOutputCallback : public AudioOutput{ + public: + AudioOutputCallback(); + virtual ~AudioOutputCallback(); + virtual void Start() override; + virtual void Stop() override; + virtual bool IsPlaying() override; + void SetDataCallback(std::function c); + private: + void RunThread(void*); + bool running=false; + bool playing=false; + Thread* thread; + std::function dataCallback; + }; + + class AudioIOCallback : public AudioIO{ + public: + AudioIOCallback(); + virtual ~AudioIOCallback(); + virtual AudioInput* GetInput() override; + virtual AudioOutput* GetOutput() override; + private: + AudioInputCallback* input; + AudioOutputCallback* output; + }; + } +} + + +#endif /* LIBTGVOIP_AUDIO_IO_CALLBACK */ diff --git a/audio/AudioInput.cpp b/audio/AudioInput.cpp index 3e3ccb9dd2..dae647a1c7 100644 --- a/audio/AudioInput.cpp +++ b/audio/AudioInput.cpp @@ -11,7 +11,9 @@ #include "config.h" #endif -#if defined(__ANDROID__) +#if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) +// nothing +#elif defined(__ANDROID__) #include "../os/android/AudioInputAndroid.h" #elif defined(__APPLE__) #include @@ -58,7 +60,9 @@ bool AudioInput::IsInitialized(){ } void AudioInput::EnumerateDevices(std::vector& devs){ -#if defined(__APPLE__) && TARGET_OS_OSX +#if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) + // not supported +#elif defined(__APPLE__) && TARGET_OS_OSX AudioInputAudioUnitLegacy::EnumerateDevices(devs); #elif defined(_WIN32) #ifdef TGVOIP_WINXP_COMPAT diff --git a/audio/AudioOutput.cpp b/audio/AudioOutput.cpp index 938c1aac32..458e8a5cd2 100644 --- a/audio/AudioOutput.cpp +++ b/audio/AudioOutput.cpp @@ -12,7 +12,9 @@ #include "config.h" #endif -#if defined(__ANDROID__) +#if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) +// nothing +#elif defined(__ANDROID__) #include "../os/android/AudioOutputOpenSLES.h" #include "../os/android/AudioOutputAndroid.h" #include @@ -69,7 +71,9 @@ int32_t AudioOutput::GetEstimatedDelay(){ void AudioOutput::EnumerateDevices(std::vector& devs){ -#if defined(__APPLE__) && TARGET_OS_OSX +#if defined(TGVOIP_USE_CALLBACK_AUDIO_IO) + // not supported +#elif defined(__APPLE__) && TARGET_OS_OSX AudioOutputAudioUnitLegacy::EnumerateDevices(devs); #elif defined(_WIN32) #ifdef TGVOIP_WINXP_COMPAT diff --git a/libtgvoip_osx.xcodeproj/project.pbxproj b/libtgvoip_osx.xcodeproj/project.pbxproj index 68cfcfd5e3..9bd25ab4a0 100644 --- a/libtgvoip_osx.xcodeproj/project.pbxproj +++ b/libtgvoip_osx.xcodeproj/project.pbxproj @@ -48,9 +48,14 @@ 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 */; }; - 698848421F4B39F700076DF0 /* AudioInputAudioUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 6988483C1F4B39F700076DF0 /* AudioInputAudioUnit.h */; }; - 698848441F4B39F700076DF0 /* AudioOutputAudioUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 6988483E1F4B39F700076DF0 /* AudioOutputAudioUnit.h */; }; - 698848461F4B39F700076DF0 /* AudioUnitIO.h in Headers */ = {isa = PBXBuildFile; fileRef = 698848401F4B39F700076DF0 /* AudioUnitIO.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 */; }; @@ -186,7 +191,10 @@ 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 */; }; - 69AC14911F4B41CF00AC3173 /* Resampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 69AC148F1F4B41CF00AC3173 /* Resampler.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 */; }; @@ -243,59 +251,70 @@ remoteGlobalIDString = 099120C01EEAA63400F1366E; remoteInfo = Widget; }; + 697B6FCA2136DBA4004C8E54 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 69F8422D1E67540700C110F7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 69F842351E67540700C110F7; + remoteInfo = libtgvoip; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 690725BC1EBBD5DE005D860B /* NetworkSocketPosix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkSocketPosix.cpp; sourceTree = ""; }; - 690725BD1EBBD5DE005D860B /* NetworkSocketPosix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkSocketPosix.h; sourceTree = ""; }; - 690725C01EBBD5F2005D860B /* NetworkSocket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkSocket.cpp; sourceTree = ""; }; - 690725C11EBBD5F2005D860B /* NetworkSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkSocket.h; sourceTree = ""; }; - 6915307A1E6B5BAB004F643F /* logging.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = logging.cpp; sourceTree = ""; }; - 692AB8881E6759DD00706ACC /* AudioInput.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioInput.cpp; sourceTree = ""; }; - 692AB8891E6759DD00706ACC /* AudioInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioInput.h; sourceTree = ""; }; - 692AB88A1E6759DD00706ACC /* AudioOutput.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioOutput.cpp; sourceTree = ""; }; - 692AB88B1E6759DD00706ACC /* AudioOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioOutput.h; sourceTree = ""; }; - 692AB88C1E6759DD00706ACC /* BlockingQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BlockingQueue.cpp; sourceTree = ""; }; - 692AB88D1E6759DD00706ACC /* BlockingQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlockingQueue.h; sourceTree = ""; }; - 692AB88E1E6759DD00706ACC /* Buffers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Buffers.cpp; sourceTree = ""; }; - 692AB88F1E6759DD00706ACC /* Buffers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Buffers.h; sourceTree = ""; }; - 692AB8901E6759DD00706ACC /* VoIPGroupController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VoIPGroupController.cpp; sourceTree = ""; }; - 692AB8911E6759DD00706ACC /* PrivateDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrivateDefines.h; sourceTree = ""; }; - 692AB8971E6759DD00706ACC /* CongestionControl.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = CongestionControl.cpp; sourceTree = ""; }; - 692AB8981E6759DD00706ACC /* CongestionControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CongestionControl.h; sourceTree = ""; }; - 692AB8991E6759DD00706ACC /* EchoCanceller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EchoCanceller.cpp; sourceTree = ""; }; - 692AB89A1E6759DD00706ACC /* EchoCanceller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EchoCanceller.h; sourceTree = ""; }; - 692AB8A71E6759DD00706ACC /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 692AB8A81E6759DD00706ACC /* JitterBuffer.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = JitterBuffer.cpp; sourceTree = ""; }; - 692AB8A91E6759DD00706ACC /* JitterBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JitterBuffer.h; sourceTree = ""; }; - 692AB8AA1E6759DD00706ACC /* logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logging.h; sourceTree = ""; }; - 692AB8AB1E6759DD00706ACC /* MediaStreamItf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaStreamItf.cpp; sourceTree = ""; }; - 692AB8AC1E6759DD00706ACC /* MediaStreamItf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamItf.h; sourceTree = ""; }; - 692AB8AD1E6759DD00706ACC /* OpusDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OpusDecoder.cpp; sourceTree = ""; }; - 692AB8AE1E6759DD00706ACC /* OpusDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpusDecoder.h; sourceTree = ""; }; - 692AB8AF1E6759DD00706ACC /* OpusEncoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OpusEncoder.cpp; sourceTree = ""; }; - 692AB8B01E6759DD00706ACC /* OpusEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpusEncoder.h; sourceTree = ""; }; - 692AB8C61E6759DD00706ACC /* threading.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = threading.h; sourceTree = ""; }; - 692AB8C71E6759DD00706ACC /* VoIPController.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = VoIPController.cpp; sourceTree = ""; }; - 692AB8C81E6759DD00706ACC /* VoIPController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VoIPController.h; sourceTree = ""; }; - 692AB8C91E6759DD00706ACC /* VoIPServerConfig.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VoIPServerConfig.cpp; sourceTree = ""; }; - 692AB8CA1E6759DD00706ACC /* VoIPServerConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VoIPServerConfig.h; sourceTree = ""; }; + 690725BC1EBBD5DE005D860B /* NetworkSocketPosix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkSocketPosix.cpp; path = os/posix/NetworkSocketPosix.cpp; sourceTree = SOURCE_ROOT; }; + 690725BD1EBBD5DE005D860B /* NetworkSocketPosix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkSocketPosix.h; path = os/posix/NetworkSocketPosix.h; sourceTree = SOURCE_ROOT; }; + 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; }; + 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; }; + 692AB88B1E6759DD00706ACC /* AudioOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AudioOutput.h; path = audio/AudioOutput.h; sourceTree = SOURCE_ROOT; }; + 692AB88C1E6759DD00706ACC /* BlockingQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BlockingQueue.cpp; sourceTree = SOURCE_ROOT; }; + 692AB88D1E6759DD00706ACC /* BlockingQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlockingQueue.h; sourceTree = SOURCE_ROOT; }; + 692AB88E1E6759DD00706ACC /* Buffers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Buffers.cpp; sourceTree = SOURCE_ROOT; }; + 692AB88F1E6759DD00706ACC /* Buffers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Buffers.h; sourceTree = SOURCE_ROOT; }; + 692AB8901E6759DD00706ACC /* VoIPGroupController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VoIPGroupController.cpp; sourceTree = SOURCE_ROOT; }; + 692AB8911E6759DD00706ACC /* PrivateDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrivateDefines.h; sourceTree = SOURCE_ROOT; }; + 692AB8971E6759DD00706ACC /* CongestionControl.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = CongestionControl.cpp; sourceTree = SOURCE_ROOT; }; + 692AB8981E6759DD00706ACC /* CongestionControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CongestionControl.h; sourceTree = SOURCE_ROOT; }; + 692AB8991E6759DD00706ACC /* EchoCanceller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EchoCanceller.cpp; sourceTree = SOURCE_ROOT; }; + 692AB89A1E6759DD00706ACC /* EchoCanceller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EchoCanceller.h; sourceTree = SOURCE_ROOT; }; + 692AB8A71E6759DD00706ACC /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; }; + 692AB8A81E6759DD00706ACC /* JitterBuffer.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = JitterBuffer.cpp; sourceTree = SOURCE_ROOT; }; + 692AB8A91E6759DD00706ACC /* JitterBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JitterBuffer.h; sourceTree = SOURCE_ROOT; }; + 692AB8AA1E6759DD00706ACC /* logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logging.h; sourceTree = SOURCE_ROOT; }; + 692AB8AB1E6759DD00706ACC /* MediaStreamItf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaStreamItf.cpp; sourceTree = SOURCE_ROOT; }; + 692AB8AC1E6759DD00706ACC /* MediaStreamItf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamItf.h; sourceTree = SOURCE_ROOT; }; + 692AB8AD1E6759DD00706ACC /* OpusDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OpusDecoder.cpp; sourceTree = SOURCE_ROOT; }; + 692AB8AE1E6759DD00706ACC /* OpusDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpusDecoder.h; sourceTree = SOURCE_ROOT; }; + 692AB8AF1E6759DD00706ACC /* OpusEncoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OpusEncoder.cpp; sourceTree = SOURCE_ROOT; }; + 692AB8B01E6759DD00706ACC /* OpusEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpusEncoder.h; sourceTree = SOURCE_ROOT; }; + 692AB8C61E6759DD00706ACC /* threading.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = threading.h; sourceTree = SOURCE_ROOT; }; + 692AB8C71E6759DD00706ACC /* VoIPController.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = VoIPController.cpp; sourceTree = SOURCE_ROOT; }; + 692AB8C81E6759DD00706ACC /* VoIPController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VoIPController.h; sourceTree = SOURCE_ROOT; }; + 692AB8C91E6759DD00706ACC /* VoIPServerConfig.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VoIPServerConfig.cpp; sourceTree = SOURCE_ROOT; }; + 692AB8CA1E6759DD00706ACC /* VoIPServerConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VoIPServerConfig.h; sourceTree = SOURCE_ROOT; }; 692AB9071E675E8800706ACC /* Telegraph.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Telegraph.xcodeproj; path = ../../Telegraph.xcodeproj; sourceTree = ""; }; 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; }; - 695B20601EBD39FF00E31757 /* DarwinSpecific.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DarwinSpecific.h; sourceTree = ""; }; - 695B20611EBD39FF00E31757 /* DarwinSpecific.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = DarwinSpecific.mm; path = ../../../../../libtgvoip/os/darwin/DarwinSpecific.mm; sourceTree = ""; }; - 6971220D20C8107E00971C2C /* PacketReassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PacketReassembler.cpp; sourceTree = ""; }; - 6971220E20C8107F00971C2C /* PacketReassembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketReassembler.h; sourceTree = ""; }; - 6976FD0120F6A7050019939E /* MessageThread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MessageThread.cpp; sourceTree = ""; }; - 6976FD0220F6A7060019939E /* MessageThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessageThread.h; sourceTree = ""; }; - 6988483B1F4B39F700076DF0 /* AudioInputAudioUnit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AudioInputAudioUnit.cpp; path = ../../../../../libtgvoip/os/darwin/AudioInputAudioUnit.cpp; sourceTree = ""; }; - 6988483C1F4B39F700076DF0 /* AudioInputAudioUnit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AudioInputAudioUnit.h; path = ../../../../../libtgvoip/os/darwin/AudioInputAudioUnit.h; sourceTree = ""; }; - 6988483D1F4B39F700076DF0 /* AudioOutputAudioUnit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AudioOutputAudioUnit.cpp; path = ../../../../../libtgvoip/os/darwin/AudioOutputAudioUnit.cpp; sourceTree = ""; }; - 6988483E1F4B39F700076DF0 /* AudioOutputAudioUnit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AudioOutputAudioUnit.h; path = ../../../../../libtgvoip/os/darwin/AudioOutputAudioUnit.h; sourceTree = ""; }; - 6988483F1F4B39F700076DF0 /* AudioUnitIO.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AudioUnitIO.cpp; path = ../../../../../libtgvoip/os/darwin/AudioUnitIO.cpp; sourceTree = ""; }; - 698848401F4B39F700076DF0 /* AudioUnitIO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AudioUnitIO.h; path = ../../../../../libtgvoip/os/darwin/AudioUnitIO.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; }; + 6976FD0120F6A7050019939E /* MessageThread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MessageThread.cpp; sourceTree = SOURCE_ROOT; }; + 6976FD0220F6A7060019939E /* MessageThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessageThread.h; sourceTree = SOURCE_ROOT; }; + 697B6FC42136DBA4004C8E54 /* libtgvoipTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = libtgvoipTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 697B6FC62136DBA4004C8E54 /* libtgvoipTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = libtgvoipTests.mm; sourceTree = ""; }; + 697B6FC82136DBA4004C8E54 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 697B6FD22136E18A004C8E54 /* AudioUnitIO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AudioUnitIO.h; path = os/darwin/AudioUnitIO.h; sourceTree = SOURCE_ROOT; }; + 697B6FD42136E1F3004C8E54 /* AudioIO.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioIO.cpp; sourceTree = ""; }; + 697B6FD52136E1F3004C8E54 /* AudioIO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioIO.h; sourceTree = ""; }; + 697B6FD82136E2D9004C8E54 /* AudioIOCallback.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AudioIOCallback.cpp; sourceTree = ""; }; + 697B6FD92136E2D9004C8E54 /* AudioIOCallback.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioIOCallback.h; sourceTree = ""; }; + 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 = ""; }; @@ -367,84 +386,90 @@ 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; path = aec_common.h; sourceTree = ""; }; - 69A6DE751E96149300000E69 /* aec_core.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core.cc; sourceTree = ""; }; - 69A6DE761E96149300000E69 /* aec_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_core.h; sourceTree = ""; }; - 69A6DE771E96149300000E69 /* aec_core_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core_neon.cc; sourceTree = ""; }; - 69A6DE781E96149300000E69 /* aec_core_optimized_methods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_core_optimized_methods.h; sourceTree = ""; }; - 69A6DE791E96149300000E69 /* aec_core_sse2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core_sse2.cc; sourceTree = ""; }; - 69A6DE7A1E96149300000E69 /* aec_resampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_resampler.cc; sourceTree = ""; }; - 69A6DE7B1E96149300000E69 /* aec_resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_resampler.h; sourceTree = ""; }; - 69A6DE7C1E96149300000E69 /* echo_cancellation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_cancellation.cc; sourceTree = ""; }; - 69A6DE7D1E96149300000E69 /* echo_cancellation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_cancellation.h; sourceTree = ""; }; - 69A6DE7F1E96149300000E69 /* aecm_core.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core.cc; sourceTree = ""; }; - 69A6DE801E96149300000E69 /* aecm_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aecm_core.h; sourceTree = ""; }; - 69A6DE811E96149300000E69 /* aecm_core_c.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core_c.cc; sourceTree = ""; }; - 69A6DE821E96149300000E69 /* aecm_core_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core_neon.cc; sourceTree = ""; }; - 69A6DE831E96149300000E69 /* aecm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aecm_defines.h; sourceTree = ""; }; - 69A6DE841E96149300000E69 /* echo_control_mobile.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_control_mobile.cc; sourceTree = ""; }; - 69A6DE851E96149300000E69 /* echo_control_mobile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_control_mobile.h; sourceTree = ""; }; - 69A6DE881E96149300000E69 /* analog_agc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = analog_agc.c; sourceTree = ""; }; - 69A6DE891E96149300000E69 /* analog_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = analog_agc.h; sourceTree = ""; }; - 69A6DE8A1E96149300000E69 /* digital_agc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = digital_agc.c; sourceTree = ""; }; - 69A6DE8B1E96149300000E69 /* digital_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = digital_agc.h; sourceTree = ""; }; - 69A6DE8C1E96149300000E69 /* gain_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_control.h; sourceTree = ""; }; - 69A6DE8E1E96149300000E69 /* apm_data_dumper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = apm_data_dumper.cc; sourceTree = ""; }; - 69A6DE8F1E96149300000E69 /* apm_data_dumper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apm_data_dumper.h; sourceTree = ""; }; - 69A6DE911E96149300000E69 /* defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = defines.h; sourceTree = ""; }; - 69A6DE921E96149300000E69 /* noise_suppression.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = noise_suppression.c; sourceTree = ""; }; - 69A6DE931E96149300000E69 /* noise_suppression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_suppression.h; sourceTree = ""; }; - 69A6DE941E96149300000E69 /* noise_suppression_x.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = noise_suppression_x.c; sourceTree = ""; }; - 69A6DE951E96149300000E69 /* noise_suppression_x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_suppression_x.h; sourceTree = ""; }; - 69A6DE961E96149300000E69 /* ns_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ns_core.c; sourceTree = ""; }; - 69A6DE971E96149300000E69 /* ns_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ns_core.h; sourceTree = ""; }; - 69A6DE981E96149300000E69 /* nsx_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core.c; sourceTree = ""; }; - 69A6DE991E96149300000E69 /* nsx_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsx_core.h; sourceTree = ""; }; - 69A6DE9A1E96149300000E69 /* nsx_core_c.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core_c.c; sourceTree = ""; }; - 69A6DE9B1E96149300000E69 /* nsx_core_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core_neon.c; sourceTree = ""; }; - 69A6DE9C1E96149300000E69 /* nsx_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsx_defines.h; sourceTree = ""; }; - 69A6DE9D1E96149300000E69 /* windows_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = windows_private.h; sourceTree = ""; }; - 69A6DE9E1E96149300000E69 /* splitting_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = splitting_filter.cc; sourceTree = ""; }; - 69A6DE9F1E96149300000E69 /* splitting_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = splitting_filter.h; sourceTree = ""; }; - 69A6DEA01E96149300000E69 /* three_band_filter_bank.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = three_band_filter_bank.cc; sourceTree = ""; }; - 69A6DEA11E96149300000E69 /* three_band_filter_bank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = three_band_filter_bank.h; sourceTree = ""; }; - 69A6DEA31E96149300000E69 /* block_mean_calculator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_mean_calculator.cc; sourceTree = ""; }; - 69A6DEA41E96149300000E69 /* block_mean_calculator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_mean_calculator.h; sourceTree = ""; }; - 69A6DEA51E96149300000E69 /* delay_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = delay_estimator.cc; sourceTree = ""; }; - 69A6DEA61E96149300000E69 /* delay_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator.h; sourceTree = ""; }; - 69A6DEA71E96149300000E69 /* delay_estimator_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator_internal.h; sourceTree = ""; }; - 69A6DEA81E96149300000E69 /* delay_estimator_wrapper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = delay_estimator_wrapper.cc; sourceTree = ""; }; - 69A6DEA91E96149300000E69 /* delay_estimator_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator_wrapper.h; sourceTree = ""; }; - 69A6DEAA1E96149300000E69 /* ooura_fft.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft.cc; sourceTree = ""; }; - 69A6DEAB1E96149300000E69 /* ooura_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft.h; sourceTree = ""; }; - 69A6DEAC1E96149300000E69 /* ooura_fft_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft_neon.cc; sourceTree = ""; }; - 69A6DEAD1E96149300000E69 /* ooura_fft_sse2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft_sse2.cc; sourceTree = ""; }; - 69A6DEAE1E96149300000E69 /* ooura_fft_tables_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft_tables_common.h; sourceTree = ""; }; - 69A6DEAF1E96149300000E69 /* ooura_fft_tables_neon_sse2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft_tables_neon_sse2.h; sourceTree = ""; }; - 69A6DEB21E96149300000E69 /* asm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asm_defines.h; sourceTree = ""; }; - 69A6DEB31E96149300000E69 /* compile_assert_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compile_assert_c.h; sourceTree = ""; }; - 69A6DEB41E96149300000E69 /* cpu_features_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu_features_wrapper.h; sourceTree = ""; }; - 69A6DEB51E96149300000E69 /* metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = metrics.h; sourceTree = ""; }; - 69A6DEB71E96149300000E69 /* cpu_features.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpu_features.cc; sourceTree = ""; }; - 69A6DEB81E96149300000E69 /* typedefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typedefs.h; sourceTree = ""; }; - 69A6DF3F1E9614B700000E69 /* AudioInputAudioUnitOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioInputAudioUnitOSX.cpp; sourceTree = ""; }; - 69A6DF401E9614B700000E69 /* AudioInputAudioUnitOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioInputAudioUnitOSX.h; sourceTree = ""; }; - 69A6DF411E9614B700000E69 /* AudioOutputAudioUnitOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioOutputAudioUnitOSX.cpp; sourceTree = ""; }; - 69A6DF421E9614B700000E69 /* AudioOutputAudioUnitOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioOutputAudioUnitOSX.h; sourceTree = ""; }; - 69AC148E1F4B41CF00AC3173 /* Resampler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Resampler.cpp; path = "../../../../Telegram-iOS/submodules/libtgvoip/audio/Resampler.cpp"; sourceTree = ""; }; - 69AC148F1F4B41CF00AC3173 /* Resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Resampler.h; path = "../../../../Telegram-iOS/submodules/libtgvoip/audio/Resampler.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; }; + 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; }; + 69A6DF421E9614B700000E69 /* AudioOutputAudioUnitOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AudioOutputAudioUnitOSX.h; path = os/darwin/AudioOutputAudioUnitOSX.h; sourceTree = SOURCE_ROOT; }; + 69EBC7932136D277003CFE90 /* DarwinSpecific.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = DarwinSpecific.mm; path = os/darwin/DarwinSpecific.mm; sourceTree = SOURCE_ROOT; }; + 69EBC7952136D2A9003CFE90 /* Resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Resampler.h; path = audio/Resampler.h; sourceTree = SOURCE_ROOT; }; 69F842361E67540700C110F7 /* libtgvoip.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libtgvoip.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C2A87DD71F4B6A33002D3F73 /* Resampler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Resampler.cpp; path = audio/Resampler.cpp; sourceTree = ""; }; - C2A87DDB1F4B6A61002D3F73 /* AudioInputAudioUnit.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioInputAudioUnit.cpp; path = os/darwin/AudioInputAudioUnit.cpp; sourceTree = ""; }; - C2A87DDC1F4B6A61002D3F73 /* AudioInputAudioUnitOSX.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioInputAudioUnitOSX.cpp; path = os/darwin/AudioInputAudioUnitOSX.cpp; sourceTree = ""; }; - C2A87DDD1F4B6A61002D3F73 /* AudioOutputAudioUnit.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioOutputAudioUnit.cpp; path = os/darwin/AudioOutputAudioUnit.cpp; sourceTree = ""; }; - C2A87DDE1F4B6A61002D3F73 /* AudioOutputAudioUnitOSX.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioOutputAudioUnitOSX.cpp; path = os/darwin/AudioOutputAudioUnitOSX.cpp; sourceTree = ""; }; - C2A87DE11F4B6A89002D3F73 /* AudioInput.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioInput.cpp; path = audio/AudioInput.cpp; sourceTree = ""; }; - C2A87DE21F4B6A89002D3F73 /* AudioOutput.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioOutput.cpp; path = audio/AudioOutput.cpp; sourceTree = ""; }; - C2A87DE31F4B6AD3002D3F73 /* AudioUnitIO.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioUnitIO.cpp; path = os/darwin/AudioUnitIO.cpp; sourceTree = ""; }; + C2A87DD71F4B6A33002D3F73 /* Resampler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Resampler.cpp; path = audio/Resampler.cpp; sourceTree = SOURCE_ROOT; }; + C2A87DDB1F4B6A61002D3F73 /* AudioInputAudioUnit.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioInputAudioUnit.cpp; path = os/darwin/AudioInputAudioUnit.cpp; sourceTree = SOURCE_ROOT; }; + C2A87DDC1F4B6A61002D3F73 /* AudioInputAudioUnitOSX.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioInputAudioUnitOSX.cpp; path = os/darwin/AudioInputAudioUnitOSX.cpp; sourceTree = SOURCE_ROOT; }; + C2A87DDD1F4B6A61002D3F73 /* AudioOutputAudioUnit.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioOutputAudioUnit.cpp; path = os/darwin/AudioOutputAudioUnit.cpp; sourceTree = SOURCE_ROOT; }; + C2A87DDE1F4B6A61002D3F73 /* AudioOutputAudioUnitOSX.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioOutputAudioUnitOSX.cpp; path = os/darwin/AudioOutputAudioUnitOSX.cpp; sourceTree = SOURCE_ROOT; }; + C2A87DE31F4B6AD3002D3F73 /* AudioUnitIO.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioUnitIO.cpp; path = os/darwin/AudioUnitIO.cpp; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 697B6FC12136DBA4004C8E54 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 697B6FC92136DBA4004C8E54 /* libtgvoip.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 69F842321E67540700C110F7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -504,6 +529,7 @@ 692AB8C81E6759DD00706ACC /* VoIPController.h */, 692AB8C91E6759DD00706ACC /* VoIPServerConfig.cpp */, 692AB8CA1E6759DD00706ACC /* VoIPServerConfig.h */, + 697B6FDC2136E673004C8E54 /* utils.h */, 69A6DE201E96149300000E69 /* webrtc_dsp */, ); name = libtgvoip; @@ -516,8 +542,12 @@ 692AB8891E6759DD00706ACC /* AudioInput.h */, 692AB88A1E6759DD00706ACC /* AudioOutput.cpp */, 692AB88B1E6759DD00706ACC /* AudioOutput.h */, - 69AC148E1F4B41CF00AC3173 /* Resampler.cpp */, - 69AC148F1F4B41CF00AC3173 /* Resampler.h */, + 697B6FD42136E1F3004C8E54 /* AudioIO.cpp */, + 697B6FD52136E1F3004C8E54 /* AudioIO.h */, + C2A87DD71F4B6A33002D3F73 /* Resampler.cpp */, + 69EBC7952136D2A9003CFE90 /* Resampler.h */, + 697B6FD82136E2D9004C8E54 /* AudioIOCallback.cpp */, + 697B6FD92136E2D9004C8E54 /* AudioIOCallback.h */, ); path = audio; sourceTree = ""; @@ -534,21 +564,22 @@ 692AB8BD1E6759DD00706ACC /* darwin */ = { isa = PBXGroup; children = ( - 6988483B1F4B39F700076DF0 /* AudioInputAudioUnit.cpp */, - 6988483C1F4B39F700076DF0 /* AudioInputAudioUnit.h */, - 6988483D1F4B39F700076DF0 /* AudioOutputAudioUnit.cpp */, - 6988483E1F4B39F700076DF0 /* AudioOutputAudioUnit.h */, - 6988483F1F4B39F700076DF0 /* AudioUnitIO.cpp */, - 698848401F4B39F700076DF0 /* AudioUnitIO.h */, + C2A87DE31F4B6AD3002D3F73 /* AudioUnitIO.cpp */, + 697B6FD22136E18A004C8E54 /* AudioUnitIO.h */, + C2A87DDB1F4B6A61002D3F73 /* AudioInputAudioUnit.cpp */, + C2A87DDC1F4B6A61002D3F73 /* AudioInputAudioUnitOSX.cpp */, + C2A87DDD1F4B6A61002D3F73 /* AudioOutputAudioUnit.cpp */, + C2A87DDE1F4B6A61002D3F73 /* AudioOutputAudioUnitOSX.cpp */, 69A6DF3F1E9614B700000E69 /* AudioInputAudioUnitOSX.cpp */, 69A6DF401E9614B700000E69 /* AudioInputAudioUnitOSX.h */, 69A6DF411E9614B700000E69 /* AudioOutputAudioUnitOSX.cpp */, 69A6DF421E9614B700000E69 /* AudioOutputAudioUnitOSX.h */, 695B20601EBD39FF00E31757 /* DarwinSpecific.h */, - 695B20611EBD39FF00E31757 /* DarwinSpecific.mm */, + 69EBC7932136D277003CFE90 /* DarwinSpecific.mm */, ); - path = darwin; - sourceTree = ""; + name = darwin; + path = os/darwin; + sourceTree = SOURCE_ROOT; }; 692AB9061E675E8700706ACC /* Frameworks */ = { isa = PBXGroup; @@ -575,13 +606,24 @@ name = Products; sourceTree = ""; }; + 697B6FC52136DBA4004C8E54 /* tests */ = { + isa = PBXGroup; + children = ( + 697B6FC62136DBA4004C8E54 /* libtgvoipTests.mm */, + 697B6FDD2136F01E004C8E54 /* MockReflector.h */, + 697B6FDE2136F01E004C8E54 /* MockReflector.cpp */, + 697B6FC82136DBA4004C8E54 /* Info.plist */, + ); + path = tests; + sourceTree = ""; + }; 69A6DE201E96149300000E69 /* webrtc_dsp */ = { isa = PBXGroup; children = ( 69A6DE211E96149300000E69 /* webrtc */, ); path = webrtc_dsp; - sourceTree = ""; + sourceTree = SOURCE_ROOT; }; 69A6DE211E96149300000E69 /* webrtc */ = { isa = PBXGroup; @@ -709,8 +751,9 @@ children = ( 69A6DE721E96149300000E69 /* audio_processing */, ); - path = modules; - sourceTree = ""; + name = modules; + path = webrtc_dsp/webrtc/modules; + sourceTree = SOURCE_ROOT; }; 69A6DE721E96149300000E69 /* audio_processing */ = { isa = PBXGroup; @@ -743,8 +786,9 @@ 69A6DE7C1E96149300000E69 /* echo_cancellation.cc */, 69A6DE7D1E96149300000E69 /* echo_cancellation.h */, ); - path = aec; - sourceTree = ""; + name = aec; + path = webrtc_dsp/webrtc/modules/audio_processing/aec; + sourceTree = SOURCE_ROOT; }; 69A6DE7E1E96149300000E69 /* aecm */ = { isa = PBXGroup; @@ -757,16 +801,18 @@ 69A6DE841E96149300000E69 /* echo_control_mobile.cc */, 69A6DE851E96149300000E69 /* echo_control_mobile.h */, ); - path = aecm; - sourceTree = ""; + name = aecm; + path = webrtc_dsp/webrtc/modules/audio_processing/aecm; + sourceTree = SOURCE_ROOT; }; 69A6DE861E96149300000E69 /* agc */ = { isa = PBXGroup; children = ( 69A6DE871E96149300000E69 /* legacy */, ); - path = agc; - sourceTree = ""; + name = agc; + path = webrtc_dsp/webrtc/modules/audio_processing/agc; + sourceTree = SOURCE_ROOT; }; 69A6DE871E96149300000E69 /* legacy */ = { isa = PBXGroup; @@ -786,8 +832,9 @@ 69A6DE8E1E96149300000E69 /* apm_data_dumper.cc */, 69A6DE8F1E96149300000E69 /* apm_data_dumper.h */, ); - path = logging; - sourceTree = ""; + name = logging; + path = webrtc_dsp/webrtc/modules/audio_processing/logging; + sourceTree = SOURCE_ROOT; }; 69A6DE901E96149300000E69 /* ns */ = { isa = PBXGroup; @@ -806,8 +853,9 @@ 69A6DE9C1E96149300000E69 /* nsx_defines.h */, 69A6DE9D1E96149300000E69 /* windows_private.h */, ); - path = ns; - sourceTree = ""; + name = ns; + path = webrtc_dsp/webrtc/modules/audio_processing/ns; + sourceTree = SOURCE_ROOT; }; 69A6DEA21E96149300000E69 /* utility */ = { isa = PBXGroup; @@ -826,8 +874,9 @@ 69A6DEAE1E96149300000E69 /* ooura_fft_tables_common.h */, 69A6DEAF1E96149300000E69 /* ooura_fft_tables_neon_sse2.h */, ); - path = utility; - sourceTree = ""; + name = utility; + path = webrtc_dsp/webrtc/modules/audio_processing/utility; + sourceTree = SOURCE_ROOT; }; 69A6DEB01E96149300000E69 /* system_wrappers */ = { isa = PBXGroup; @@ -860,15 +909,8 @@ 69F8422C1E67540700C110F7 = { isa = PBXGroup; children = ( - C2A87DE31F4B6AD3002D3F73 /* AudioUnitIO.cpp */, - C2A87DE11F4B6A89002D3F73 /* AudioInput.cpp */, - C2A87DE21F4B6A89002D3F73 /* AudioOutput.cpp */, - C2A87DDB1F4B6A61002D3F73 /* AudioInputAudioUnit.cpp */, - C2A87DDC1F4B6A61002D3F73 /* AudioInputAudioUnitOSX.cpp */, - C2A87DDD1F4B6A61002D3F73 /* AudioOutputAudioUnit.cpp */, - C2A87DDE1F4B6A61002D3F73 /* AudioOutputAudioUnitOSX.cpp */, - C2A87DD71F4B6A33002D3F73 /* Resampler.cpp */, 692AB8861E6759BF00706ACC /* libtgvoip */, + 697B6FC52136DBA4004C8E54 /* tests */, 69F842371E67540700C110F7 /* Products */, 692AB9061E675E8700706ACC /* Frameworks */, ); @@ -878,6 +920,7 @@ isa = PBXGroup; children = ( 69F842361E67540700C110F7 /* libtgvoip.framework */, + 697B6FC42136DBA4004C8E54 /* libtgvoipTests.xctest */, ); name = Products; sourceTree = ""; @@ -892,7 +935,7 @@ 69A6DF181E96149300000E69 /* gain_control.h in Headers */, 69A6DF231E96149300000E69 /* nsx_core.h in Headers */, 692AB9011E6759DD00706ACC /* threading.h in Headers */, - 698848461F4B39F700076DF0 /* AudioUnitIO.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 */, @@ -932,6 +975,7 @@ 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 */, @@ -953,7 +997,6 @@ 69A6DF2D1E96149300000E69 /* block_mean_calculator.h in Headers */, 69A6DF3C1E96149300000E69 /* metrics.h in Headers */, 69A6DF0E1E96149300000E69 /* aecm_core.h in Headers */, - 698848421F4B39F700076DF0 /* AudioInputAudioUnit.h in Headers */, 69A6DF2F1E96149300000E69 /* delay_estimator.h in Headers */, 69A6DEC41E96149300000E69 /* stringutils.h in Headers */, 69A6DF1F1E96149300000E69 /* noise_suppression_x.h in Headers */, @@ -961,16 +1004,16 @@ 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 */, - 69AC14911F4B41CF00AC3173 /* Resampler.h in Headers */, 69A6DF261E96149300000E69 /* nsx_defines.h in Headers */, 6971221020C8107F00971C2C /* PacketReassembler.h in Headers */, - 698848441F4B39F700076DF0 /* AudioOutputAudioUnit.h in Headers */, 69A6DEC11E96149300000E69 /* safe_conversions_impl.h in Headers */, 69A6DEC01E96149300000E69 /* safe_conversions.h in Headers */, ); @@ -979,6 +1022,24 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 697B6FC32136DBA4004C8E54 /* libtgvoipTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 697B6FD12136DBA4004C8E54 /* Build configuration list for PBXNativeTarget "libtgvoipTests" */; + buildPhases = ( + 697B6FC02136DBA4004C8E54 /* Sources */, + 697B6FC12136DBA4004C8E54 /* Frameworks */, + 697B6FC22136DBA4004C8E54 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 697B6FCB2136DBA4004C8E54 /* PBXTargetDependency */, + ); + name = libtgvoipTests; + productName = libtgvoipTests; + productReference = 697B6FC42136DBA4004C8E54 /* libtgvoipTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; 69F842351E67540700C110F7 /* libtgvoip */ = { isa = PBXNativeTarget; buildConfigurationList = 69F8423E1E67540700C110F7 /* Build configuration list for PBXNativeTarget "libtgvoip" */; @@ -1006,6 +1067,10 @@ LastUpgradeCheck = 0820; ORGANIZATIONNAME = Grishka; TargetAttributes = { + 697B6FC32136DBA4004C8E54 = { + CreatedOnToolsVersion = 9.4.1; + ProvisioningStyle = Automatic; + }; 69F842351E67540700C110F7 = { CreatedOnToolsVersion = 8.2.1; ProvisioningStyle = Automatic; @@ -1031,6 +1096,7 @@ projectRoot = ""; targets = ( 69F842351E67540700C110F7 /* libtgvoip */, + 697B6FC32136DBA4004C8E54 /* libtgvoipTests */, ); }; /* End PBXProject section */ @@ -1088,6 +1154,13 @@ /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ + 697B6FC22136DBA4004C8E54 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 69F842341E67540700C110F7 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1098,6 +1171,15 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 697B6FC02136DBA4004C8E54 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 697B6FDF2136F01E004C8E54 /* MockReflector.cpp in Sources */, + 697B6FC72136DBA4004C8E54 /* libtgvoipTests.mm in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 69F842311E67540700C110F7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1110,6 +1192,7 @@ C2A87DE41F4B6AD3002D3F73 /* AudioUnitIO.cpp in Sources */, 690725C21EBBD5F2005D860B /* NetworkSocket.cpp in Sources */, 69A6DEC71E96149300000E69 /* channel_buffer.cc 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 */, @@ -1117,6 +1200,7 @@ 69A6DEE81E96149300000E69 /* levinson_durbin.c in Sources */, 69A6DEE21E96149300000E69 /* ilbc_specific_functions.c in Sources */, 692AB9041E6759DD00706ACC /* VoIPServerConfig.cpp in Sources */, + 69EBC7912136D220003CFE90 /* AudioInputAudioUnitOSX.cpp in Sources */, 69A6DF0B1E96149300000E69 /* echo_cancellation.cc in Sources */, 69A6DED61E96149300000E69 /* cross_correlation_neon.c in Sources */, 6976FD0320F6A7060019939E /* MessageThread.cpp in Sources */, @@ -1143,6 +1227,7 @@ 69A6DECC1E96149300000E69 /* ring_buffer.c in Sources */, 692AB8EB1E6759DD00706ACC /* OpusDecoder.cpp in Sources */, 69A6DED81E96149300000E69 /* dot_product_with_scale.c 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 */, @@ -1156,6 +1241,8 @@ 692AB8CB1E6759DD00706ACC /* AudioInput.cpp in Sources */, 692AB8CD1E6759DD00706ACC /* AudioOutput.cpp in Sources */, C2A87DD81F4B6A33002D3F73 /* Resampler.cpp in Sources */, + 697B6FDA2136E2D9004C8E54 /* AudioIOCallback.cpp 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 */, @@ -1204,7 +1291,474 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 697B6FCB2136DBA4004C8E54 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 69F842351E67540700C110F7 /* libtgvoip */; + targetProxy = 697B6FCA2136DBA4004C8E54 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ + 697B6FCC2136DBA4004C8E54 /* Debug Hockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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; + HEADER_SEARCH_PATHS = ( + /usr/local/opt/openssl/include, + webrtc_dsp, + ); + INFOPLIST_FILE = tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + LIBRARY_SEARCH_PATHS = ( + /usr/local/opt/openssl/lib, + /usr/local/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "-DTGVOIP_USE_CALLBACK_AUDIO_IO"; + OTHER_LDFLAGS = ( + "-lopus", + "-lcrypto", + ); + PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoipTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = "Debug Hockeyapp"; + }; + 697B6FCD2136DBA4004C8E54 /* Debug Auto Test */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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; + HEADER_SEARCH_PATHS = ( + /usr/local/opt/openssl/include, + webrtc_dsp, + ); + INFOPLIST_FILE = tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + LIBRARY_SEARCH_PATHS = ( + /usr/local/opt/openssl/lib, + /usr/local/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "-DTGVOIP_USE_CALLBACK_AUDIO_IO"; + OTHER_LDFLAGS = ( + "-lopus", + "-lcrypto", + ); + PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoipTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = "Debug Auto Test"; + }; + 697B6FCE2136DBA4004C8E54 /* Debug AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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; + HEADER_SEARCH_PATHS = ( + /usr/local/opt/openssl/include, + webrtc_dsp, + ); + INFOPLIST_FILE = tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + LIBRARY_SEARCH_PATHS = ( + /usr/local/opt/openssl/lib, + /usr/local/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "-DTGVOIP_USE_CALLBACK_AUDIO_IO"; + OTHER_LDFLAGS = ( + "-lopus", + "-lcrypto", + ); + PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoipTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = "Debug AppStore"; + }; + 697B6FCF2136DBA4004C8E54 /* Release Hockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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; + HEADER_SEARCH_PATHS = ( + /usr/local/opt/openssl/include, + webrtc_dsp, + ); + INFOPLIST_FILE = tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + LIBRARY_SEARCH_PATHS = ( + /usr/local/opt/openssl/lib, + /usr/local/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CFLAGS = "-DTGVOIP_USE_CALLBACK_AUDIO_IO"; + OTHER_LDFLAGS = ( + "-lopus", + "-lcrypto", + ); + PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoipTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = "Release Hockeyapp"; + }; + 697B6FD02136DBA4004C8E54 /* Release AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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; + HEADER_SEARCH_PATHS = ( + /usr/local/opt/openssl/include, + webrtc_dsp, + ); + INFOPLIST_FILE = tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + LIBRARY_SEARCH_PATHS = ( + /usr/local/opt/openssl/lib, + /usr/local/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CFLAGS = "-DTGVOIP_USE_CALLBACK_AUDIO_IO"; + OTHER_LDFLAGS = ( + "-lopus", + "-lcrypto", + ); + PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoipTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = "Release AppStore"; + }; + 69EBC7982136D55A003CFE90 /* Debug Auto Test */ = { + 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 = "Debug Auto Test"; + }; + 69EBC7992136D55A003CFE90 /* Debug Auto Test */ = { + 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 = ( + "$(inherited)", + webrtc_dsp, + /usr/local/include/opus, + /usr/local/opt/openssl/include, + ); + 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.7; + OTHER_CFLAGS = ( + "-DWEBRTC_POSIX", + "-DWEBRTC_APM_DEBUG_DUMP=0", + "-DTGVOIP_USE_DESKTOP_DSP", + "-DWEBRTC_MAC", + "-DTGVOIP_USE_CALLBACK_AUDIO_IO", + ); + PRODUCT_BUNDLE_IDENTIFIER = me.grishka.libtgvoip; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = "Debug Auto Test"; + }; 69F8423C1E67540700C110F7 /* Debug Hockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1556,10 +2110,23 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 697B6FD12136DBA4004C8E54 /* Build configuration list for PBXNativeTarget "libtgvoipTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 697B6FCC2136DBA4004C8E54 /* Debug Hockeyapp */, + 697B6FCD2136DBA4004C8E54 /* Debug Auto Test */, + 697B6FCE2136DBA4004C8E54 /* Debug AppStore */, + 697B6FCF2136DBA4004C8E54 /* Release Hockeyapp */, + 697B6FD02136DBA4004C8E54 /* Release AppStore */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = "Release Hockeyapp"; + }; 69F842301E67540700C110F7 /* Build configuration list for PBXProject "libtgvoip_osx" */ = { isa = XCConfigurationList; buildConfigurations = ( 69F8423C1E67540700C110F7 /* Debug Hockeyapp */, + 69EBC7982136D55A003CFE90 /* Debug Auto Test */, D04D01C31E678C0D0086DDC0 /* Debug AppStore */, 69F8423D1E67540700C110F7 /* Release Hockeyapp */, D04D01CB1E678C230086DDC0 /* Release AppStore */, @@ -1571,6 +2138,7 @@ isa = XCConfigurationList; buildConfigurations = ( 69F8423F1E67540700C110F7 /* Debug Hockeyapp */, + 69EBC7992136D55A003CFE90 /* Debug Auto Test */, D04D01C41E678C0D0086DDC0 /* Debug AppStore */, 69F842401E67540700C110F7 /* Release Hockeyapp */, D04D01CC1E678C230086DDC0 /* Release AppStore */, diff --git a/os/windows/AudioInputWASAPI.cpp b/os/windows/AudioInputWASAPI.cpp index c5f580a4ad..af2881b481 100644 --- a/os/windows/AudioInputWASAPI.cpp +++ b/os/windows/AudioInputWASAPI.cpp @@ -321,6 +321,8 @@ DWORD WINAPI AudioInputWASAPI::StartThread(void* arg) { } void AudioInputWASAPI::RunThread() { + if(failed) + return; SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); HANDLE waitArray[]={shutdownEvent, streamSwitchEvent, audioSamplesReadyEvent}; diff --git a/tests/Info.plist b/tests/Info.plist new file mode 100644 index 0000000000..6c40a6cd0c --- /dev/null +++ b/tests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/tests/MockReflector.cpp b/tests/MockReflector.cpp new file mode 100644 index 0000000000..d12b28c29c --- /dev/null +++ b/tests/MockReflector.cpp @@ -0,0 +1,129 @@ +// +// 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 "MockReflector.h" +#include +#include +#include + +using namespace tgvoip; +using namespace tgvoip::test; + +struct UdpReflectorSelfInfo{ + uint8_t peerTag[16]; + uint64_t _id1=0xFFFFFFFFFFFFFFFFLL; + uint32_t _id2=0xFFFFFFFF; + uint32_t magic=0xc01572c7; + int32_t date; + uint64_t query_id; + uint64_t my_ip_padding1; + uint32_t my_ip_padding2; + uint32_t my_ip; + uint32_t my_port; +} __attribute__((packed)); + +MockReflector::MockReflector(std::string bindAddress, uint16_t bindPort){ + sfd=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + assert(sfd!=-1); + sockaddr_in bindAddr={0}; + bindAddr.sin_family=AF_INET; + bindAddr.sin_port=htons(bindPort); + inet_aton(bindAddress.c_str(), &bindAddr.sin_addr); + int res=bind(sfd, (struct sockaddr*)&bindAddr, sizeof(bindAddr)); + assert(res==0); +} + +MockReflector::~MockReflector(){ + +} + +std::array, 2> MockReflector::GeneratePeerTags(){ + std::array tag1; + for(int i=0;i<16;i++){ + tag1[i]=(uint8_t)rand(); + } + tag1[15] &= 0xFE; + std::array, 2> res; + res[0]=tag1; + std::copy(tag1.begin(), tag1.end(), res[1].begin()); + res[1][15] |= 1; + return res; +} + +void MockReflector::Start(){ + if(running) + return; + running=true; + pthread_create(&thread, NULL, [](void* arg) -> void* { + reinterpret_cast(arg)->RunThread(); + return NULL; + }, this); +} + +void MockReflector::Stop(){ + running=false; + shutdown(sfd, SHUT_RDWR); + close(sfd); + pthread_join(thread, NULL); +} + +void MockReflector::SetDropAllPackets(bool drop){ + dropAllPackets=drop; +} + +void MockReflector::RunThread(){ + while(running){ + std::array buf; + sockaddr_in addr; + socklen_t addrlen=sizeof(addr); + ssize_t len=recvfrom(sfd, buf.data(), sizeof(buf), 0, (struct sockaddr*)&addr, &addrlen); + if(len<=0) + return; + if(len>=32){ + std::array peerTag; + int32_t specialID[4]; + std::copy(buf.begin(), buf.begin()+16, peerTag.begin()); + memcpy(specialID, buf.data()+16, 16); + uint64_t tagID=*reinterpret_cast(peerTag.data()); + ClientPair c=clients[tagID]; + sockaddr_in* dest; + if(peerTag[15] & 1){ + c.addr1=addr; + dest=&c.addr0; + }else{ + c.addr0=addr; + dest=&c.addr1; + } + clients[tagID]=c; + + if(specialID[0]==-1 && specialID[1]==-1 && specialID[2]==-1){ + if(specialID[3]==-1){ + continue; + }else if(specialID[3]==-2){ + UdpReflectorSelfInfo response; + memcpy(response.peerTag, peerTag.data(), 16); + response.date=(int32_t)time(NULL); + response.query_id=*reinterpret_cast(buf.data()+32); + response.my_ip_padding1=0; + response.my_ip_padding2=0xFFFF0000; + response.my_ip=(uint32_t)addr.sin_addr.s_addr; + response.my_port=ntohs(addr.sin_port); + sendto(sfd, &response, sizeof(response), 0, (struct sockaddr*)&addr, sizeof(addr)); + continue; + } + } + + if(dest->sin_family==AF_INET && !dropAllPackets){ + if(peerTag[15] & 1) + buf[15] &= 0xFE; + else + buf[15] |= 1; + + sendto(sfd, buf.data(), len, 0, (struct sockaddr*)dest, sizeof(sockaddr_in)); + } + } + } +} diff --git a/tests/MockReflector.h b/tests/MockReflector.h new file mode 100644 index 0000000000..b52219aee4 --- /dev/null +++ b/tests/MockReflector.h @@ -0,0 +1,50 @@ +// +// 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 TGVOIP_MOCK_REFLECTOR +#define TGVOIP_MOCK_REFLECTOR + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace tgvoip{ + namespace test{ + class MockReflector{ + public: + MockReflector(std::string bindAddress, uint16_t bindPort); + ~MockReflector(); + void Start(); + void Stop(); + void SetDropAllPackets(bool drop); + static std::array, 2> GeneratePeerTags(); + + private: + void RunThread(); + struct ClientPair{ + sockaddr_in addr0={0}; + sockaddr_in addr1={0}; + }; + std::unordered_map clients; // clients are identified by the first half of their peer_tag + int sfd; + pthread_t thread; + bool running=false; + bool dropAllPackets=false; + }; + } +} + +#endif //TGVOIP_MOCK_REFLECTOR diff --git a/tests/libtgvoipTests.mm b/tests/libtgvoipTests.mm new file mode 100644 index 0000000000..3fbe69aab5 --- /dev/null +++ b/tests/libtgvoipTests.mm @@ -0,0 +1,192 @@ +// +// 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. +// + +#import + +#import "MockReflector.h" +#include "../VoIPController.h" +#include +#include "../webrtc_dsp/webrtc/common_audio/wav_file.h" + +@interface libtgvoipTests : XCTestCase + +@end + +using namespace tgvoip; + +@implementation libtgvoipTests{ + VoIPController* controller1; + VoIPController* controller2; + std::string testWavFilePath; +} + +- (void)setUp { + [super setUp]; + // this file must be mono 16-bit 48000hz + NSString* path=[NSString stringWithFormat:@"%@/Downloads/voip_test_input.wav", NSHomeDirectory()]; + testWavFilePath=[path UTF8String]; +} + +- (void)tearDown { + + + [super tearDown]; +} + +- (void)initControllers{ + controller1=new VoIPController(); + controller2=new VoIPController(); + + std::array, 2> peerTags=test::MockReflector::GeneratePeerTags(); + 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())); + controller1->SetRemoteEndpoints(endpoints1, false, 76); + std::vector endpoints2; + endpoints2.push_back(Endpoint(1, 1033, localhost, emptyV6, Endpoint::TYPE_UDP_RELAY, peerTags[1].data())); + controller2->SetRemoteEndpoints(endpoints2, false, 76); + + char encryptionKey[256]; + RAND_bytes((uint8_t*)encryptionKey, sizeof(encryptionKey)); + controller1->SetEncryptionKey(encryptionKey, true); + controller2->SetEncryptionKey(encryptionKey, false); +} + +- (void)destroyControllers{ + controller1->Stop(); + delete controller1; + controller2->Stop(); + delete controller2; +} + +- (void)testBasicOperation { + webrtc::WavReader wavReader1(testWavFilePath); + webrtc::WavReader wavReader2(testWavFilePath); + webrtc::WavWriter wavWriter("output.wav", 48000, 1); + + test::MockReflector reflector("127.0.0.1", 1033); + reflector.Start(); + + [self initControllers]; + + controller1->SetAudioDataCallbacks([&wavReader1](int16_t* data, size_t len){ + wavReader1.ReadSamples(len, data); + }, [](int16_t* data, size_t len){ + + }); + + controller2->SetAudioDataCallbacks([&wavReader2](int16_t* data, size_t len){ + wavReader2.ReadSamples(len, data); + }, [&wavWriter](int16_t* data, size_t len){ + wavWriter.WriteSamples(data, len); + }); + + controller1->Start(); + controller2->Start(); + controller1->Connect(); + controller2->Connect(); + [NSThread sleepForTimeInterval:10.0]; + + [self destroyControllers]; + + reflector.Stop(); +} + +- (void)testAllocationAndDeallocation{ + test::MockReflector reflector("127.0.0.1", 1033); + reflector.Start(); + + for(int i=0;i<10;i++){ + webrtc::WavReader wavReader(testWavFilePath); + [self initControllers]; + + controller1->SetAudioDataCallbacks([&wavReader](int16_t* data, size_t len){ + wavReader.ReadSamples(len, data); + }, [](int16_t* data, size_t len){ + + }); + + controller2->SetAudioDataCallbacks([](int16_t* data, size_t len){ + + }, [](int16_t* data, size_t len){ + + }); + + controller1->Start(); + controller2->Start(); + controller1->Connect(); + controller2->Connect(); + [NSThread sleepForTimeInterval:3.0]; + + [self destroyControllers]; + } + + reflector.Stop(); +} + +- (void)testInitTimeout{ + [self initControllers]; + VoIPController::Config config; + config.enableNS=config.enableAEC=config.enableAGC=false; + config.enableCallUpgrade=false; + config.initTimeout=3.0; + controller1->SetConfig(config); + controller1->Start(); + controller1->Connect(); + [NSThread sleepForTimeInterval:1.5]; + XCTAssertEqual(controller1->GetConnectionState(), STATE_WAIT_INIT_ACK); + [NSThread sleepForTimeInterval:2.0]; + XCTAssertEqual(controller1->GetConnectionState(), STATE_FAILED); + XCTAssertEqual(controller1->GetLastError(), ERROR_TIMEOUT); + [self destroyControllers]; +} + +- (void)testPacketTimeout{ + test::MockReflector reflector("127.0.0.1", 1033); + reflector.Start(); + [self initControllers]; + + webrtc::WavReader wavReader(testWavFilePath); + controller1->SetAudioDataCallbacks([&wavReader](int16_t* data, size_t len){ + wavReader.ReadSamples(len, data); + }, [](int16_t* data, size_t len){ + + }); + + controller2->SetAudioDataCallbacks([](int16_t* data, size_t len){ + + }, [](int16_t* data, size_t len){ + + }); + + VoIPController::Config config; + config.enableNS=config.enableAEC=config.enableAGC=false; + config.enableCallUpgrade=false; + config.initTimeout=3.0; + config.recvTimeout=1.5; + controller1->SetConfig(config); + config.recvTimeout=5.0; + controller2->SetConfig(config); + + controller1->Start(); + controller2->Start(); + controller1->Connect(); + controller2->Connect(); + [NSThread sleepForTimeInterval:2.5]; + XCTAssertEqual(controller1->GetConnectionState(), STATE_ESTABLISHED); + XCTAssertEqual(controller2->GetConnectionState(), STATE_ESTABLISHED); + reflector.SetDropAllPackets(true); + [NSThread sleepForTimeInterval:2.5]; + XCTAssertEqual(controller1->GetConnectionState(), STATE_FAILED); + XCTAssertEqual(controller1->GetLastError(), ERROR_TIMEOUT); + XCTAssertEqual(controller2->GetConnectionState(), STATE_RECONNECTING); + + [self destroyControllers]; + reflector.Stop(); +} + +@end diff --git a/threading.h b/threading.h index 0bcf7c3289..2b5c19cb12 100644 --- a/threading.h +++ b/threading.h @@ -104,7 +104,7 @@ namespace tgvoip{ } static void Sleep(double seconds){ - usleep((useconds_t)(seconds*1000000000)); + usleep((useconds_t)(seconds*1000000.0)); } bool IsCurrent(){ diff --git a/utils.h b/utils.h new file mode 100644 index 0000000000..f1932fd8a5 --- /dev/null +++ b/utils.h @@ -0,0 +1,14 @@ +// +// 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_UTILS_H +#define LIBTGVOIP_UTILS_H + +#define TGVOIP_DISALLOW_COPY_AND_ASSIGN(TypeName) \ +TypeName(const TypeName&) = delete; \ +void operator=(const TypeName&) = delete + +#endif /* LIBTGVOIP_UTILS_H */