From 7cc764c7407f1d64f4284416dc4ca0ca4dba27e6 Mon Sep 17 00:00:00 2001 Message-Id: <7cc764c7407f1d64f4284416dc4ca0ca4dba27e6.1358959439.git.minovotn@redhat.com> In-Reply-To: <4b2df53c087cd9df02d66686da40ae4f600f3904.1358959439.git.minovotn@redhat.com> References: <4b2df53c087cd9df02d66686da40ae4f600f3904.1358959439.git.minovotn@redhat.com> From: Markus Armbruster Date: Wed, 23 Jan 2013 15:52:30 +0100 Subject: [PATCH 4/7] Revert "hw/ac97: remove USE_MIXER code" RH-Author: Markus Armbruster Message-id: <1358956353-15195-5-git-send-email-armbru@redhat.com> Patchwork-id: 47665 O-Subject: [RHEL-6.4 PATCH qemu-kvm 4/7] Revert "hw/ac97: remove USE_MIXER code" Bugzilla: 884253 RH-Acked-by: Ademar de Souza Reis Jr. RH-Acked-by: Alex Williamson RH-Acked-by: Gerd Hoffmann This reverts commit 7272d561b6bd7e62c591d5fbb175839b83181ee9. Signed-off-by: Markus Armbruster --- hw/ac97.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) Signed-off-by: Michal Novotny --- hw/ac97.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/hw/ac97.c b/hw/ac97.c index 8dd4f88..1d62d94 100644 --- a/hw/ac97.c +++ b/hw/ac97.c @@ -431,6 +431,99 @@ static void reset_voices (AC97LinkState *s, uint8_t active[LAST_INDEX]) AUD_set_active_in (s->voice_mc, active[MC_INDEX]); } +#ifdef USE_MIXER +static void set_volume (AC97LinkState *s, int index, + audmixerctl_t mt, uint32_t val) +{ + int mute = (val >> MUTE_SHIFT) & 1; + uint8_t rvol = VOL_MASK - (val & VOL_MASK); + uint8_t lvol = VOL_MASK - ((val >> 8) & VOL_MASK); + rvol = 255 * rvol / VOL_MASK; + lvol = 255 * lvol / VOL_MASK; + +#ifdef SOFT_VOLUME + if (index == AC97_Master_Volume_Mute) { + AUD_set_volume_out (s->voice_po, mute, lvol, rvol); + } + else { + AUD_set_volume (mt, &mute, &lvol, &rvol); + } +#else + AUD_set_volume (mt, &mute, &lvol, &rvol); +#endif + + rvol = VOL_MASK - ((VOL_MASK * rvol) / 255); + lvol = VOL_MASK - ((VOL_MASK * lvol) / 255); + mixer_store (s, index, val); +} + +static audrecsource_t ac97_to_aud_record_source (uint8_t i) +{ + switch (i) { + case REC_MIC: + return AUD_REC_MIC; + + case REC_CD: + return AUD_REC_CD; + + case REC_VIDEO: + return AUD_REC_VIDEO; + + case REC_AUX: + return AUD_REC_AUX; + + case REC_LINE_IN: + return AUD_REC_LINE_IN; + + case REC_PHONE: + return AUD_REC_PHONE; + + default: + dolog ("Unknown record source %d, using MIC\n", i); + return AUD_REC_MIC; + } +} + +static uint8_t aud_to_ac97_record_source (audrecsource_t rs) +{ + switch (rs) { + case AUD_REC_MIC: + return REC_MIC; + + case AUD_REC_CD: + return REC_CD; + + case AUD_REC_VIDEO: + return REC_VIDEO; + + case AUD_REC_AUX: + return REC_AUX; + + case AUD_REC_LINE_IN: + return REC_LINE_IN; + + case AUD_REC_PHONE: + return REC_PHONE; + + default: + dolog ("Unknown audio recording source %d using MIC\n", rs); + return REC_MIC; + } +} + +static void record_select (AC97LinkState *s, uint32_t val) +{ + uint8_t rs = val & REC_MASK; + uint8_t ls = (val >> 8) & REC_MASK; + audrecsource_t ars = ac97_to_aud_record_source (rs); + audrecsource_t als = ac97_to_aud_record_source (ls); + AUD_set_record_source (&als, &ars); + rs = aud_to_ac97_record_source (ars); + ls = aud_to_ac97_record_source (als); + mixer_store (s, AC97_Record_Select, rs | (ls << 8)); +} +#endif + static void mixer_reset (AC97LinkState *s) { uint8_t active[LAST_INDEX]; @@ -465,6 +558,12 @@ static void mixer_reset (AC97LinkState *s) mixer_store (s, AC97_PCM_LR_ADC_Rate , 0xbb80); mixer_store (s, AC97_MIC_ADC_Rate , 0xbb80); +#ifdef USE_MIXER + record_select (s, 0); + set_volume (s, AC97_Master_Volume_Mute, AUD_MIXER_VOLUME , 0x8000); + set_volume (s, AC97_PCM_Out_Volume_Mute, AUD_MIXER_PCM , 0x8808); + set_volume (s, AC97_Line_In_Volume_Mute, AUD_MIXER_LINE_IN, 0x8808); +#endif reset_voices (s, active); } @@ -523,6 +622,20 @@ static void nam_writew (void *opaque, uint32_t addr, uint32_t val) val |= mixer_load (s, index) & 0xf; mixer_store (s, index, val); break; +#ifdef USE_MIXER + case AC97_Master_Volume_Mute: + set_volume (s, index, AUD_MIXER_VOLUME, val); + break; + case AC97_PCM_Out_Volume_Mute: + set_volume (s, index, AUD_MIXER_PCM, val); + break; + case AC97_Line_In_Volume_Mute: + set_volume (s, index, AUD_MIXER_LINE_IN, val); + break; + case AC97_Record_Select: + record_select (s, val); + break; +#endif case AC97_Vendor_ID1: case AC97_Vendor_ID2: dolog ("Attempt to write vendor ID to %#x\n", val); @@ -1079,6 +1192,14 @@ static int ac97_post_load (void *opaque, int version_id) uint8_t active[LAST_INDEX]; AC97LinkState *s = opaque; +#ifdef USE_MIXER + record_select (s, mixer_load (s, AC97_Record_Select)); +#define V_(a, b) set_volume (s, a, b, mixer_load (s, a)) + V_ (AC97_Master_Volume_Mute, AUD_MIXER_VOLUME); + V_ (AC97_PCM_Out_Volume_Mute, AUD_MIXER_PCM); + V_ (AC97_Line_In_Volume_Mute, AUD_MIXER_LINE_IN); +#undef V_ +#endif active[PI_INDEX] = !!(s->bm_regs[PI_INDEX].cr & CR_RPBM); active[PO_INDEX] = !!(s->bm_regs[PO_INDEX].cr & CR_RPBM); active[MC_INDEX] = !!(s->bm_regs[MC_INDEX].cr & CR_RPBM); -- 1.7.11.7