From patchwork Sat Sep 7 04:53:59 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bandan Das X-Patchwork-Id: 273362 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 0413C2C00E4 for ; Sat, 7 Sep 2013 14:56:07 +1000 (EST) Received: from localhost ([::1]:40650 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VIAZ2-0005cQ-WA for incoming@patchwork.ozlabs.org; Sat, 07 Sep 2013 00:56:05 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37834) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VIAXa-0003yf-Ih for qemu-devel@nongnu.org; Sat, 07 Sep 2013 00:54:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VIAXU-00085x-Gv for qemu-devel@nongnu.org; Sat, 07 Sep 2013 00:54:34 -0400 Received: from mx1.redhat.com ([209.132.183.28]:30814) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VIAXU-00085c-6Q for qemu-devel@nongnu.org; Sat, 07 Sep 2013 00:54:28 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r874sR45001802 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 7 Sep 2013 00:54:27 -0400 Received: from aqua.home.waltham (vpn-63-139.rdu2.redhat.com [10.10.63.139]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r874sD4R028876; Sat, 7 Sep 2013 00:54:26 -0400 From: Bandan Das To: qemu-devel@nongnu.org Date: Sat, 7 Sep 2013 00:53:59 -0400 Message-Id: <1378529640-20263-3-git-send-email-bsd@redhat.com> In-Reply-To: <1378529640-20263-1-git-send-email-bsd@redhat.com> References: <1378529640-20263-1-git-send-email-bsd@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: Paolo Bonzini , Gerd Hoffmann , Markus Armbruster , Jan Kiszka Subject: [Qemu-devel] [PATCH v3 2/3] hda-codec: make mixemu selectable at runtime X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- hw/audio/hda-codec-common.h | 117 +++++++++++++++++++++++--------------------- hw/audio/hda-codec.c | 64 ++++++++++++++++++++++-- 2 files changed, 122 insertions(+), 59 deletions(-) diff --git a/hw/audio/hda-codec-common.h b/hw/audio/hda-codec-common.h index 2f7e95f..b4fdb51 100644 --- a/hw/audio/hda-codec-common.h +++ b/hw/audio/hda-codec-common.h @@ -24,7 +24,7 @@ * HDA codec descriptions */ -#ifdef CONFIG_MIXEMU +#ifdef HDA_MIXER #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) @@ -42,7 +42,7 @@ /* common: audio output widget */ -static const desc_param common_params_audio_dac[] = { +static const desc_param glue(common_params_audio_dac_, PARAM)[] = { { .id = AC_PAR_AUDIO_WIDGET_CAP, .val = ((AC_WID_AUD_OUT << AC_WCAP_TYPE_SHIFT) | @@ -66,7 +66,7 @@ static const desc_param common_params_audio_dac[] = { }; /* common: audio input widget */ -static const desc_param common_params_audio_adc[] = { +static const desc_param glue(common_params_audio_adc_, PARAM)[] = { { .id = AC_PAR_AUDIO_WIDGET_CAP, .val = ((AC_WID_AUD_IN << AC_WCAP_TYPE_SHIFT) | @@ -94,7 +94,7 @@ static const desc_param common_params_audio_adc[] = { }; /* common: pin widget (line-out) */ -static const desc_param common_params_audio_lineout[] = { +static const desc_param glue(common_params_audio_lineout_, PARAM)[] = { { .id = AC_PAR_AUDIO_WIDGET_CAP, .val = ((AC_WID_PIN << AC_WCAP_TYPE_SHIFT) | @@ -116,7 +116,7 @@ static const desc_param common_params_audio_lineout[] = { }; /* common: pin widget (line-in) */ -static const desc_param common_params_audio_linein[] = { +static const desc_param glue(common_params_audio_linein_, PARAM)[] = { { .id = AC_PAR_AUDIO_WIDGET_CAP, .val = ((AC_WID_PIN << AC_WCAP_TYPE_SHIFT) | @@ -134,7 +134,7 @@ static const desc_param common_params_audio_linein[] = { }; /* output: root node */ -static const desc_param output_params_root[] = { +static const desc_param glue(output_params_root_, PARAM)[] = { { .id = AC_PAR_VENDOR_ID, .val = QEMU_HDA_ID_OUTPUT, @@ -151,7 +151,7 @@ static const desc_param output_params_root[] = { }; /* output: audio function */ -static const desc_param output_params_audio_func[] = { +static const desc_param glue(output_params_audio_func_, PARAM)[] = { { .id = AC_PAR_FUNCTION_TYPE, .val = AC_GRP_AUDIO_FUNCTION, @@ -186,28 +186,28 @@ static const desc_param output_params_audio_func[] = { }; /* output: nodes */ -static const desc_node output_nodes[] = { +static const desc_node glue(output_nodes_, PARAM)[] = { { .nid = AC_NODE_ROOT, .name = "root", - .params = output_params_root, - .nparams = ARRAY_SIZE(output_params_root), + .params = glue(output_params_root_, PARAM), + .nparams = ARRAY_SIZE(glue(output_params_root_, PARAM)), },{ .nid = 1, .name = "func", - .params = output_params_audio_func, - .nparams = ARRAY_SIZE(output_params_audio_func), + .params = glue(output_params_audio_func_, PARAM), + .nparams = ARRAY_SIZE(glue(output_params_audio_func_, PARAM)), },{ .nid = 2, .name = "dac", - .params = common_params_audio_dac, - .nparams = ARRAY_SIZE(common_params_audio_dac), + .params = glue(common_params_audio_dac_, PARAM), + .nparams = ARRAY_SIZE(glue(common_params_audio_dac_, PARAM)), .stindex = 0, },{ .nid = 3, .name = "out", - .params = common_params_audio_lineout, - .nparams = ARRAY_SIZE(common_params_audio_lineout), + .params = glue(common_params_audio_lineout_, PARAM), + .nparams = ARRAY_SIZE(glue(common_params_audio_lineout_, PARAM)), .config = ((AC_JACK_PORT_COMPLEX << AC_DEFCFG_PORT_CONN_SHIFT) | (AC_JACK_LINE_OUT << AC_DEFCFG_DEVICE_SHIFT) | (AC_JACK_CONN_UNKNOWN << AC_DEFCFG_CONN_TYPE_SHIFT) | @@ -219,15 +219,15 @@ static const desc_node output_nodes[] = { }; /* output: codec */ -static const desc_codec output = { +static const desc_codec glue(output_, PARAM) = { .name = "output", .iid = QEMU_HDA_ID_OUTPUT, - .nodes = output_nodes, - .nnodes = ARRAY_SIZE(output_nodes), + .nodes = glue(output_nodes_, PARAM), + .nnodes = ARRAY_SIZE(glue(output_nodes_, PARAM)), }; /* duplex: root node */ -static const desc_param duplex_params_root[] = { +static const desc_param glue(duplex_params_root_, PARAM)[] = { { .id = AC_PAR_VENDOR_ID, .val = QEMU_HDA_ID_DUPLEX, @@ -244,7 +244,7 @@ static const desc_param duplex_params_root[] = { }; /* duplex: audio function */ -static const desc_param duplex_params_audio_func[] = { +static const desc_param glue(duplex_params_audio_func_, PARAM)[] = { { .id = AC_PAR_FUNCTION_TYPE, .val = AC_GRP_AUDIO_FUNCTION, @@ -279,28 +279,28 @@ static const desc_param duplex_params_audio_func[] = { }; /* duplex: nodes */ -static const desc_node duplex_nodes[] = { +static const desc_node glue(duplex_nodes_, PARAM)[] = { { .nid = AC_NODE_ROOT, .name = "root", - .params = duplex_params_root, - .nparams = ARRAY_SIZE(duplex_params_root), + .params = glue(duplex_params_root_, PARAM), + .nparams = ARRAY_SIZE(glue(duplex_params_root_, PARAM)), },{ .nid = 1, .name = "func", - .params = duplex_params_audio_func, - .nparams = ARRAY_SIZE(duplex_params_audio_func), + .params = glue(duplex_params_audio_func_, PARAM), + .nparams = ARRAY_SIZE(glue(duplex_params_audio_func_, PARAM)), },{ .nid = 2, .name = "dac", - .params = common_params_audio_dac, - .nparams = ARRAY_SIZE(common_params_audio_dac), + .params = glue(common_params_audio_dac_, PARAM), + .nparams = ARRAY_SIZE(glue(common_params_audio_dac_, PARAM)), .stindex = 0, },{ .nid = 3, .name = "out", - .params = common_params_audio_lineout, - .nparams = ARRAY_SIZE(common_params_audio_lineout), + .params = glue(common_params_audio_lineout_, PARAM), + .nparams = ARRAY_SIZE(glue(common_params_audio_lineout_, PARAM)), .config = ((AC_JACK_PORT_COMPLEX << AC_DEFCFG_PORT_CONN_SHIFT) | (AC_JACK_LINE_OUT << AC_DEFCFG_DEVICE_SHIFT) | (AC_JACK_CONN_UNKNOWN << AC_DEFCFG_CONN_TYPE_SHIFT) | @@ -311,15 +311,15 @@ static const desc_node duplex_nodes[] = { },{ .nid = 4, .name = "adc", - .params = common_params_audio_adc, - .nparams = ARRAY_SIZE(common_params_audio_adc), + .params = glue(common_params_audio_adc_, PARAM), + .nparams = ARRAY_SIZE(glue(common_params_audio_adc_, PARAM)), .stindex = 1, .conn = (uint32_t[]) { 5 }, },{ .nid = 5, .name = "in", - .params = common_params_audio_linein, - .nparams = ARRAY_SIZE(common_params_audio_linein), + .params = glue(common_params_audio_linein_, PARAM), + .nparams = ARRAY_SIZE(glue(common_params_audio_linein_, PARAM)), .config = ((AC_JACK_PORT_COMPLEX << AC_DEFCFG_PORT_CONN_SHIFT) | (AC_JACK_LINE_IN << AC_DEFCFG_DEVICE_SHIFT) | (AC_JACK_CONN_UNKNOWN << AC_DEFCFG_CONN_TYPE_SHIFT) | @@ -330,15 +330,15 @@ static const desc_node duplex_nodes[] = { }; /* duplex: codec */ -static const desc_codec duplex = { +static const desc_codec glue(duplex_, PARAM) = { .name = "duplex", .iid = QEMU_HDA_ID_DUPLEX, - .nodes = duplex_nodes, - .nnodes = ARRAY_SIZE(duplex_nodes), + .nodes = glue(duplex_nodes_, PARAM), + .nnodes = ARRAY_SIZE(glue(duplex_nodes_, PARAM)), }; /* micro: root node */ -static const desc_param micro_params_root[] = { +static const desc_param glue(micro_params_root_, PARAM)[] = { { .id = AC_PAR_VENDOR_ID, .val = QEMU_HDA_ID_MICRO, @@ -355,7 +355,7 @@ static const desc_param micro_params_root[] = { }; /* micro: audio function */ -static const desc_param micro_params_audio_func[] = { +static const desc_param glue(micro_params_audio_func_, PARAM)[] = { { .id = AC_PAR_FUNCTION_TYPE, .val = AC_GRP_AUDIO_FUNCTION, @@ -390,28 +390,28 @@ static const desc_param micro_params_audio_func[] = { }; /* micro: nodes */ -static const desc_node micro_nodes[] = { +static const desc_node glue(micro_nodes_, PARAM)[] = { { .nid = AC_NODE_ROOT, .name = "root", - .params = micro_params_root, - .nparams = ARRAY_SIZE(micro_params_root), + .params = glue(micro_params_root_, PARAM), + .nparams = ARRAY_SIZE(glue(micro_params_root_, PARAM)), },{ .nid = 1, .name = "func", - .params = micro_params_audio_func, - .nparams = ARRAY_SIZE(micro_params_audio_func), + .params = glue(micro_params_audio_func_, PARAM), + .nparams = ARRAY_SIZE(glue(micro_params_audio_func_, PARAM)), },{ .nid = 2, .name = "dac", - .params = common_params_audio_dac, - .nparams = ARRAY_SIZE(common_params_audio_dac), + .params = glue(common_params_audio_dac_, PARAM), + .nparams = ARRAY_SIZE(glue(common_params_audio_dac_, PARAM)), .stindex = 0, },{ .nid = 3, .name = "out", - .params = common_params_audio_lineout, - .nparams = ARRAY_SIZE(common_params_audio_lineout), + .params = glue(common_params_audio_lineout_, PARAM), + .nparams = ARRAY_SIZE(glue(common_params_audio_lineout_, PARAM)), .config = ((AC_JACK_PORT_COMPLEX << AC_DEFCFG_PORT_CONN_SHIFT) | (AC_JACK_SPEAKER << AC_DEFCFG_DEVICE_SHIFT) | (AC_JACK_CONN_UNKNOWN << AC_DEFCFG_CONN_TYPE_SHIFT) | @@ -422,15 +422,15 @@ static const desc_node micro_nodes[] = { },{ .nid = 4, .name = "adc", - .params = common_params_audio_adc, - .nparams = ARRAY_SIZE(common_params_audio_adc), + .params = glue(common_params_audio_adc_, PARAM), + .nparams = ARRAY_SIZE(glue(common_params_audio_adc_, PARAM)), .stindex = 1, .conn = (uint32_t[]) { 5 }, },{ .nid = 5, .name = "in", - .params = common_params_audio_linein, - .nparams = ARRAY_SIZE(common_params_audio_linein), + .params = glue(common_params_audio_linein_, PARAM), + .nparams = ARRAY_SIZE(glue(common_params_audio_linein_, PARAM)), .config = ((AC_JACK_PORT_COMPLEX << AC_DEFCFG_PORT_CONN_SHIFT) | (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT) | (AC_JACK_CONN_UNKNOWN << AC_DEFCFG_CONN_TYPE_SHIFT) | @@ -441,9 +441,16 @@ static const desc_node micro_nodes[] = { }; /* micro: codec */ -static const desc_codec micro = { +static const desc_codec glue(micro_, PARAM) = { .name = "micro", .iid = QEMU_HDA_ID_MICRO, - .nodes = micro_nodes, - .nnodes = ARRAY_SIZE(micro_nodes), + .nodes = glue(micro_nodes_, PARAM), + .nnodes = ARRAY_SIZE(glue(micro_nodes_, PARAM)), }; + +#undef PARAM +#undef HDA_MIXER +#undef QEMU_HDA_ID_OUTPUT +#undef QEMU_HDA_ID_DUPLEX +#undef QEMU_HDA_ID_MICRO +#undef QEMU_HDA_AMP_CAPS diff --git a/hw/audio/hda-codec.c b/hw/audio/hda-codec.c index 65fbb2a..19a8a0e 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)