A_OP(icode, &ptr, iMAC1, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr+1), A_FXBUS(FXBUS_MIDI_RIGHT));
        snd_emu10k1_init_stereo_control(&controls[nctl++], "Synth Capture Volume", gpr, 0);
        gpr += 2;
-      
+
+       // We need to double the volume, as we configure the voices for half volume,
+       // which is necessary for bit-identical reproduction.
+       { static_assert(stereo_mix == playback + SND_EMU10K1_PLAYBACK_CHANNELS); }
+       for (z = 0; z < SND_EMU10K1_PLAYBACK_CHANNELS + 2; z++)
+               A_OP(icode, &ptr, iACC3, A_GPR(playback + z), A_GPR(playback + z), A_GPR(playback + z), A_C_00000000);
+
        /*
         * inputs
         */
        /*
         *  Process FX Buses
         */
-       OP(icode, &ptr, iMACINT0, GPR(0), C_00000000, FXBUS(FXBUS_PCM_LEFT), C_00000004);
-       OP(icode, &ptr, iMACINT0, GPR(1), C_00000000, FXBUS(FXBUS_PCM_RIGHT), C_00000004);
-       OP(icode, &ptr, iMACINT0, GPR(2), C_00000000, FXBUS(FXBUS_MIDI_LEFT), C_00000004);
-       OP(icode, &ptr, iMACINT0, GPR(3), C_00000000, FXBUS(FXBUS_MIDI_RIGHT), C_00000004);
-       OP(icode, &ptr, iMACINT0, GPR(4), C_00000000, FXBUS(FXBUS_PCM_LEFT_REAR), C_00000004);
-       OP(icode, &ptr, iMACINT0, GPR(5), C_00000000, FXBUS(FXBUS_PCM_RIGHT_REAR), C_00000004);
-       OP(icode, &ptr, iMACINT0, GPR(6), C_00000000, FXBUS(FXBUS_PCM_CENTER), C_00000004);
-       OP(icode, &ptr, iMACINT0, GPR(7), C_00000000, FXBUS(FXBUS_PCM_LFE), C_00000004);
+       OP(icode, &ptr, iMACINT0, GPR(0), C_00000000, FXBUS(FXBUS_PCM_LEFT), C_00000008);
+       OP(icode, &ptr, iMACINT0, GPR(1), C_00000000, FXBUS(FXBUS_PCM_RIGHT), C_00000008);
+       OP(icode, &ptr, iMACINT0, GPR(2), C_00000000, FXBUS(FXBUS_MIDI_LEFT), C_00000008);
+       OP(icode, &ptr, iMACINT0, GPR(3), C_00000000, FXBUS(FXBUS_MIDI_RIGHT), C_00000008);
+       OP(icode, &ptr, iMACINT0, GPR(4), C_00000000, FXBUS(FXBUS_PCM_LEFT_REAR), C_00000008);
+       OP(icode, &ptr, iMACINT0, GPR(5), C_00000000, FXBUS(FXBUS_PCM_RIGHT_REAR), C_00000008);
+       OP(icode, &ptr, iMACINT0, GPR(6), C_00000000, FXBUS(FXBUS_PCM_CENTER), C_00000008);
+       OP(icode, &ptr, iMACINT0, GPR(7), C_00000000, FXBUS(FXBUS_PCM_LFE), C_00000008);
        OP(icode, &ptr, iMACINT0, GPR(8), C_00000000, C_00000000, C_00000000);  /* S/PDIF left */
        OP(icode, &ptr, iMACINT0, GPR(9), C_00000000, C_00000000, C_00000000);  /* S/PDIF right */
-       OP(icode, &ptr, iMACINT0, GPR(10), C_00000000, FXBUS(FXBUS_PCM_LEFT_FRONT), C_00000004);
-       OP(icode, &ptr, iMACINT0, GPR(11), C_00000000, FXBUS(FXBUS_PCM_RIGHT_FRONT), C_00000004);
+       OP(icode, &ptr, iMACINT0, GPR(10), C_00000000, FXBUS(FXBUS_PCM_LEFT_FRONT), C_00000008);
+       OP(icode, &ptr, iMACINT0, GPR(11), C_00000000, FXBUS(FXBUS_PCM_RIGHT_FRONT), C_00000008);
 
        /* Raw S/PDIF PCM */
        ipcm->substream = 0;
        
        /* Wave Center/LFE Playback Volume */
        OP(icode, &ptr, iACC3, GPR(tmp + 0), FXBUS(FXBUS_PCM_LEFT), FXBUS(FXBUS_PCM_RIGHT), C_00000000);
-       OP(icode, &ptr, iMACINT0, GPR(tmp + 0), C_00000000, GPR(tmp + 0), C_00000002);
+       OP(icode, &ptr, iMACINT0, GPR(tmp + 0), C_00000000, GPR(tmp + 0), C_00000004);
        VOLUME(icode, &ptr, playback + 4, tmp + 0, gpr);
        snd_emu10k1_init_mono_control(controls + i++, "Wave Center Playback Volume", gpr++, 0);
        VOLUME(icode, &ptr, playback + 5, tmp + 0, gpr);
 
        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
        uinfo->count = 3;
        uinfo->value.integer.min = 0;
-       uinfo->value.integer.max = 0xffff;
+       uinfo->value.integer.max = 0x1fffd;
        return 0;
 }
 
        int idx;
 
        for (idx = 0; idx < 3; idx++)
-               ucontrol->value.integer.value[idx] = mix->attn[idx];
+               ucontrol->value.integer.value[idx] = mix->attn[idx] * 0xffffU / 0x8000U;
        return 0;
 }
 
 
        spin_lock_irqsave(&emu->reg_lock, flags);
        for (idx = 0; idx < 3; idx++) {
-               val = ucontrol->value.integer.value[idx] & 0xffff;
+               unsigned uval = ucontrol->value.integer.value[idx] & 0x1ffff;
+               val = uval * 0x8000U / 0xffffU;
                if (mix->attn[idx] != val) {
                        mix->attn[idx] = val;
                        change = 1;
        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
        uinfo->count = 1;
        uinfo->value.integer.min = 0;
-       uinfo->value.integer.max = 0xffff;
+       uinfo->value.integer.max = 0x1fffd;
        return 0;
 }
 
        struct snd_emu10k1_pcm_mixer *mix =
                &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
 
-       ucontrol->value.integer.value[0] = mix->attn[0];
+       ucontrol->value.integer.value[0] = mix->attn[0] * 0xffffU / 0x8000U;
        return 0;
 }
 
        int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
        struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
        int change = 0, val;
+       unsigned uval;
 
        spin_lock_irqsave(&emu->reg_lock, flags);
-       val = ucontrol->value.integer.value[0] & 0xffff;
+       uval = ucontrol->value.integer.value[0] & 0x1ffff;
+       val = uval * 0x8000U / 0xffffU;
        if (mix->attn[0] != val) {
                mix->attn[0] = val;
                change = 1;