diff options
author | Paul Brook <paul@codesourcery.com> | 2009-05-12 12:02:38 +0100 |
---|---|---|
committer | Paul Brook <paul@codesourcery.com> | 2009-05-12 12:02:38 +0100 |
commit | 0d9acba8fddbf970c7353083e6a60b47017ce3e4 (patch) | |
tree | d4b709ce317ced6e21ea29378d00a0b5dd6c6bf6 /audio/audio.c | |
parent | f0f26a06d51b7e7764f8951cdbf67ac9ad507f6d (diff) | |
download | qemu-0d9acba8fddbf970c7353083e6a60b47017ce3e4.zip qemu-0d9acba8fddbf970c7353083e6a60b47017ce3e4.tar.gz qemu-0d9acba8fddbf970c7353083e6a60b47017ce3e4.tar.bz2 |
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>
Diffstat (limited to 'audio/audio.c')
-rw-r--r-- | audio/audio.c | 44 |
1 files changed, 20 insertions, 24 deletions
diff --git a/audio/audio.c b/audio/audio.c index 3c311d7..84d9ae6 100644 --- a/audio/audio.c +++ b/audio/audio.c @@ -1711,6 +1711,10 @@ AudioState *AUD_init (void) const char *drvname; AudioState *s = &glob_audio_state; + if (s->drv) { + return s; + } + LIST_INIT (&s->hw_head_out); LIST_INIT (&s->hw_head_in); LIST_INIT (&s->cap_head); @@ -1718,8 +1722,7 @@ AudioState *AUD_init (void) s->ts = qemu_new_timer (vm_clock, audio_timer, s); if (!s->ts) { - dolog ("Could not create audio timer\n"); - return NULL; + hw_error("Could not create audio timer\n"); } audio_process_options ("AUDIO", audio_options); @@ -1772,37 +1775,30 @@ AudioState *AUD_init (void) if (!done) { done = !audio_driver_init (s, &no_audio_driver); if (!done) { - dolog ("Could not initialize audio subsystem\n"); + hw_error("Could not initialize audio subsystem\n"); } else { dolog ("warning: Using timer based audio emulation\n"); } } - if (done) { - VMChangeStateEntry *e; - - if (conf.period.hertz <= 0) { - if (conf.period.hertz < 0) { - dolog ("warning: Timer period is negative - %d " - "treating as zero\n", - conf.period.hertz); - } - conf.period.ticks = 1; - } - else { - conf.period.ticks = ticks_per_sec / conf.period.hertz; - } + VMChangeStateEntry *e; - e = qemu_add_vm_change_state_handler (audio_vm_change_state_handler, s); - if (!e) { - dolog ("warning: Could not register change state handler\n" - "(Audio can continue looping even after stopping the VM)\n"); + if (conf.period.hertz <= 0) { + if (conf.period.hertz < 0) { + dolog ("warning: Timer period is negative - %d " + "treating as zero\n", + conf.period.hertz); } + conf.period.ticks = 1; + } else { + conf.period.ticks = ticks_per_sec / conf.period.hertz; } - else { - qemu_del_timer (s->ts); - return NULL; + + e = qemu_add_vm_change_state_handler (audio_vm_change_state_handler, s); + if (!e) { + dolog ("warning: Could not register change state handler\n" + "(Audio can continue looping even after stopping the VM)\n"); } LIST_INIT (&s->card_head); |