diff --git a/src/sound/oalsound.cpp b/src/sound/oalsound.cpp
index 2e351fa0e..c9ba16f2b 100644
--- a/src/sound/oalsound.cpp
+++ b/src/sound/oalsound.cpp
@@ -690,7 +690,12 @@ template<typename T>
 static void LoadALFunc(const char *name, T *x)
 { *x = reinterpret_cast<T>(alGetProcAddress(name)); }
 
+template<typename T>
+static void LoadALCFunc(ALCdevice *device, const char *name, T *x)
+{ *x = reinterpret_cast<T>(alcGetProcAddress(device, name)); }
+
 #define LOAD_FUNC(x)  (LoadALFunc(#x, &x))
+#define LOAD_DEV_FUNC(d, x)  (LoadALCFunc(d, #x, &x))
 OpenALSoundRenderer::OpenALSoundRenderer()
     : Device(NULL), Context(NULL), SFXPaused(0), PrevEnvironment(NULL), EnvSlot(0)
 {
@@ -748,7 +753,8 @@ OpenALSoundRenderer::OpenALSoundRenderer()
     DPrintf("  Extensions: " TEXTCOLOR_ORANGE"%s\n", alGetString(AL_EXTENSIONS));
 
     ALC.EXT_EFX = !!alcIsExtensionPresent(Device, "ALC_EXT_EFX");
-    ALC.EXT_disconnect = !!alcIsExtensionPresent(Device, "ALC_EXT_disconnect");;
+    ALC.EXT_disconnect = !!alcIsExtensionPresent(Device, "ALC_EXT_disconnect");
+    ALC.SOFT_pause_device = !!alcIsExtensionPresent(Device, "ALC_SOFT_pause_device");
     AL.EXT_source_distance_model = !!alIsExtensionPresent("AL_EXT_source_distance_model");
     AL.EXT_SOURCE_RADIUS = !!alIsExtensionPresent("AL_EXT_SOURCE_RADIUS");
     AL.SOFT_deferred_updates = !!alIsExtensionPresent("AL_SOFT_deferred_updates");
@@ -771,6 +777,12 @@ OpenALSoundRenderer::OpenALSoundRenderer()
         alProcessUpdatesSOFT = _wrap_ProcessUpdatesSOFT;
     }
 
+    if(ALC.SOFT_pause_device)
+    {
+        LOAD_DEV_FUNC(Device, alcDevicePauseSOFT);
+        LOAD_DEV_FUNC(Device, alcDeviceResumeSOFT);
+    }
+
     ALenum err = getALError();
     if(err != AL_NO_ERROR)
     {
@@ -910,6 +922,7 @@ OpenALSoundRenderer::OpenALSoundRenderer()
     if(EnvSlot)
         Printf("  EFX enabled\n");
 }
+#undef LOAD_DEV_FUNC
 #undef LOAD_FUNC
 
 OpenALSoundRenderer::~OpenALSoundRenderer()
@@ -1599,10 +1612,14 @@ void OpenALSoundRenderer::SetInactive(SoundRenderer::EInactiveState state)
     {
         case SoundRenderer::INACTIVE_Active:
             alListenerf(AL_GAIN, 1.0f);
+            if(ALC.SOFT_pause_device)
+                alcDeviceResumeSOFT(Device);
             break;
 
-        /* FIXME: This doesn't stop anything. */
         case SoundRenderer::INACTIVE_Complete:
+            if(ALC.SOFT_pause_device)
+                alcDevicePauseSOFT(Device);
+            /* fall-through */
         case SoundRenderer::INACTIVE_Mute:
             alListenerf(AL_GAIN, 0.0f);
             break;
diff --git a/src/sound/oalsound.h b/src/sound/oalsound.h
index c9ebc70ea..88dcbc238 100644
--- a/src/sound/oalsound.h
+++ b/src/sound/oalsound.h
@@ -129,6 +129,7 @@ private:
     struct {
         bool EXT_EFX;
         bool EXT_disconnect;
+        bool SOFT_pause_device;
     } ALC;
     struct {
         bool EXT_source_distance_model;
@@ -180,6 +181,9 @@ private:
     ALvoid (AL_APIENTRY*alDeferUpdatesSOFT)(void);
     ALvoid (AL_APIENTRY*alProcessUpdatesSOFT)(void);
 
+    void (ALC_APIENTRY*alcDevicePauseSOFT)(ALCdevice *device);
+    void (ALC_APIENTRY*alcDeviceResumeSOFT)(ALCdevice *device);
+
 	void LoadReverb(const ReverbContainer *env);
 	void PurgeStoppedSources();
 	static FSoundChan *FindLowestChannel();