mirror of https://github.com/proxmox/mirror_qemu
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.commaster
parent
f6b06fccee
commit
bd56d37884
|
@ -57,7 +57,6 @@ typedef struct {
|
||||||
} PCSpkState;
|
} PCSpkState;
|
||||||
|
|
||||||
static const char *s_spk = "pcspk";
|
static const char *s_spk = "pcspk";
|
||||||
static PCSpkState *pcspk_state;
|
|
||||||
|
|
||||||
static inline void generate_samples(PCSpkState *s)
|
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,
|
static uint64_t pcspk_io_read(void *opaque, hwaddr addr,
|
||||||
unsigned size)
|
unsigned size)
|
||||||
{
|
{
|
||||||
|
@ -179,12 +162,20 @@ static void pcspk_initfn(Object *obj)
|
||||||
|
|
||||||
static void pcspk_realizefn(DeviceState *dev, Error **errp)
|
static void pcspk_realizefn(DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
|
struct audsettings as = {PCSPK_SAMPLE_RATE, 1, AUD_FMT_U8, 0};
|
||||||
ISADevice *isadev = ISA_DEVICE(dev);
|
ISADevice *isadev = ISA_DEVICE(dev);
|
||||||
PCSpkState *s = PC_SPEAKER(dev);
|
PCSpkState *s = PC_SPEAKER(dev);
|
||||||
|
|
||||||
isa_register_ioport(isadev, &s->ioport, s->iobase);
|
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)
|
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);
|
set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
|
||||||
dc->vmsd = &vmstate_spk;
|
dc->vmsd = &vmstate_spk;
|
||||||
dc->props = pcspk_properties;
|
dc->props = pcspk_properties;
|
||||||
/* Reason: realize sets global pcspk_state */
|
|
||||||
dc->user_creatable = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo pcspk_info = {
|
static const TypeInfo pcspk_info = {
|
||||||
|
@ -233,6 +222,12 @@ static const TypeInfo pcspk_info = {
|
||||||
.class_init = pcspk_class_initfn,
|
.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)
|
static void pcspk_register(void)
|
||||||
{
|
{
|
||||||
type_register_static(&pcspk_info);
|
type_register_static(&pcspk_info);
|
||||||
|
|
Loading…
Reference in New Issue