--- qemu-2.1.3/hw/audio/hda-codec-common.h 2015-04-20 14:44:18.621197997 +0200 +++ qemu-2.1.3/hw/audio/hda-codec-common.h.new 2015-04-20 14:43:24.852627519 +0200 @@ -28,16 +28,22 @@ #define QEMU_HDA_ID_OUTPUT ((QEMU_HDA_ID_VENDOR << 16) | 0x12) #define QEMU_HDA_ID_DUPLEX ((QEMU_HDA_ID_VENDOR << 16) | 0x22) #define QEMU_HDA_ID_MICRO ((QEMU_HDA_ID_VENDOR << 16) | 0x32) -#define QEMU_HDA_AMP_CAPS \ +#define QEMU_HDA_AMP_OUT_CAPS \ (AC_AMPCAP_MUTE | \ - (QEMU_HDA_AMP_STEPS << AC_AMPCAP_OFFSET_SHIFT) | \ - (QEMU_HDA_AMP_STEPS << AC_AMPCAP_NUM_STEPS_SHIFT) | \ - (3 << AC_AMPCAP_STEP_SIZE_SHIFT)) + (QEMU_HDA_AMP_OUT_STEPS << AC_AMPCAP_OFFSET_SHIFT) | \ + (QEMU_HDA_AMP_OUT_STEPS << AC_AMPCAP_NUM_STEPS_SHIFT) | \ + (QEMU_HDA_AMP_OUT_STEP_SIZE << AC_AMPCAP_STEP_SIZE_SHIFT)) +#define QEMU_HDA_AMP_IN_CAPS \ + (AC_AMPCAP_MUTE | \ + (QEMU_HDA_AMP_IN_STEPS << AC_AMPCAP_OFFSET_SHIFT) | \ + (QEMU_HDA_AMP_IN_STEPS << AC_AMPCAP_NUM_STEPS_SHIFT) | \ + (QEMU_HDA_AMP_IN_STEP_SIZE << AC_AMPCAP_STEP_SIZE_SHIFT)) #else #define QEMU_HDA_ID_OUTPUT ((QEMU_HDA_ID_VENDOR << 16) | 0x11) #define QEMU_HDA_ID_DUPLEX ((QEMU_HDA_ID_VENDOR << 16) | 0x21) #define QEMU_HDA_ID_MICRO ((QEMU_HDA_ID_VENDOR << 16) | 0x31) -#define QEMU_HDA_AMP_CAPS QEMU_HDA_AMP_NONE +#define QEMU_HDA_AMP_OUT_CAPS QEMU_HDA_AMP_NONE +#define QEMU_HDA_AMP_IN_CAPS QEMU_HDA_AMP_NONE #endif @@ -61,7 +67,7 @@ static const desc_param glue(common_para .val = QEMU_HDA_AMP_NONE, },{ .id = AC_PAR_AMP_OUT_CAP, - .val = QEMU_HDA_AMP_CAPS, + .val = QEMU_HDA_AMP_OUT_CAPS, }, }; @@ -86,7 +92,7 @@ static const desc_param glue(common_para .val = AC_SUPFMT_PCM, },{ .id = AC_PAR_AMP_IN_CAP, - .val = QEMU_HDA_AMP_CAPS, + .val = QEMU_HDA_AMP_IN_CAPS, },{ .id = AC_PAR_AMP_OUT_CAP, .val = QEMU_HDA_AMP_NONE, @@ -453,4 +459,5 @@ static const desc_codec glue(micro_, PAR #undef QEMU_HDA_ID_OUTPUT #undef QEMU_HDA_ID_DUPLEX #undef QEMU_HDA_ID_MICRO -#undef QEMU_HDA_AMP_CAPS +#undef QEMU_HDA_AMP_IN_CAPS +#undef QEMU_HDA_AMP_OUT_CAPS --- qemu-2.1.3/hw/audio/hda-codec.c 2015-04-20 15:20:38.069019517 +0200 +++ qemu-2.1.3/hw/audio/hda-codec.c.new 2015-04-20 15:17:32.443070187 +0200 @@ -116,7 +116,17 @@ #define QEMU_HDA_PCM_FORMATS (AC_SUPPCM_BITS_16 | \ 0x1fc /* 16 -> 96 kHz */) #define QEMU_HDA_AMP_NONE (0) -#define QEMU_HDA_AMP_STEPS 0x4a +/* Amplifier properties */ +/* Step size: 0: 0.25dB 1: 0.5dB 2: 0.75dB 3: 1dB */ +/* + Until we have a way to propagate dB values cleanly to the host + e.g. through spice, it is better to use a smaller dynamic range + for input. Here we use 0x40 * 0.5 dB = 32dB. +*/ +#define QEMU_HDA_AMP_OUT_STEPS 0x4a +#define QEMU_HDA_AMP_OUT_STEP_SIZE 3 +#define QEMU_HDA_AMP_IN_STEPS 0x40 +#define QEMU_HDA_AMP_IN_STEP_SIZE 1 #define PARAM mixemu #define HDA_MIXER @@ -258,15 +268,16 @@ left = st->mute_left ? 0 : st->gain_left; right = st->mute_right ? 0 : st->gain_right; - left = left * 255 / QEMU_HDA_AMP_STEPS; - right = right * 255 / QEMU_HDA_AMP_STEPS; - if (!st->state->mixer) { return; } if (st->output) { + left = left * 255 / QEMU_HDA_AMP_OUT_STEPS; + right = right * 255 / QEMU_HDA_AMP_OUT_STEPS; AUD_set_volume_out(st->voice.out, muted, left, right); } else { + left = left * 255 / QEMU_HDA_AMP_IN_STEPS; + right = right * 255 / QEMU_HDA_AMP_IN_STEPS; AUD_set_volume_in(st->voice.in, muted, left, right); } } @@ -512,8 +512,8 @@ st->node = node; if (type == AC_WID_AUD_OUT) { /* unmute output by default */ - st->gain_left = QEMU_HDA_AMP_STEPS; - st->gain_right = QEMU_HDA_AMP_STEPS; + st->gain_left = QEMU_HDA_AMP_OUT_STEPS; + st->gain_right = QEMU_HDA_AMP_OUT_STEPS; st->bpos = sizeof(st->buf); st->output = true; } else {