Index: qemu/hw/pc.c =================================================================== --- qemu.orig/hw/pc.c 2007-08-22 19:42:13.000000000 +0000 +++ qemu/hw/pc.c 2007-08-22 19:47:22.000000000 +0000 @@ -623,7 +623,8 @@ static int parallel_irq[MAX_PARALLEL_PORTS] = { 7, 7, 7 }; #ifdef HAS_AUDIO -static void audio_init (PCIBus *pci_bus, qemu_irq *pic) +static void audio_init (PCIBus *pci_bus, qemu_irq *pic, qemu_dma *parent_dma, + qemu_dma *parent_hdma) { struct soundhw *c; int audio_enabled = 0; @@ -640,7 +641,7 @@ for (c = soundhw; c->name; ++c) { if (c->enabled) { if (c->isa) { - c->init.init_isa (s, pic); + c->init.init_isa (s, pic, parent_dma, parent_hdma); } else { if (pci_bus) { @@ -898,7 +899,7 @@ i8042_init(i8259[1], i8259[12], 0x60); DMA_init(0, physical_dma, &isa_dma); #ifdef HAS_AUDIO - audio_init(pci_enabled ? pci_bus : NULL, i8259); + audio_init(pci_enabled ? pci_bus : NULL, i8259, isa_dma[1], isa_dma[5]); #endif floppy_controller = fdctrl_init(i8259[6], 2, 0, 0x3f0, fd_table); Index: qemu/vl.h =================================================================== --- qemu.orig/vl.h 2007-08-22 19:42:54.000000000 +0000 +++ qemu/vl.h 2007-08-22 19:47:22.000000000 +0000 @@ -936,7 +936,8 @@ int enabled; int isa; union { - int (*init_isa) (AudioState *s, qemu_irq *pic); + int (*init_isa) (AudioState *s, qemu_irq *pic, qemu_dma *parent_dma, + qemu_dma *parent_hdma); int (*init_pci) (PCIBus *bus, AudioState *s); } init; }; @@ -1046,7 +1047,8 @@ int es1370_init (PCIBus *bus, AudioState *s); /* sb16.c */ -int SB16_init (AudioState *s, qemu_irq *pic); +int SB16_init (AudioState *audio, qemu_irq *pic, qemu_dma *parent_dma, + qemu_dma *parent_hdma); /* adlib.c */ int Adlib_init (AudioState *s, qemu_irq *pic); Index: qemu/hw/sb16.c =================================================================== --- qemu.orig/hw/sb16.c 2007-08-22 19:41:43.000000000 +0000 +++ qemu/hw/sb16.c 2007-08-22 19:47:22.000000000 +0000 @@ -57,7 +57,9 @@ qemu_irq *pic; int irq; int dma; + qemu_dma *parent_dma; int hdma; + qemu_dma *parent_hdma; int port; int ver; @@ -1169,8 +1171,12 @@ to_copy = sizeof (tmpbuf); } - copied = DMA_read_memory (nchan, tmpbuf, dma_pos, to_copy); - copied = AUD_write (s->voice, tmpbuf, copied); + if (s->use_hdma) + dma_memory_read(s->parent_hdma, 0, tmpbuf + dma_pos, to_copy); + else + dma_memory_read(s->parent_dma, 0, tmpbuf + dma_pos, to_copy); + + copied = AUD_write (s->voice, tmpbuf, to_copy); temp -= copied; dma_pos = (dma_pos + copied) % dma_len; @@ -1390,7 +1396,8 @@ return 0; } -int SB16_init (AudioState *audio, qemu_irq *pic) +int SB16_init (AudioState *audio, qemu_irq *pic, qemu_dma *parent_dma, + qemu_dma *parent_hdma) { SB16State *s; int i;