Commit 0d9acba8fddbf970c7353083e6a60b47017ce3e4
1 parent
f0f26a06
Make AUD_init failure fatal
Failure to initialize the audio subsystem is not handled consistently. Where it is handled it has guest visible effects, which is wrong. We already have a "nosound" audio driver as a last resort, so trying to proceed without an audio backend seems pointless. Also protect against multiple calls to AUD_init so that this can be pushed down into individual devices. Signed-off-by: Paul Brook <paul@codesourcery.com>
Showing
6 changed files
with
35 additions
and
50 deletions
audio/audio.c
... | ... | @@ -1711,6 +1711,10 @@ AudioState *AUD_init (void) |
1711 | 1711 | const char *drvname; |
1712 | 1712 | AudioState *s = &glob_audio_state; |
1713 | 1713 | |
1714 | + if (s->drv) { | |
1715 | + return s; | |
1716 | + } | |
1717 | + | |
1714 | 1718 | LIST_INIT (&s->hw_head_out); |
1715 | 1719 | LIST_INIT (&s->hw_head_in); |
1716 | 1720 | LIST_INIT (&s->cap_head); |
... | ... | @@ -1718,8 +1722,7 @@ AudioState *AUD_init (void) |
1718 | 1722 | |
1719 | 1723 | s->ts = qemu_new_timer (vm_clock, audio_timer, s); |
1720 | 1724 | if (!s->ts) { |
1721 | - dolog ("Could not create audio timer\n"); | |
1722 | - return NULL; | |
1725 | + hw_error("Could not create audio timer\n"); | |
1723 | 1726 | } |
1724 | 1727 | |
1725 | 1728 | audio_process_options ("AUDIO", audio_options); |
... | ... | @@ -1772,37 +1775,30 @@ AudioState *AUD_init (void) |
1772 | 1775 | if (!done) { |
1773 | 1776 | done = !audio_driver_init (s, &no_audio_driver); |
1774 | 1777 | if (!done) { |
1775 | - dolog ("Could not initialize audio subsystem\n"); | |
1778 | + hw_error("Could not initialize audio subsystem\n"); | |
1776 | 1779 | } |
1777 | 1780 | else { |
1778 | 1781 | dolog ("warning: Using timer based audio emulation\n"); |
1779 | 1782 | } |
1780 | 1783 | } |
1781 | 1784 | |
1782 | - if (done) { | |
1783 | - VMChangeStateEntry *e; | |
1784 | - | |
1785 | - if (conf.period.hertz <= 0) { | |
1786 | - if (conf.period.hertz < 0) { | |
1787 | - dolog ("warning: Timer period is negative - %d " | |
1788 | - "treating as zero\n", | |
1789 | - conf.period.hertz); | |
1790 | - } | |
1791 | - conf.period.ticks = 1; | |
1792 | - } | |
1793 | - else { | |
1794 | - conf.period.ticks = ticks_per_sec / conf.period.hertz; | |
1795 | - } | |
1785 | + VMChangeStateEntry *e; | |
1796 | 1786 | |
1797 | - e = qemu_add_vm_change_state_handler (audio_vm_change_state_handler, s); | |
1798 | - if (!e) { | |
1799 | - dolog ("warning: Could not register change state handler\n" | |
1800 | - "(Audio can continue looping even after stopping the VM)\n"); | |
1787 | + if (conf.period.hertz <= 0) { | |
1788 | + if (conf.period.hertz < 0) { | |
1789 | + dolog ("warning: Timer period is negative - %d " | |
1790 | + "treating as zero\n", | |
1791 | + conf.period.hertz); | |
1801 | 1792 | } |
1793 | + conf.period.ticks = 1; | |
1794 | + } else { | |
1795 | + conf.period.ticks = ticks_per_sec / conf.period.hertz; | |
1802 | 1796 | } |
1803 | - else { | |
1804 | - qemu_del_timer (s->ts); | |
1805 | - return NULL; | |
1797 | + | |
1798 | + e = qemu_add_vm_change_state_handler (audio_vm_change_state_handler, s); | |
1799 | + if (!e) { | |
1800 | + dolog ("warning: Could not register change state handler\n" | |
1801 | + "(Audio can continue looping even after stopping the VM)\n"); | |
1806 | 1802 | } |
1807 | 1803 | |
1808 | 1804 | LIST_INIT (&s->card_head); | ... | ... |
hw/mips_jazz.c
... | ... | @@ -107,12 +107,10 @@ static void audio_init(qemu_irq *pic) |
107 | 107 | AudioState *s; |
108 | 108 | |
109 | 109 | s = AUD_init(); |
110 | - if (s) { | |
111 | - for (c = soundhw; c->name; ++c) { | |
112 | - if (c->enabled) { | |
113 | - if (c->isa) { | |
114 | - c->init.init_isa(s, pic); | |
115 | - } | |
110 | + for (c = soundhw; c->name; ++c) { | |
111 | + if (c->enabled) { | |
112 | + if (c->isa) { | |
113 | + c->init.init_isa(s, pic); | |
116 | 114 | } |
117 | 115 | } |
118 | 116 | } | ... | ... |
hw/mips_malta.c
... | ... | @@ -472,10 +472,9 @@ static void audio_init (PCIBus *pci_bus) |
472 | 472 | AudioState *s; |
473 | 473 | |
474 | 474 | s = AUD_init (); |
475 | - if (s) { | |
476 | - for (c = soundhw; c->name; ++c) { | |
477 | - if (c->enabled) | |
478 | - c->init.init_pci (pci_bus, s); | |
475 | + for (c = soundhw; c->name; ++c) { | |
476 | + if (c->enabled) { | |
477 | + c->init.init_pci (pci_bus, s); | |
479 | 478 | } |
480 | 479 | } |
481 | 480 | } | ... | ... |
hw/musicpal.c
... | ... | @@ -428,10 +428,6 @@ static i2c_interface *musicpal_audio_init(qemu_irq irq) |
428 | 428 | int iomemtype; |
429 | 429 | |
430 | 430 | audio = AUD_init(); |
431 | - if (!audio) { | |
432 | - AUD_log(audio_name, "No audio state\n"); | |
433 | - return NULL; | |
434 | - } | |
435 | 431 | |
436 | 432 | s = qemu_mallocz(sizeof(musicpal_audio_state)); |
437 | 433 | s->irq = irq; | ... | ... |
hw/pc.c
... | ... | @@ -791,16 +791,14 @@ static void audio_init (PCIBus *pci_bus, qemu_irq *pic) |
791 | 791 | AudioState *s; |
792 | 792 | |
793 | 793 | s = AUD_init (); |
794 | - if (s) { | |
795 | - for (c = soundhw; c->name; ++c) { | |
796 | - if (c->enabled) { | |
797 | - if (c->isa) { | |
798 | - c->init.init_isa (s, pic); | |
799 | - } | |
800 | - else { | |
801 | - if (pci_bus) { | |
802 | - c->init.init_pci (pci_bus, s); | |
803 | - } | |
794 | + for (c = soundhw; c->name; ++c) { | |
795 | + if (c->enabled) { | |
796 | + if (c->isa) { | |
797 | + c->init.init_isa (s, pic); | |
798 | + } | |
799 | + else { | |
800 | + if (pci_bus) { | |
801 | + c->init.init_pci (pci_bus, s); | |
804 | 802 | } |
805 | 803 | } |
806 | 804 | } | ... | ... |