diff options
| author | Gerd Hoffmann <kraxel@redhat.com> | 2010-11-01 13:05:32 +0100 |
|---|---|---|
| committer | malc <av1474@comtv.ru> | 2010-11-01 17:57:22 +0300 |
| commit | d61a4ce8f01ac9f1810380e043db467d536eeb6b (patch) | |
| tree | eb969474b2664b7da2ed991631985900c3567f2c /hw/intel-hda.h | |
| parent | cdae5cfbd3a61a5d4de79b829fb41188073d3002 (diff) | |
| download | focaccia-qemu-d61a4ce8f01ac9f1810380e043db467d536eeb6b.tar.gz focaccia-qemu-d61a4ce8f01ac9f1810380e043db467d536eeb6b.zip | |
Add Intel HD Audio support to qemu.
This patch adds three devices to qemu: intel-hda Intel HD Audio Controller, the PCI device. Provides a HDA bus. Emulates ICH6 at the moment. Adding a ICH9 PCIE variant shouldn't be hard. hda-duplex HDA Codec. Attaches to the HDA bus. Supports 16bit stereo, rates 16k -> 96k, playback, recording and volume control (with CONFIG_MIXEMU=y). hda-output HDA Codec without recording support. Subset of the hda-duplex codec. Use this if you don't want your guests access your mic. Usage: add '-device intel-hda -device hda-duplex' to your command line. Tested guests: * Linux works. * Win7 works. * DOS (mpxplay) works. * WinXP doesn't work. [ v2 changes ] * Fixed endianess, big endian hosts work now. * Fixed some emulation bugs. * Added immediate command emulation. * Added vmstate support. * Make it behave like all other sound card drivers: - can be configured via '--audio-card-list=hda' - can be added to a VM using '-soundhw hda' * Code style fixups. * Zapped guest-triggerable asserts. * Handle partial reads/writes of audio data correctly. Cc: malc <av1474@comtv.ru> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: malc <av1474@comtv.ru>
Diffstat (limited to 'hw/intel-hda.h')
| -rw-r--r-- | hw/intel-hda.h | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/hw/intel-hda.h b/hw/intel-hda.h new file mode 100644 index 0000000000..ba290ec850 --- /dev/null +++ b/hw/intel-hda.h @@ -0,0 +1,61 @@ +#ifndef HW_INTEL_HDA_H +#define HW_INTEL_HDA_H + +#include "qdev.h" + +/* --------------------------------------------------------------------- */ +/* hda bus */ + +typedef struct HDACodecBus HDACodecBus; +typedef struct HDACodecDevice HDACodecDevice; +typedef struct HDACodecDeviceInfo HDACodecDeviceInfo; + +typedef void (*hda_codec_response_func)(HDACodecDevice *dev, + bool solicited, uint32_t response); +typedef bool (*hda_codec_xfer_func)(HDACodecDevice *dev, + uint32_t stnr, bool output, + uint8_t *buf, uint32_t len); + +struct HDACodecBus { + BusState qbus; + uint32_t next_cad; + hda_codec_response_func response; + hda_codec_xfer_func xfer; +}; + +struct HDACodecDevice { + DeviceState qdev; + HDACodecDeviceInfo *info; + uint32_t cad; /* codec address */ +}; + +struct HDACodecDeviceInfo { + DeviceInfo qdev; + int (*init)(HDACodecDevice *dev); + void (*command)(HDACodecDevice *dev, uint32_t nid, uint32_t data); + void (*stream)(HDACodecDevice *dev, uint32_t stnr, bool running); +}; + +void hda_codec_bus_init(DeviceState *dev, HDACodecBus *bus, + hda_codec_response_func response, + hda_codec_xfer_func xfer); +void hda_codec_register(HDACodecDeviceInfo *info); +HDACodecDevice *hda_codec_find(HDACodecBus *bus, uint32_t cad); + +void hda_codec_response(HDACodecDevice *dev, bool solicited, uint32_t response); +bool hda_codec_xfer(HDACodecDevice *dev, uint32_t stnr, bool output, + uint8_t *buf, uint32_t len); + +/* --------------------------------------------------------------------- */ + +#define dprint(_dev, _level, _fmt, ...) \ + do { \ + if (_dev->debug >= _level) { \ + fprintf(stderr, "%s: ", _dev->name); \ + fprintf(stderr, _fmt, ## __VA_ARGS__); \ + } \ + } while (0) + +/* --------------------------------------------------------------------- */ + +#endif |