} init;
};
-static struct soundhw soundhw[] = {
-#ifdef HAS_AUDIO_CHOICE
-#ifdef CONFIG_PCSPK
- {
- "pcspk",
- "PC speaker",
- 0,
- 1,
- { .init_isa = pcspk_audio_init }
- },
-#endif
-
-#ifdef CONFIG_SB16
- {
- "sb16",
- "Creative Sound Blaster 16",
- 0,
- 1,
- { .init_isa = SB16_init }
- },
-#endif
-
-#ifdef CONFIG_CS4231A
- {
- "cs4231a",
- "CS4231A",
- 0,
- 1,
- { .init_isa = cs4231a_init }
- },
-#endif
-
-#ifdef CONFIG_ADLIB
- {
- "adlib",
-#ifdef HAS_YMF262
- "Yamaha YMF262 (OPL3)",
-#else
- "Yamaha YM3812 (OPL2)",
-#endif
- 0,
- 1,
- { .init_isa = Adlib_init }
- },
-#endif
-
-#ifdef CONFIG_GUS
- {
- "gus",
- "Gravis Ultrasound GF1",
- 0,
- 1,
- { .init_isa = GUS_init }
- },
-#endif
-
-#ifdef CONFIG_AC97
- {
- "ac97",
- "Intel 82801AA AC97 Audio",
- 0,
- 0,
- { .init_pci = ac97_init }
- },
-#endif
+static struct soundhw soundhw[9];
+static int soundhw_count;
-#ifdef CONFIG_ES1370
- {
- "es1370",
- "ENSONIQ AudioPCI ES1370",
- 0,
- 0,
- { .init_pci = es1370_init }
- },
-#endif
-
-#ifdef CONFIG_HDA
- {
- "hda",
- "Intel HD Audio",
- 0,
- 0,
- { .init_pci = intel_hda_and_codec_init }
- },
-#endif
-
-#endif /* HAS_AUDIO_CHOICE */
+void isa_register_soundhw(const char *name, const char *descr,
+ int (*init_isa)(ISABus *bus))
+{
+ assert(soundhw_count < ARRAY_SIZE(soundhw) - 1);
+ soundhw[soundhw_count].name = name;
+ soundhw[soundhw_count].descr = descr;
+ soundhw[soundhw_count].isa = 1;
+ soundhw[soundhw_count].init.init_isa = init_isa;
+ soundhw_count++;
+}
- { NULL, NULL, 0, 0, { NULL } }
-};
+void pci_register_soundhw(const char *name, const char *descr,
+ int (*init_pci)(PCIBus *bus))
+{
+ assert(soundhw_count < ARRAY_SIZE(soundhw) - 1);
+ soundhw[soundhw_count].name = name;
+ soundhw[soundhw_count].descr = descr;
+ soundhw[soundhw_count].isa = 0;
+ soundhw[soundhw_count].init.init_pci = init_pci;
+ soundhw_count++;
+}
void select_soundhw(const char *optarg)
{
if (is_help_option(optarg)) {
show_valid_cards:
-#ifdef HAS_AUDIO_CHOICE
- printf("Valid sound card names (comma separated):\n");
- for (c = soundhw; c->name; ++c) {
- printf ("%-11s %s\n", c->name, c->descr);
+ if (soundhw_count) {
+ printf("Valid sound card names (comma separated):\n");
+ for (c = soundhw; c->name; ++c) {
+ printf ("%-11s %s\n", c->name, c->descr);
+ }
+ printf("\n-soundhw all will enable all of the above\n");
+ } else {
+ printf("Machine has no user-selectable audio hardware "
+ "(it may or may not have always-present audio hardware).\n");
}
- printf("\n-soundhw all will enable all of the above\n");
-#else
- printf("Machine has no user-selectable audio hardware "
- "(it may or may not have always-present audio hardware).\n");
-#endif
exit(!is_help_option(optarg));
}
else {
if test "$target_softmmu" = "yes" ; then
case "$TARGET_BASE_ARCH" in
- arm)
+ arm|lm32|i386|mips|ppc)
cflags="-DHAS_AUDIO $cflags"
;;
- lm32)
- cflags="-DHAS_AUDIO $cflags"
- ;;
- i386|mips|ppc)
- cflags="-DHAS_AUDIO -DHAS_AUDIO_CHOICE $cflags"
- ;;
esac
fi
memory_region_destroy (&s->io_nabm);
}
-int ac97_init (PCIBus *bus)
+static int ac97_init (PCIBus *bus)
{
pci_create_simple (bus, -1, "AC97");
return 0;
static void ac97_register_types (void)
{
type_register_static (&ac97_info);
+ pci_register_soundhw("ac97", "Intel 82801AA AC97 Audio", ac97_init);
}
type_init (ac97_register_types)
.class_init = adlib_class_initfn,
};
-int Adlib_init (ISABus *bus)
+static int Adlib_init (ISABus *bus)
{
isa_create_simple (bus, TYPE_ADLIB);
return 0;
static void adlib_register_types (void)
{
type_register_static (&adlib_info);
+ isa_register_soundhw("adlib", ADLIB_DESC, Adlib_init);
}
type_init (adlib_register_types)
return 0;
}
-int cs4231a_init (ISABus *bus)
+static int cs4231a_init (ISABus *bus)
{
isa_create_simple (bus, "cs4231a");
return 0;
static void cs4231a_register_types (void)
{
type_register_static (&cs4231a_info);
+ isa_register_soundhw("cs4231a", "CS4231A", cs4231a_init);
}
type_init (cs4231a_register_types)
memory_region_destroy (&s->io);
}
-int es1370_init (PCIBus *bus)
+static int es1370_init (PCIBus *bus)
{
pci_create_simple (bus, -1, "ES1370");
return 0;
static void es1370_register_types (void)
{
type_register_static (&es1370_info);
+ pci_register_soundhw("es1370", "ENSONIQ AudioPCI ES1370", es1370_init);
}
type_init (es1370_register_types)
return 0;
}
-int GUS_init (ISABus *bus)
+static int GUS_init (ISABus *bus)
{
isa_create_simple (bus, "gus");
return 0;
static void gus_register_types (void)
{
type_register_static (&gus_info);
+ isa_register_soundhw("gus", "Gravis Ultrasound GF1", GUS_init);
}
type_init (gus_register_types)
.class_init = hda_codec_device_class_init,
};
-static void intel_hda_register_types(void)
-{
- type_register_static(&hda_codec_bus_info);
- type_register_static(&intel_hda_info_ich6);
- type_register_static(&intel_hda_info_ich9);
- type_register_static(&hda_codec_device_type_info);
-}
-
-type_init(intel_hda_register_types)
-
/*
* create intel hda controller with codec attached to it,
* so '-soundhw hda' works.
*/
-int intel_hda_and_codec_init(PCIBus *bus)
+static int intel_hda_and_codec_init(PCIBus *bus)
{
PCIDevice *controller;
BusState *hdabus;
return 0;
}
+static void intel_hda_register_types(void)
+{
+ type_register_static(&hda_codec_bus_info);
+ type_register_static(&intel_hda_info_ich6);
+ type_register_static(&intel_hda_info_ich9);
+ type_register_static(&hda_codec_device_type_info);
+ pci_register_soundhw("hda", "Intel HD Audio", intel_hda_and_codec_init);
+}
+
+type_init(intel_hda_register_types)
#include "hw/hw.h"
#include "hw/i386/pc.h"
#include "hw/isa/isa.h"
+#include "hw/audio/audio.h"
#include "audio/audio.h"
#include "qemu/timer.h"
#include "hw/timer/i8254.h"
}
}
-int pcspk_audio_init(ISABus *bus)
+static int pcspk_audio_init(ISABus *bus)
{
PCSpkState *s = pcspk_state;
struct audsettings as = {PCSPK_SAMPLE_RATE, 1, AUD_FMT_U8, 0};
static void pcspk_register(void)
{
type_register_static(&pcspk_info);
+ isa_register_soundhw("pcspk", "PC speaker", pcspk_audio_init);
}
type_init(pcspk_register)
return 0;
}
-int SB16_init (ISABus *bus)
+static int SB16_init (ISABus *bus)
{
isa_create_simple (bus, TYPE_SB16);
return 0;
static void sb16_register_types (void)
{
type_register_static (&sb16_info);
+ isa_register_soundhw("sb16", "Creative Sound Blaster 16", SB16_init);
}
type_init (sb16_register_types)
#include "hw/usb.h"
#include "hw/usb/desc.h"
#include "hw/hw.h"
-#include "hw/audio/audio.h"
#include "audio/audio.h"
#define USBAUDIO_VENDOR_NUM 0x46f4 /* CRC16() of "QEMU" */
#ifndef HW_AUDIODEV_H
#define HW_AUDIODEV_H 1
-/* es1370.c */
-int es1370_init(PCIBus *bus);
+void isa_register_soundhw(const char *name, const char *descr,
+ int (*init_isa)(ISABus *bus));
-/* sb16.c */
-int SB16_init(ISABus *bus);
-
-/* adlib.c */
-int Adlib_init(ISABus *bus);
-
-/* gus.c */
-int GUS_init(ISABus *bus);
-
-/* ac97.c */
-int ac97_init(PCIBus *bus);
-
-/* cs4231a.c */
-int cs4231a_init(ISABus *bus);
-
-/* intel-hda.c + hda-audio.c */
-int intel_hda_and_codec_init(PCIBus *bus);
+void pci_register_soundhw(const char *name, const char *descr,
+ int (*init_pci)(PCIBus *bus));
#endif
return dev;
}
-int pcspk_audio_init(ISABus *bus);
-
#endif /* !HW_PCSPK_H */