diff --git a/indra/llaudio/llaudioengine_fmodstudio.cpp b/indra/llaudio/llaudioengine_fmodstudio.cpp
index e55485bb02..b51a76e3ac 100644
--- a/indra/llaudio/llaudioengine_fmodstudio.cpp
+++ b/indra/llaudio/llaudioengine_fmodstudio.cpp
@@ -49,6 +49,43 @@ const U32 EXTRA_SOUND_CHANNELS = 10;
FMOD_RESULT F_CALLBACK windDSPCallback(FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int *outchannels);
+// FIRE-11266 / BUG-3549 / MAINT-2983: Changing audio device now requires relog to restore sounds
+#if LL_WINDOWS
+FMOD_RESULT F_CALLBACK systemCallback(FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK_TYPE type, void *commanddata1, void *commanddata2, void* userdata)
+{
+ FMOD::System *sys = (FMOD::System *)system;
+ FMOD_RESULT result;
+ switch (type)
+ {
+ case FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED:
+ {
+ int drivers;
+ sys->getNumDrivers(&drivers);
+
+ if (drivers <= 0)
+ {
+ break;
+ }
+
+ for (int i = 0; i < drivers; ++i)
+ {
+ result = sys->setDriver(i);
+ if (result == FMOD_OK)
+ {
+ break;
+ }
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+ return FMOD_OK;
+}
+#endif
+//
+
FMOD::ChannelGroup *LLAudioEngine_FMODSTUDIO::mChannelGroups[LLAudioEngine::AUDIO_TYPE_COUNT] = {0};
LLAudioEngine_FMODSTUDIO::LLAudioEngine_FMODSTUDIO(bool enable_profiler, U32 resample_method)
@@ -110,6 +147,13 @@ bool LLAudioEngine_FMODSTUDIO::init(const S32 num_channels, void* userdata)
result = mSystem->setSoftwareChannels(num_channels + EXTRA_SOUND_CHANNELS);
Check_FMOD_Error(result,"FMOD::System::setSoftwareChannels");
+ // FIRE-11266 / BUG-3549 / MAINT-2983: Changing audio device now requires relog to restore sounds
+#if LL_WINDOWS
+ result = mSystem->setCallback(systemCallback);
+ Check_FMOD_Error(result, "FMOD::System::setCallback");
+#endif
+ //
+
FMOD_ADVANCEDSETTINGS adv_settings = { };
adv_settings.cbSize = sizeof(FMOD_ADVANCEDSETTINGS);
switch (mResampleMethod)