diff --git a/EchoCanceller.cpp b/EchoCanceller.cpp index d224ee6f17..e75a9905dd 100644 --- a/EchoCanceller.cpp +++ b/EchoCanceller.cpp @@ -6,6 +6,7 @@ #include "EchoCanceller.h" #include "audio/AudioOutput.h" +#include "audio/AudioInput.h" #include "logging.h" #include #include @@ -263,13 +264,13 @@ void EchoCanceller::ProcessInput(unsigned char* data, unsigned char* out, size_t lock_mutex(aecMutex); WebRtcAecm_Process(aec, bufOut->ibuf()->bands(0)[0], _nsOut[0], samplesOut, AEC_FRAME_SIZE, (int16_t) tgvoip::audio::AudioOutput::GetEstimatedDelay()); - WebRtcAecm_Process(aec, bufOut->ibuf()->bands(0)[0]+160, _nsOut[0]+160, samplesOut+160, AEC_FRAME_SIZE, (int16_t) tgvoip::audio::AudioOutput::GetEstimatedDelay()); + WebRtcAecm_Process(aec, bufOut->ibuf()->bands(0)[0]+160, _nsOut[0]+160, samplesOut+160, AEC_FRAME_SIZE, (int16_t) tgvoip::audio::AudioOutput::GetEstimatedDelay()+audio::AudioInput::GetEstimatedDelay()); unlock_mutex(aecMutex); memcpy(bufOut->ibuf()->bands(0)[0], samplesOut, 320*2); }else if(enableAEC){ lock_mutex(aecMutex); WebRtcAecm_Process(aec, bufOut->ibuf()->bands(0)[0], NULL, samplesOut, AEC_FRAME_SIZE, (int16_t) tgvoip::audio::AudioOutput::GetEstimatedDelay()); - WebRtcAecm_Process(aec, bufOut->ibuf()->bands(0)[0]+160, NULL, samplesOut+160, AEC_FRAME_SIZE, (int16_t) tgvoip::audio::AudioOutput::GetEstimatedDelay()); + WebRtcAecm_Process(aec, bufOut->ibuf()->bands(0)[0]+160, NULL, samplesOut+160, AEC_FRAME_SIZE, (int16_t) tgvoip::audio::AudioOutput::GetEstimatedDelay()+audio::AudioInput::GetEstimatedDelay()); unlock_mutex(aecMutex); memcpy(bufOut->ibuf()->bands(0)[0], samplesOut, 320*2); }else if(enableNS){ @@ -339,12 +340,12 @@ void EchoCanceller::ProcessInput(unsigned char* data, unsigned char* out, size_t aecIn[i]=bufOut->fbuf_const()->bands(0)[i]; aecOut[i]=_aecOut[i]; } - webrtc::WebRtcAec_Process(aec, aecIn, 3, aecOut, AEC_FRAME_SIZE, audio::AudioOutput::GetEstimatedDelay(), 0); + webrtc::WebRtcAec_Process(aec, aecIn, 3, aecOut, AEC_FRAME_SIZE, audio::AudioOutput::GetEstimatedDelay()+audio::AudioInput::GetEstimatedDelay(), 0); for(i=0;i<3;i++){ aecOut[i]+=160; aecIn[i]+=160; } - webrtc::WebRtcAec_Process(aec, aecIn, 3, aecOut, AEC_FRAME_SIZE, audio::AudioOutput::GetEstimatedDelay(), 0); + webrtc::WebRtcAec_Process(aec, aecIn, 3, aecOut, AEC_FRAME_SIZE, audio::AudioOutput::GetEstimatedDelay()+audio::AudioInput::GetEstimatedDelay(), 0); memcpy(bufOut->fbuf()->bands(0)[0], _aecOut[0], 320*4); memcpy(bufOut->fbuf()->bands(0)[1], _aecOut[1], 320*4); diff --git a/VoIPController.cpp b/VoIPController.cpp index bd528ab184..37b3378354 100644 --- a/VoIPController.cpp +++ b/VoIPController.cpp @@ -2098,7 +2098,10 @@ Endpoint::Endpoint(int64_t id, uint16_t port, IPv4Address& _address, IPv6Address } Endpoint::Endpoint() : address(0), v6address("::0") { - + lastPingSeq=0; + lastPingTime=0; + averageRTT=0; + memset(rtts, 0, sizeof(rtts)); } #if defined(__APPLE__) && TARGET_OS_IPHONE diff --git a/audio/AudioInput.cpp b/audio/AudioInput.cpp index 712b00a362..4f398190ca 100644 --- a/audio/AudioInput.cpp +++ b/audio/AudioInput.cpp @@ -29,6 +29,8 @@ using namespace tgvoip; using namespace tgvoip::audio; +int32_t AudioInput::estimatedDelay=60; + AudioInput::AudioInput() : currentDevice("default"){ failed=false; } @@ -99,3 +101,7 @@ std::string AudioInput::GetCurrentDevice(){ void AudioInput::SetCurrentDevice(std::string deviceID){ } + +int32_t AudioInput::GetEstimatedDelay(){ + return estimatedDelay; +} diff --git a/audio/AudioInput.h b/audio/AudioInput.h index 73dc533df5..18420c94f8 100644 --- a/audio/AudioInput.h +++ b/audio/AudioInput.h @@ -30,10 +30,12 @@ public: virtual void SetCurrentDevice(std::string deviceID); static AudioInput* Create(std::string deviceID); static void EnumerateDevices(std::vector& devs); + static int32_t GetEstimatedDelay(); protected: std::string currentDevice; bool failed; + static int32_t estimatedDelay; }; }} diff --git a/os/darwin/AudioInputAudioUnitOSX.cpp b/os/darwin/AudioInputAudioUnitOSX.cpp index fc4ef10f00..6078327f7a 100644 --- a/os/darwin/AudioInputAudioUnitOSX.cpp +++ b/os/darwin/AudioInputAudioUnitOSX.cpp @@ -284,6 +284,19 @@ void AudioInputAudioUnit::SetCurrentDevice(std::string deviceID){ LOGD("Switched capture device, new sample rate %d", hardwareSampleRate); this->currentDevice=deviceID; + + AudioObjectPropertyAddress propertyAddress = { + kAudioDevicePropertyBufferFrameSize, + kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster + }; + size=4; + UInt32 bufferFrameSize; + status=AudioObjectGetPropertyData(inputDevice, &propertyAddress, 0, NULL, &size, &bufferFrameSize); + if(status==noErr){ + estimatedDelay=bufferFrameSize/48; + LOGD("CoreAudio buffer size for output device is %u frames (%u ms)", bufferFrameSize, estimatedDelay); + } } OSStatus AudioInputAudioUnit::DefaultDeviceChangedCallback(AudioObjectID inObjectID, UInt32 inNumberAddresses, const AudioObjectPropertyAddress *inAddresses, void *inClientData){