Skip to content

Commit

Permalink
audio: fix pc speaker init
Browse files Browse the repository at this point in the history
Get rid of the pcspk_state global, allow pc speaker
be added using "-device isa-pcspk".

Signed-off-by: Gerd Hoffmann <[email protected]>
Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Message-id: [email protected]
  • Loading branch information
kraxel committed Jan 24, 2019
1 parent f6b06fc commit bd56d37
Showing 1 changed file with 15 additions and 20 deletions.
35 changes: 15 additions & 20 deletions hw/audio/pcspk.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ typedef struct {
} PCSpkState;

static const char *s_spk = "pcspk";
static PCSpkState *pcspk_state;

static inline void generate_samples(PCSpkState *s)
{
Expand Down Expand Up @@ -111,22 +110,6 @@ static void pcspk_callback(void *opaque, int free)
}
}

static int pcspk_audio_init(ISABus *bus)
{
PCSpkState *s = pcspk_state;
struct audsettings as = {PCSPK_SAMPLE_RATE, 1, AUD_FMT_U8, 0};

AUD_register_card(s_spk, &s->card);

s->voice = AUD_open_out(&s->card, s->voice, s_spk, s, pcspk_callback, &as);
if (!s->voice) {
AUD_log(s_spk, "Could not open voice\n");
return -1;
}

return 0;
}

static uint64_t pcspk_io_read(void *opaque, hwaddr addr,
unsigned size)
{
Expand Down Expand Up @@ -179,12 +162,20 @@ static void pcspk_initfn(Object *obj)

static void pcspk_realizefn(DeviceState *dev, Error **errp)
{
struct audsettings as = {PCSPK_SAMPLE_RATE, 1, AUD_FMT_U8, 0};
ISADevice *isadev = ISA_DEVICE(dev);
PCSpkState *s = PC_SPEAKER(dev);

isa_register_ioport(isadev, &s->ioport, s->iobase);

pcspk_state = s;
AUD_register_card(s_spk, &s->card);

s->voice = AUD_open_out(&s->card, s->voice, s_spk, s, pcspk_callback, &as);
if (!s->voice) {
error_setg(errp, "Initializing audio voice failed");
AUD_remove_card(&s->card);
return;
}
}

static bool migrate_needed(void *opaque)
Expand Down Expand Up @@ -221,8 +212,6 @@ static void pcspk_class_initfn(ObjectClass *klass, void *data)
set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
dc->vmsd = &vmstate_spk;
dc->props = pcspk_properties;
/* Reason: realize sets global pcspk_state */
dc->user_creatable = false;
}

static const TypeInfo pcspk_info = {
Expand All @@ -233,6 +222,12 @@ static const TypeInfo pcspk_info = {
.class_init = pcspk_class_initfn,
};

static int pcspk_audio_init(ISABus *bus)
{
isa_create_simple(bus, TYPE_PC_SPEAKER);
return 0;
}

static void pcspk_register(void)
{
type_register_static(&pcspk_info);
Expand Down

0 comments on commit bd56d37

Please sign in to comment.