audio: fix pc speaker init

Get rid of the pcspk_state global, allow pc speaker
be added using "-device isa-pcspk".

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-id: 20190124110810.1040-1-kraxel@redhat.com
This commit is contained in:
Gerd Hoffmann 2019-01-24 12:08:10 +01:00
parent f6b06fccee
commit bd56d37884

View File

@ -57,7 +57,6 @@ typedef struct {
} PCSpkState;
static const char *s_spk = "pcspk";
static PCSpkState *pcspk_state;
static inline void generate_samples(PCSpkState *s)
{
@ -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)
{
@ -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)
@ -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 = {
@ -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);