summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorRoxie Linden <roxie@lindenlab.com>2023-09-22 10:47:48 -0700
committerRoxie Linden <roxie@lindenlab.com>2024-02-22 23:11:34 -0800
commitc087b8648dc85cffdc4d9a5eb85d989a9b4aa51b (patch)
treeb629d5dbf1b0a3a145330f4179c853f4035578b4 /indra
parent4624184f97a94cd99df3640f5fc1e596c30bbffe (diff)
Fix shutdown crash issue.
Diffstat (limited to 'indra')
-rw-r--r--indra/llwebrtc/llwebrtc.cpp72
-rw-r--r--indra/llwebrtc/llwebrtc.h6
-rw-r--r--indra/llwebrtc/llwebrtc_impl.h42
-rw-r--r--indra/newview/llvoicewebrtc.cpp24
-rw-r--r--indra/newview/llvoicewebrtc.h1
5 files changed, 70 insertions, 75 deletions
diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp
index dc746b7629..a3dadd696c 100644
--- a/indra/llwebrtc/llwebrtc.cpp
+++ b/indra/llwebrtc/llwebrtc.cpp
@@ -39,6 +39,34 @@ namespace llwebrtc
const float VOLUME_SCALE_WEBRTC = 3.0f;
+
+double LLAudioDeviceObserver::getMicrophoneEnergy() { return mMicrophoneEnergy; }
+
+void LLAudioDeviceObserver::OnCaptureData(const void *audio_samples,
+ const size_t num_samples,
+ const size_t bytes_per_sample,
+ const size_t num_channels,
+ const uint32_t samples_per_sec)
+{
+ double energy = 0;
+ const short *samples = (const short *) audio_samples;
+ for (size_t index = 0; index < num_samples * num_channels; index++)
+ {
+ double sample = (static_cast<double>(samples[index]) / (double) 32768);
+ energy += sample * sample;
+ }
+ mMicrophoneEnergy = std::sqrt(energy);
+}
+
+void LLAudioDeviceObserver::OnRenderData(const void *audio_samples,
+ const size_t num_samples,
+ const size_t bytes_per_sample,
+ const size_t num_channels,
+ const uint32_t samples_per_sec)
+{
+}
+
+
void LLWebRTCImpl::init()
{
mAnswerReceived = false;
@@ -58,9 +86,10 @@ void LLWebRTCImpl::init()
mWorkerThread->PostTask(
[this]()
{
+ mAudioDeviceObserver = new LLAudioDeviceObserver;
mDeviceModule = webrtc::CreateAudioDeviceWithDataObserver(webrtc::AudioDeviceModule::AudioLayer::kPlatformDefaultAudio,
mTaskQueueFactory.get(),
- std::unique_ptr<webrtc::AudioDeviceDataObserver>(this));
+ std::unique_ptr<webrtc::AudioDeviceDataObserver>(mAudioDeviceObserver));
mDeviceModule->Init();
mDeviceModule->SetStereoRecording(false);
mDeviceModule->EnableBuiltInAEC(false);
@@ -83,6 +112,10 @@ void LLWebRTCImpl::terminate()
mWorkerThread->BlockingCall(
[this]()
{
+ if (mDeviceModule)
+ {
+ mDeviceModule->Terminate();
+ }
mDeviceModule = nullptr;
mTaskQueueFactory = nullptr;
@@ -231,32 +264,6 @@ void LLWebRTCImpl::setTuningMode(bool enable)
});
}
-double LLWebRTCImpl::getTuningMicrophoneEnergy() { return mTuningEnergy; }
-
-void LLWebRTCImpl::OnCaptureData(const void *audio_samples,
- const size_t num_samples,
- const size_t bytes_per_sample,
- const size_t num_channels,
- const uint32_t samples_per_sec)
-{
- double energy = 0;
- const short *samples = (const short *) audio_samples;
- for (size_t index = 0; index < num_samples * num_channels; index++)
- {
- double sample = (static_cast<double>(samples[index]) / (double) 32768);
- energy += sample * sample;
- }
- mTuningEnergy = std::sqrt(energy);
-}
-
-void LLWebRTCImpl::OnRenderData(const void *audio_samples,
- const size_t num_samples,
- const size_t bytes_per_sample,
- const size_t num_channels,
- const uint32_t samples_per_sec)
-{
-}
-
//
// LLWebRTCSignalInterface
//
@@ -470,16 +477,9 @@ void LLWebRTCImpl::setSpeakerVolume(float volume)
});
}
-void LLWebRTCImpl::requestAudioLevel()
+double LLWebRTCImpl::getAudioLevel()
{
- mWorkerThread->PostTask(
- [this]()
- {
- for (auto &observer : mAudioObserverList)
- {
- observer->OnAudioLevel((float)mTuningEnergy);
- }
- });
+ return mAudioDeviceObserver->getMicrophoneEnergy();
}
//
diff --git a/indra/llwebrtc/llwebrtc.h b/indra/llwebrtc/llwebrtc.h
index d0d2834e3c..30c0d63c55 100644
--- a/indra/llwebrtc/llwebrtc.h
+++ b/indra/llwebrtc/llwebrtc.h
@@ -86,13 +86,12 @@ class LLWebRTCDeviceInterface
virtual void unsetDevicesObserver(LLWebRTCDevicesObserver *observer) = 0;
virtual void setTuningMode(bool enable) = 0;
- virtual double getTuningMicrophoneEnergy() = 0;
+ virtual double getAudioLevel() = 0;
};
class LLWebRTCAudioObserver
{
public:
- virtual void OnAudioLevel(float level) = 0;
};
class LLWebRTCAudioInterface
@@ -101,8 +100,7 @@ class LLWebRTCAudioInterface
virtual void setAudioObserver(LLWebRTCAudioObserver *observer) = 0;
virtual void unsetAudioObserver(LLWebRTCAudioObserver *observer) = 0;
virtual void setMute(bool mute) = 0;
- virtual void setSpeakerVolume(float volume) = 0; // volume between 0.0 and 1.0
- virtual void requestAudioLevel() = 0;
+ virtual void setSpeakerVolume(float volume) = 0; // volume between 0.0 and 1.0 = 0;
};
class LLWebRTCDataObserver
diff --git a/indra/llwebrtc/llwebrtc_impl.h b/indra/llwebrtc/llwebrtc_impl.h
index 1670d10705..da829e52af 100644
--- a/indra/llwebrtc/llwebrtc_impl.h
+++ b/indra/llwebrtc/llwebrtc_impl.h
@@ -63,11 +63,31 @@
namespace llwebrtc
{
+class LLAudioDeviceObserver : public webrtc::AudioDeviceDataObserver
+{
+ public:
+ double getMicrophoneEnergy();
+
+ void OnCaptureData(const void *audio_samples,
+ const size_t num_samples,
+ const size_t bytes_per_sample,
+ const size_t num_channels,
+ const uint32_t samples_per_sec) override;
+
+ void OnRenderData(const void *audio_samples,
+ const size_t num_samples,
+ const size_t bytes_per_sample,
+ const size_t num_channels,
+ const uint32_t samples_per_sec) override;
+
+ protected:
+ double mMicrophoneEnergy;
+};
+
class LLWebRTCImpl : public LLWebRTCDeviceInterface,
public LLWebRTCSignalInterface,
public LLWebRTCAudioInterface,
public LLWebRTCDataInterface,
- public webrtc::AudioDeviceDataObserver,
public webrtc::PeerConnectionObserver,
public webrtc::CreateSessionDescriptionObserver,
public webrtc::SetRemoteDescriptionObserverInterface,
@@ -77,7 +97,7 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface,
{
public:
LLWebRTCImpl() :
- mTuningEnergy(0.0)
+ mAudioDeviceObserver(nullptr)
{
}
~LLWebRTCImpl() {}
@@ -98,20 +118,7 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface,
void setRenderDevice(const std::string& id) override;
void setTuningMode(bool enable) override;
- double getTuningMicrophoneEnergy() override;
-
-
- void OnCaptureData(const void *audio_samples,
- const size_t num_samples,
- const size_t bytes_per_sample,
- const size_t num_channels,
- const uint32_t samples_per_sec) override;
-
- void OnRenderData(const void *audio_samples,
- const size_t num_samples,
- const size_t bytes_per_sample,
- const size_t num_channels,
- const uint32_t samples_per_sec) override;
+ double getAudioLevel() override;
//
// LLWebRTCSignalInterface
@@ -131,7 +138,6 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface,
void unsetAudioObserver(LLWebRTCAudioObserver *observer) override;
void setMute(bool mute) override;
void setSpeakerVolume(float folume) override; // range 0.0-1.0
- void requestAudioLevel() override;
//
// LLWebRTCDataInterface
@@ -195,7 +201,7 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface,
rtc::scoped_refptr<webrtc::AudioDeviceModule> mDeviceModule;
std::vector<LLWebRTCDevicesObserver *> mVoiceDevicesObserverList;
- double mTuningEnergy;
+ LLAudioDeviceObserver * mAudioDeviceObserver;
// signaling
std::vector<LLWebRTCSignalingObserver *> mSignalingObserverList;
diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp
index b621f5ee92..e6877063b5 100644
--- a/indra/newview/llvoicewebrtc.cpp
+++ b/indra/newview/llvoicewebrtc.cpp
@@ -2100,7 +2100,7 @@ void LLWebRTCVoiceClient::tuningSetSpeakerVolume(float volume)
float LLWebRTCVoiceClient::tuningGetEnergy(void)
{
- return mWebRTCDeviceInterface->getTuningMicrophoneEnergy();
+ return mWebRTCDeviceInterface->getAudioLevel();
}
bool LLWebRTCVoiceClient::deviceSettingsAvailable()
@@ -2357,9 +2357,14 @@ void LLWebRTCVoiceClient::sendPositionAndVolumeUpdate(void)
}
}
- if (mWebRTCAudioInterface)
+ if (mWebRTCDataInterface && mWebRTCAudioInterface)
{
- mWebRTCAudioInterface->requestAudioLevel();
+ Json::FastWriter writer;
+ Json::Value root;
+ root["p"] = (uint32_t) ((F32)mWebRTCDeviceInterface->getAudioLevel() * 256);
+ std::string json_data = writer.write(root);
+
+ mWebRTCDataInterface->sendData(json_data, false);
}
@@ -2613,19 +2618,6 @@ void LLWebRTCVoiceClient::OnAudioEstablished(llwebrtc::LLWebRTCAudioInterface *
setVoiceControlStateUnless(VOICE_STATE_SESSION_ESTABLISHED, VOICE_STATE_SESSION_RETRY);
}
-void LLWebRTCVoiceClient::OnAudioLevel(float level)
-{
- if (mWebRTCDataInterface)
- {
- Json::FastWriter writer;
- Json::Value root;
- root["p"] = (uint32_t) (level * 256);
- std::string json_data = writer.write(root);
-
- mWebRTCDataInterface->sendData(json_data, false);
- }
-}
-
void LLWebRTCVoiceClient::OnDataReceived(const std::string& data, bool binary)
{
// incoming data will be a json structure (if it's not binary.) We may pack
diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h
index bc858dcb32..518fee53ef 100644
--- a/indra/newview/llvoicewebrtc.h
+++ b/indra/newview/llvoicewebrtc.h
@@ -263,7 +263,6 @@ public:
/// @name Signaling notification
// LLWebRTCAudioObserver
//@{
- void OnAudioLevel(float level) override;
//@}
/////////////////////////