diff options
author | Roxie Linden <roxie@lindenlab.com> | 2024-01-09 11:57:01 -0800 |
---|---|---|
committer | Roxie Linden <roxie@lindenlab.com> | 2024-02-22 23:11:36 -0800 |
commit | 106a589dee7bd91f8c8893e1f077a25efb7e83eb (patch) | |
tree | 8ddfd6c5e734acb8b200abe354b98106100077cd /indra | |
parent | 9b2362f73ee5796279acc717fcc0bcc138f6519f (diff) |
New WebRTC with echo cancellation fix.
Also, start/stop recording depending on whether WebRTC has negotiated.
Diffstat (limited to 'indra')
-rw-r--r-- | indra/cmake/WebRTC.cmake | 6 | ||||
-rw-r--r-- | indra/llwebrtc/llwebrtc.cpp | 74 | ||||
-rw-r--r-- | indra/llwebrtc/llwebrtc_impl.h | 2 |
3 files changed, 65 insertions, 17 deletions
diff --git a/indra/cmake/WebRTC.cmake b/indra/cmake/WebRTC.cmake index 1c32607766..2878d7dd88 100644 --- a/indra/cmake/WebRTC.cmake +++ b/indra/cmake/WebRTC.cmake @@ -7,7 +7,7 @@ if (WINDOWS) FetchContent_Declare( webrtc URL "https://webrtc-build-releases.s3.us-west-2.amazonaws.com/webrtc.windows_x86.tar.bz2" - URL_HASH "MD5=0d55e58efceed3fb48085a5f0c58881c" + URL_HASH "MD5=cefbd446b1b152ac08217fc78648fb99" FIND_PACKAGE_ARGS NAMES webrtc DOWNLOAD_EXTRACT_TIMESTAMP TRUE DOWNLOAD_DIR "${LIBS_PREBUILT_DIR}/webrtc/" @@ -16,7 +16,7 @@ if (WINDOWS) FetchContent_Declare( webrtc URL "https://webrtc-build-releases.s3.us-west-2.amazonaws.com/webrtc.windows_x86_64.tar.bz2" - URL_HASH "MD5=dfb692562770dc8c877ebfe4302e2881" + URL_HASH "MD5=b7a93b111e51ebcda21701c009c0676c" FIND_PACKAGE_ARGS NAMES webrtc DOWNLOAD_EXTRACT_TIMESTAMP TRUE DOWNLOAD_DIR "${LIBS_PREBUILT_DIR}/webrtc/" @@ -26,7 +26,7 @@ elseif (DARWIN) FetchContent_Declare( webrtc URL "https://webrtc-build-releases.s3.us-west-2.amazonaws.com/webrtc.macos_x86_64.tar.bz2" - URL_HASH "MD5=cfbcac7da897a862f9791ea29330b814" + URL_HASH "MD5=a965974e1d9fc7f55b852a8ff8ccf9a9" FIND_PACKAGE_ARGS NAMES webrtc DOWNLOAD_EXTRACT_TIMESTAMP TRUE DOWNLOAD_DIR "${LIBS_PREBUILT_DIR}/webrtc/" diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp index 8e56f9c222..fca490e8c2 100644 --- a/indra/llwebrtc/llwebrtc.cpp +++ b/indra/llwebrtc/llwebrtc.cpp @@ -150,7 +150,34 @@ void LLWebRTCImpl::init() mPeerDeviceModule->InitPlayout(); }); - apm->ApplyConfig(apm_config); + rtc::scoped_refptr<webrtc::AudioProcessing> apm = webrtc::AudioProcessingBuilder().Create(); + webrtc::AudioProcessing::Config apm_config; + apm_config.echo_canceller.enabled = true; + apm_config.echo_canceller.mobile_mode = false; + apm_config.gain_controller1.enabled = true; + apm_config.gain_controller1.mode = webrtc::AudioProcessing::Config::GainController1::kAdaptiveAnalog; + apm_config.gain_controller2.enabled = true; + apm_config.high_pass_filter.enabled = true; + apm_config.noise_suppression.enabled = true; + apm_config.noise_suppression.level = webrtc::AudioProcessing::Config::NoiseSuppression::kVeryHigh; + apm_config.transient_suppression.enabled = true; + apm_config.pipeline.multi_channel_render = true; + apm_config.pipeline.multi_channel_capture = true; + apm_config.pipeline.multi_channel_capture = true; + + webrtc::ProcessingConfig processing_config; + processing_config.input_stream().set_num_channels(2); + processing_config.input_stream().set_sample_rate_hz(8000); + processing_config.output_stream().set_num_channels(2); + processing_config.output_stream().set_sample_rate_hz(8000); + processing_config.reverse_input_stream().set_num_channels(2); + processing_config.reverse_input_stream().set_sample_rate_hz(48000); + processing_config.reverse_output_stream().set_num_channels(2); + processing_config.reverse_output_stream().set_sample_rate_hz(48000); + + apm->Initialize(processing_config); + apm->ApplyConfig(apm_config); + mPeerConnectionFactory = webrtc::CreatePeerConnectionFactory(mNetworkThread.get(), mWorkerThread.get(), mSignalingThread.get(), @@ -161,11 +188,28 @@ void LLWebRTCImpl::init() nullptr /* video_decoder_factory */, nullptr /* audio_mixer */, apm); + + mWorkerThread->BlockingCall( [this]() { mPeerDeviceModule->StartPlayout(); - mPeerDeviceModule->StartRecording(); + }); +} + +void LLWebRTCImpl::setRecording(bool recording) +{ + mWorkerThread->PostTask( + [this, recording]() + { + if (recording) + { + mPeerDeviceModule->StartRecording(); + } + else + { + mPeerDeviceModule->StopRecording(); + } }); } @@ -263,8 +307,6 @@ void LLWebRTCImpl::setCaptureDevice(const std::string &id) { mPeerDeviceModule->StopRecording(); } - - mPeerDeviceModule->StopRecording(); mPeerDeviceModule->SetRecordingDevice(mRecordingDevice); mPeerDeviceModule->InitMicrophone(); mPeerDeviceModule->InitRecording(); @@ -427,6 +469,10 @@ void LLWebRTCImpl::freePeerConnection(LLWebRTCPeerConnection * peer_connection) (*it)->terminate(); mPeerConnections.erase(it); } + if (mPeerConnections.empty()) + { + setRecording(false); + } } // @@ -519,6 +565,7 @@ bool LLWebRTCPeerConnectionImpl::initializeConnection() audioOptions.noise_suppression = true; mLocalStream = mPeerConnectionFactory->CreateLocalMediaStream("SLStream"); + rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track( mPeerConnectionFactory->CreateAudioTrack("SLAudio", mPeerConnectionFactory->CreateAudioSource(audioOptions).get())); audio_track->set_enabled(true); @@ -750,15 +797,14 @@ void LLWebRTCPeerConnectionImpl::OnConnectionChange(webrtc::PeerConnectionInterf { case webrtc::PeerConnectionInterface::PeerConnectionState::kConnected: { - if (new_state == webrtc::PeerConnectionInterface::PeerConnectionState::kConnected) - { - mWebRTCImpl->PostWorkerTask([this]() { - for (auto &observer : mSignalingObserverList) - { - observer->OnAudioEstablished(this); - } - }); - } + mWebRTCImpl->setRecording(true); + + mWebRTCImpl->PostWorkerTask([this]() { + for (auto &observer : mSignalingObserverList) + { + observer->OnAudioEstablished(this); + } + }); break; } case webrtc::PeerConnectionInterface::PeerConnectionState::kFailed: @@ -872,8 +918,8 @@ void LLWebRTCPeerConnectionImpl::OnSuccess(webrtc::SessionDescriptionInterface * // force mono down, stereo up if (std::sscanf(sdp_line.c_str(), "a=rtpmap:%i opus/%i/2", &payload_id, &bandwidth) == 2) { - sdp_mangled_stream << sdp_line << "\n"; opus_payload = std::to_string(payload_id); + sdp_mangled_stream << "a=rtpmap:" << opus_payload << " opus/48000/2" << "\n"; } else if (sdp_line.find("a=fmtp:" + opus_payload) == 0) { diff --git a/indra/llwebrtc/llwebrtc_impl.h b/indra/llwebrtc/llwebrtc_impl.h index 6a84f67ef5..884e107527 100644 --- a/indra/llwebrtc/llwebrtc_impl.h +++ b/indra/llwebrtc/llwebrtc_impl.h @@ -162,6 +162,8 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface LLWebRTCPeerConnection * newPeerConnection(); void freePeerConnection(LLWebRTCPeerConnection * peer_connection); + void setRecording(bool recording); + protected: std::unique_ptr<rtc::Thread> mNetworkThread; |