diff --git a/modules/audio_output/amem.c b/modules/audio_output/amem.c
index fbd0af869f77258429adaab4e8f317a53b0075bd..4b904e1ee95bb3166963ecc4266c5eaab56786e1 100644
--- a/modules/audio_output/amem.c
+++ b/modules/audio_output/amem.c
@@ -109,6 +109,27 @@ static int MuteSet (audio_output_t *aout, bool mute)
     return sys->set_volume (sys->opaque, sys->volume, mute) ? -1 : 0;
 }
 
+static int SoftVolumeSet (audio_output_t *aout, float vol)
+{
+    aout_sys_t *sys = aout->sys;
+
+    vol = vol * vol * vol;
+    if (!sys->mute && aout_GainRequest (aout, vol))
+        return -1;
+    sys->volume = vol;
+    return 0;
+}
+
+static int SoftMuteSet (audio_output_t *aout, bool mute)
+{
+    aout_sys_t *sys = aout->sys;
+
+    if (aout_GainRequest (aout, mute ? 0.f : sys->volume))
+        return -1;
+    sys->mute = mute;
+    return 0;
+}
+
 typedef int (*vlc_audio_format_cb) (void **, char *, unsigned *, unsigned *);
 
 static int Open (vlc_object_t *obj)
@@ -221,7 +242,10 @@ static int Open (vlc_object_t *obj)
         aout->mute_set = MuteSet;
     }
     else
-        aout_VolumeSoftInit (aout);
+    {
+        aout->volume_set = SoftVolumeSet;
+        aout->mute_set = SoftMuteSet;
+    }
     return VLC_SUCCESS;
 
 error: