From 2690e61e8e313461428334586ed9dbf56531dae9 Mon Sep 17 00:00:00 2001 From: Bandan Das Date: Sat, 7 Sep 2013 00:53:59 -0400 Subject: hda-codec: make mixemu selectable at runtime Define PARAM so that we have two versions of the "desc_codec and family" structs. Add a property called "mixer" whose default value depends on whether CONFIG_MIXEMU is defined or not which will help us call the appropriate instance init functions. Signed-off-by: Bandan Das Signed-off-by: Gerd Hoffmann --- hw/audio/hda-codec.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 4 deletions(-) (limited to 'hw/audio/hda-codec.c') diff --git a/hw/audio/hda-codec.c b/hw/audio/hda-codec.c index 65fbb2a5a7..19a8a0e001 100644 --- a/hw/audio/hda-codec.c +++ b/hw/audio/hda-codec.c @@ -118,7 +118,15 @@ static void hda_codec_parse_fmt(uint32_t format, struct audsettings *as) #define QEMU_HDA_AMP_NONE (0) #define QEMU_HDA_AMP_STEPS 0x4a +#ifdef CONFIG_MIXEMU +#define PARAM mixemu +#define HDA_MIXER #include "hda-codec-common.h" +#endif + +#define PARAM nomixemu +#include "hda-codec-common.h" + /* -------------------------------------------------------------------------- */ static const char *fmt2name[] = { @@ -163,6 +171,7 @@ struct HDAAudioState { /* properties */ uint32_t debug; + bool mixer; }; static void hda_audio_input_cb(void *opaque, int avail) @@ -584,23 +593,70 @@ static const VMStateDescription vmstate_hda_audio = { }; static Property hda_audio_properties[] = { - DEFINE_PROP_UINT32("debug", HDAAudioState, debug, 0), + DEFINE_PROP_UINT32("debug", HDAAudioState, debug, 0), +#ifdef CONFIG_MIXEMU + DEFINE_PROP_BOOL("mixer", HDAAudioState, mixer, true), +#else + DEFINE_PROP_BOOL("mixer", HDAAudioState, mixer, false), +#endif DEFINE_PROP_END_OF_LIST(), }; static int hda_audio_init_output(HDACodecDevice *hda) { - return hda_audio_init(hda, &output); + HDAAudioState *a = DO_UPCAST(HDAAudioState, hda, hda); + + if (!a->mixer) { + return hda_audio_init(hda, &output_nomixemu); + } else { + +#ifdef CONFIG_MIXEMU + return hda_audio_init(hda, &output_mixemu); +#else + fprintf(stderr, "ERROR: " + "hda-codec : Mixer emulation has not been compiled in!\n"); + return -1; +#endif + + } } static int hda_audio_init_duplex(HDACodecDevice *hda) { - return hda_audio_init(hda, &duplex); + HDAAudioState *a = DO_UPCAST(HDAAudioState, hda, hda); + + if (!a->mixer) { + return hda_audio_init(hda, &duplex_nomixemu); + } else { + +#ifdef CONFIG_MIXEMU + return hda_audio_init(hda, &duplex_mixemu); +#else + fprintf(stderr, "ERROR: " + "hda-codec : Mixer emulation has not been compiled in!\n"); + return -1; +#endif + + } } static int hda_audio_init_micro(HDACodecDevice *hda) { - return hda_audio_init(hda, µ); + HDAAudioState *a = DO_UPCAST(HDAAudioState, hda, hda); + + if (!a->mixer) { + return hda_audio_init(hda, µ_nomixemu); + } else { + +#ifdef CONFIG_MIXEMU + return hda_audio_init(hda, µ_mixemu); +#else + fprintf(stderr, "ERROR: " + "hda-codec : Mixer emulation has not been compiled in!\n"); + return -1; +#endif + + } } static void hda_audio_output_class_init(ObjectClass *klass, void *data) -- cgit v1.2.1