summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorRoxanne Skelly <roxanne@roxiware.com>2024-08-19 08:14:44 -0700
committerGitHub <noreply@github.com>2024-08-19 08:14:44 -0700
commit1c7bc351d60788a7d8fadb5a460d2bf7223cc19a (patch)
treeb8914600245b781674cee7ece9e02600e91c61e5 /indra
parent0f3ffb0fad721740f20ed5c7a74f4ceade6d46b6 (diff)
parent2dae5a880de2e8b24ad0b36cc4d634187b97979b (diff)
Merge pull request #2328 from secondlife/roxie/webrtc-airpod-fixes
Diffstat (limited to 'indra')
-rw-r--r--indra/llwebrtc/CMakeLists.txt6
-rw-r--r--indra/llwebrtc/llwebrtc.cpp86
-rw-r--r--indra/llwebrtc/llwebrtc_impl.h2
3 files changed, 71 insertions, 23 deletions
diff --git a/indra/llwebrtc/CMakeLists.txt b/indra/llwebrtc/CMakeLists.txt
index 30aaec1265..a18b716003 100644
--- a/indra/llwebrtc/CMakeLists.txt
+++ b/indra/llwebrtc/CMakeLists.txt
@@ -31,6 +31,7 @@ add_library (llwebrtc SHARED ${llwebrtc_SOURCE_FILES})
set_target_properties(llwebrtc PROPERTIES PUBLIC_HEADER llwebrtc.h)
if (WINDOWS)
+ cmake_policy(SET CMP0091 NEW)
set_target_properties(llwebrtc
PROPERTIES
LINK_FLAGS "/debug /LARGEADDRESSAWARE"
@@ -42,7 +43,10 @@ if (WINDOWS)
wmcodecdspuuid
msdmo
strmiids
- iphlpapi)
+ iphlpapi
+ libcmt)
+ # as the webrtc libraries are release, build this binary as release as well.
+ target_compile_options(llwebrtc PRIVATE "/MT")
if (USE_BUGSPLAT)
set_target_properties(llwebrtc PROPERTIES PDB_OUTPUT_DIRECTORY "${SYMBOLS_STAGING_DIR}")
endif (USE_BUGSPLAT)
diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp
index 2c890acbdb..0daa767766 100644
--- a/indra/llwebrtc/llwebrtc.cpp
+++ b/indra/llwebrtc/llwebrtc.cpp
@@ -206,10 +206,10 @@ void LLWebRTCImpl::init()
mTuningDeviceModule->SetAudioDeviceSink(this);
mTuningDeviceModule->InitMicrophone();
mTuningDeviceModule->InitSpeaker();
+ mTuningDeviceModule->SetStereoRecording(false);
+ mTuningDeviceModule->SetStereoPlayout(true);
mTuningDeviceModule->InitRecording();
mTuningDeviceModule->InitPlayout();
- mTuningDeviceModule->SetStereoRecording(true);
- mTuningDeviceModule->SetStereoPlayout(true);
updateDevices();
});
@@ -227,10 +227,6 @@ void LLWebRTCImpl::init()
mPeerDeviceModule->EnableBuiltInAEC(false);
mPeerDeviceModule->InitMicrophone();
mPeerDeviceModule->InitSpeaker();
- mPeerDeviceModule->InitRecording();
- mPeerDeviceModule->InitPlayout();
- mPeerDeviceModule->SetStereoRecording(true);
- mPeerDeviceModule->SetStereoPlayout(true);
});
// The custom processor allows us to retrieve audio data (and levels)
@@ -251,8 +247,9 @@ void LLWebRTCImpl::init()
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;
+ apm_config.pipeline.multi_channel_capture = false;
+
+ mAudioProcessingModule->ApplyConfig(apm_config);
webrtc::ProcessingConfig processing_config;
processing_config.input_stream().set_num_channels(2);
@@ -264,10 +261,8 @@ void LLWebRTCImpl::init()
processing_config.reverse_output_stream().set_num_channels(2);
processing_config.reverse_output_stream().set_sample_rate_hz(48000);
- mAudioProcessingModule->ApplyConfig(apm_config);
mAudioProcessingModule->Initialize(processing_config);
-
mPeerConnectionFactory = webrtc::CreatePeerConnectionFactory(mNetworkThread.get(),
mWorkerThread.get(),
mSignalingThread.get(),
@@ -279,7 +274,6 @@ void LLWebRTCImpl::init()
nullptr /* audio_mixer */,
mAudioProcessingModule);
- mWorkerThread->BlockingCall([this]() { mPeerDeviceModule->StartPlayout(); });
}
void LLWebRTCImpl::terminate()
@@ -331,6 +325,8 @@ void LLWebRTCImpl::setRecording(bool recording)
{
if (recording)
{
+ mPeerDeviceModule->SetStereoRecording(false);
+ mPeerDeviceModule->InitRecording();
mPeerDeviceModule->StartRecording();
}
else
@@ -340,6 +336,24 @@ void LLWebRTCImpl::setRecording(bool recording)
});
}
+void LLWebRTCImpl::setPlayout(bool playing)
+{
+ mWorkerThread->PostTask(
+ [this, playing]()
+ {
+ if (playing)
+ {
+ mPeerDeviceModule->SetStereoPlayout(true);
+ mPeerDeviceModule->InitPlayout();
+ mPeerDeviceModule->StartPlayout();
+ }
+ else
+ {
+ mPeerDeviceModule->StopPlayout();
+ }
+ });
+}
+
void LLWebRTCImpl::setAudioConfig(LLWebRTCDeviceInterface::AudioConfig config)
{
webrtc::AudioProcessing::Config apm_config;
@@ -402,7 +416,6 @@ void LLWebRTCImpl::unsetDevicesObserver(LLWebRTCDevicesObserver *observer)
void ll_set_device_module_capture_device(rtc::scoped_refptr<webrtc::AudioDeviceModule> device_module, int16_t device)
{
- device_module->StopRecording();
#if WEBRTC_WIN
if (device < 0)
{
@@ -417,10 +430,9 @@ void ll_set_device_module_capture_device(rtc::scoped_refptr<webrtc::AudioDeviceM
// has it at 0
device_module->SetRecordingDevice(device + 1);
#endif
+ device_module->SetStereoRecording(false);
device_module->InitMicrophone();
device_module->InitRecording();
- device_module->SetStereoRecording(false);
- device_module->StartRecording();
}
void LLWebRTCImpl::setCaptureDevice(const std::string &id)
@@ -444,18 +456,32 @@ void LLWebRTCImpl::setCaptureDevice(const std::string &id)
mRecordingDevice = recordingDevice;
if (mTuningMode)
{
- mWorkerThread->PostTask([this, recordingDevice]() { ll_set_device_module_capture_device(mTuningDeviceModule, recordingDevice); });
+ mWorkerThread->PostTask([this, recordingDevice]()
+ {
+ ll_set_device_module_capture_device(mTuningDeviceModule, recordingDevice);
+ });
}
else
{
- mWorkerThread->PostTask([this, recordingDevice]() { ll_set_device_module_capture_device(mPeerDeviceModule, recordingDevice); });
+ mWorkerThread->PostTask([this, recordingDevice]()
+ {
+ bool recording = mPeerDeviceModule->Recording();
+ if (recording)
+ {
+ mPeerDeviceModule->StopRecording();
+ }
+ ll_set_device_module_capture_device(mPeerDeviceModule, recordingDevice);
+ if (recording)
+ {
+ mPeerDeviceModule->StartRecording();
+ }
+ });
}
}
void ll_set_device_module_render_device(rtc::scoped_refptr<webrtc::AudioDeviceModule> device_module, int16_t device)
{
- device_module->StopPlayout();
#if WEBRTC_WIN
if (device < 0)
{
@@ -468,9 +494,9 @@ void ll_set_device_module_render_device(rtc::scoped_refptr<webrtc::AudioDeviceMo
#else
device_module->SetPlayoutDevice(device + 1);
#endif
+ device_module->SetStereoPlayout(true);
device_module->InitSpeaker();
device_module->InitPlayout();
- device_module->SetStereoPlayout(true);
}
void LLWebRTCImpl::setRenderDevice(const std::string &id)
@@ -506,8 +532,16 @@ void LLWebRTCImpl::setRenderDevice(const std::string &id)
mWorkerThread->PostTask(
[this, playoutDevice]()
{
+ bool playing = mPeerDeviceModule->Playing();
+ if (playing)
+ {
+ mPeerDeviceModule->StopPlayout();
+ }
ll_set_device_module_render_device(mPeerDeviceModule, playoutDevice);
- mPeerDeviceModule->StartPlayout();
+ if (playing)
+ {
+ mPeerDeviceModule->StartPlayout();
+ }
});
}
}
@@ -592,6 +626,8 @@ void LLWebRTCImpl::setTuningMode(bool enable)
//mTuningDeviceModule->StopPlayout();
ll_set_device_module_render_device(mPeerDeviceModule, mPlayoutDevice);
ll_set_device_module_capture_device(mPeerDeviceModule, mRecordingDevice);
+ mPeerDeviceModule->SetStereoPlayout(true);
+ mPeerDeviceModule->SetStereoRecording(false);
mPeerDeviceModule->InitPlayout();
mPeerDeviceModule->InitRecording();
mPeerDeviceModule->StartPlayout();
@@ -635,6 +671,11 @@ LLWebRTCPeerConnectionInterface *LLWebRTCImpl::newPeerConnection()
mPeerConnections.emplace_back(peerConnection);
peerConnection->enableSenderTracks(!mMute);
+ if (mPeerConnections.empty())
+ {
+ setRecording(true);
+ setPlayout(true);
+ }
return peerConnection.get();
}
@@ -649,6 +690,7 @@ void LLWebRTCImpl::freePeerConnection(LLWebRTCPeerConnectionInterface* peer_conn
if (mPeerConnections.empty())
{
setRecording(false);
+ setPlayout(false);
}
}
@@ -662,7 +704,7 @@ void LLWebRTCImpl::freePeerConnection(LLWebRTCPeerConnectionInterface* peer_conn
LLWebRTCPeerConnectionImpl::LLWebRTCPeerConnectionImpl() :
mWebRTCImpl(nullptr),
mPeerConnection(nullptr),
- mMute(false),
+ mMute(true),
mAnswerReceived(false)
{
}
@@ -684,8 +726,8 @@ void LLWebRTCPeerConnectionImpl::init(LLWebRTCImpl * webrtc_impl)
}
void LLWebRTCPeerConnectionImpl::terminate()
{
- mWebRTCImpl->PostSignalingTask(
- [=]()
+ mWebRTCImpl->SignalingBlockingCall(
+ [this]()
{
if (mPeerConnection)
{
diff --git a/indra/llwebrtc/llwebrtc_impl.h b/indra/llwebrtc/llwebrtc_impl.h
index c5b32123eb..f8a7873af8 100644
--- a/indra/llwebrtc/llwebrtc_impl.h
+++ b/indra/llwebrtc/llwebrtc_impl.h
@@ -278,6 +278,8 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface, public webrtc::AudioDeviceS
// enables/disables capture via the capture device
void setRecording(bool recording);
+ void setPlayout(bool playing);
+
protected:
LLWebRTCLogSink* mLogSink;