audio: remove QEMUSoundCard

There is no clear need for this extra intermediary structure between
the audio backend and its user.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
Marc-André Lureau 2025-10-21 17:07:43 +04:00
parent 7d75c12ad1
commit 9628ad8a6e
27 changed files with 131 additions and 162 deletions

View file

@ -1620,7 +1620,6 @@ static void audio_be_init(Object *obj)
QLIST_INIT(&s->hw_head_out);
QLIST_INIT(&s->hw_head_in);
QLIST_INIT(&s->cap_head);
QLIST_INIT(&s->card_head);
s->ts = timer_new_ns(QEMU_CLOCK_VIRTUAL, audio_timer, s);
s->vmse = qemu_add_vm_change_state_handler(audio_vm_change_state_handler, s);
@ -1812,28 +1811,20 @@ AudioBackend *audio_get_default_audio_be(Error **errp)
return default_audio_be;
}
bool AUD_register_card (const char *name, QEMUSoundCard *card, Error **errp)
bool AUD_backend_check(AudioBackend **be, Error **errp)
{
if (!card->be) {
card->be = audio_get_default_audio_be(errp);
if (!card->be) {
assert(be != NULL);
if (!*be) {
*be = audio_get_default_audio_be(errp);
if (!*be) {
return false;
}
}
card->name = g_strdup (name);
memset (&card->entries, 0, sizeof (card->entries));
QLIST_INSERT_HEAD(&card->be->card_head, card, entries);
return true;
}
void AUD_remove_card (QEMUSoundCard *card)
{
QLIST_REMOVE (card, entries);
g_free (card->name);
}
static struct audio_pcm_ops capture_pcm_ops;
CaptureVoiceOut *AUD_add_capture(
@ -2232,11 +2223,11 @@ AudioBackend *audio_be_by_name(const char *name, Error **errp)
}
}
const char *audio_get_id(QEMUSoundCard *card)
const char *audio_be_get_id(AudioBackend *be)
{
if (card->be) {
assert(card->be->dev);
return card->be->dev->id;
if (be) {
assert(be->dev);
return be->dev->id;
} else {
return "";
}

View file

@ -69,18 +69,13 @@ struct AudioBackendClass {
};
typedef struct AudioBackend AudioBackend;
typedef struct QEMUSoundCard {
char *name;
AudioBackend *be;
QLIST_ENTRY (QEMUSoundCard) entries;
} QEMUSoundCard;
typedef struct QEMUAudioTimeStamp {
uint64_t old_ts;
} QEMUAudioTimeStamp;
bool AUD_register_card (const char *name, QEMUSoundCard *card, Error **errp);
void AUD_remove_card (QEMUSoundCard *card);
bool AUD_backend_check(AudioBackend **be, Error **errp);
CaptureVoiceOut *AUD_add_capture(
AudioBackend *s,
struct audsettings *as,
@ -90,7 +85,7 @@ CaptureVoiceOut *AUD_add_capture(
void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque);
SWVoiceOut *AUD_open_out (
QEMUSoundCard *card,
AudioBackend *be,
SWVoiceOut *sw,
const char *name,
void *callback_opaque,
@ -98,7 +93,7 @@ SWVoiceOut *AUD_open_out (
struct audsettings *settings
);
void AUD_close_out (QEMUSoundCard *card, SWVoiceOut *sw);
void AUD_close_out (AudioBackend *be, SWVoiceOut *sw);
size_t AUD_write (SWVoiceOut *sw, void *pcm_buf, size_t size);
int AUD_get_buffer_size_out (SWVoiceOut *sw);
void AUD_set_active_out (SWVoiceOut *sw, int on);
@ -131,8 +126,8 @@ AUD_set_volume_in_lr(SWVoiceIn *sw, bool mut, uint8_t lvol, uint8_t rvol) {
});
}
SWVoiceIn *AUD_open_in (
QEMUSoundCard *card,
SWVoiceIn *AUD_open_in(
AudioBackend *be,
SWVoiceIn *sw,
const char *name,
void *callback_opaque,
@ -140,7 +135,7 @@ SWVoiceIn *AUD_open_in (
struct audsettings *settings
);
void AUD_close_in (QEMUSoundCard *card, SWVoiceIn *sw);
void AUD_close_in(AudioBackend *be, SWVoiceIn *sw);
size_t AUD_read (SWVoiceIn *sw, void *pcm_buf, size_t size);
void AUD_set_active_in (SWVoiceIn *sw, int on);
int AUD_is_active_in (SWVoiceIn *sw);
@ -166,7 +161,7 @@ void audio_help(void);
AudioBackend *audio_be_by_name(const char *name, Error **errp);
AudioBackend *audio_get_default_audio_be(Error **errp);
const char *audio_get_id(QEMUSoundCard *card);
const char *audio_be_get_id(AudioBackend *be);
#define DEFINE_AUDIO_PROPERTIES(_s, _f) \
DEFINE_PROP_AUDIODEV("audiodev", _s, _f)

View file

@ -111,7 +111,6 @@ typedef struct HWVoiceIn {
} HWVoiceIn;
struct SWVoiceOut {
QEMUSoundCard *card;
AudioBackend *s;
struct audio_pcm_info info;
t_sample *conv;
@ -128,7 +127,6 @@ struct SWVoiceOut {
};
struct SWVoiceIn {
QEMUSoundCard *card;
AudioBackend *s;
int active;
struct audio_pcm_info info;
@ -248,7 +246,6 @@ typedef struct AudioBackend {
void *drv_opaque;
QEMUTimer *ts;
QLIST_HEAD (card_listhead, QEMUSoundCard) card_head;
QLIST_HEAD (hw_in_listhead, HWVoiceIn) hw_head_in;
QLIST_HEAD (hw_out_listhead, HWVoiceOut) hw_head_out;
QLIST_HEAD (cap_listhead, CaptureVoiceOut) cap_head;

View file

@ -473,11 +473,11 @@ static void glue (audio_close_, TYPE) (SW *sw)
g_free (sw);
}
void glue (AUD_close_, TYPE) (QEMUSoundCard *card, SW *sw)
void glue(AUD_close_, TYPE)(AudioBackend *be, SW *sw)
{
if (sw) {
if (audio_bug(__func__, !card)) {
dolog ("card=%p\n", card);
if (audio_bug(__func__, !be)) {
dolog("backend=%p\n", be);
return;
}
@ -486,7 +486,7 @@ void glue (AUD_close_, TYPE) (QEMUSoundCard *card, SW *sw)
}
SW *glue (AUD_open_, TYPE) (
QEMUSoundCard *card,
AudioBackend *be,
SW *sw,
const char *name,
void *callback_opaque ,
@ -494,16 +494,15 @@ SW *glue (AUD_open_, TYPE) (
struct audsettings *as
)
{
AudioBackend *s;
AudioBackend *s = be;
AudiodevPerDirectionOptions *pdo;
if (audio_bug(__func__, !card || !name || !callback_fn || !as)) {
dolog ("card=%p name=%p callback_fn=%p as=%p\n",
card, name, callback_fn, as);
if (audio_bug(__func__, !be || !name || !callback_fn || !as)) {
dolog("backend=%p name=%p callback_fn=%p as=%p\n",
be, name, callback_fn, as);
goto fail;
}
s = card->be;
pdo = glue(audio_get_pdo_, TYPE)(s->dev);
ldebug ("open %s, freq %d, nchannels %d, fmt %d\n",
@ -524,7 +523,7 @@ SW *glue (AUD_open_, TYPE) (
}
if (!pdo->fixed_settings && sw) {
glue (AUD_close_, TYPE) (card, sw);
glue(AUD_close_, TYPE)(be, sw);
sw = NULL;
}
@ -548,7 +547,6 @@ SW *glue (AUD_open_, TYPE) (
}
}
sw->card = card;
sw->vol = nominal_volume;
sw->callback.fn = callback_fn;
sw->callback.opaque = callback_opaque;
@ -562,7 +560,7 @@ SW *glue (AUD_open_, TYPE) (
return sw;
fail:
glue (AUD_close_, TYPE) (card, sw);
glue(AUD_close_, TYPE)(be, sw);
return NULL;
}

View file

@ -120,7 +120,7 @@ typedef struct AC97BusMasterRegs {
struct AC97LinkState {
PCIDevice dev;
QEMUSoundCard card;
AudioBackend *audio_be;
uint32_t glob_cnt;
uint32_t glob_sta;
uint32_t cas;
@ -320,7 +320,7 @@ static void open_voice(AC97LinkState *s, int index, int freq)
switch (index) {
case PI_INDEX:
s->voice_pi = AUD_open_in(
&s->card,
s->audio_be,
s->voice_pi,
"ac97.pi",
s,
@ -331,7 +331,7 @@ static void open_voice(AC97LinkState *s, int index, int freq)
case PO_INDEX:
s->voice_po = AUD_open_out(
&s->card,
s->audio_be,
s->voice_po,
"ac97.po",
s,
@ -342,7 +342,7 @@ static void open_voice(AC97LinkState *s, int index, int freq)
case MC_INDEX:
s->voice_mc = AUD_open_in(
&s->card,
s->audio_be,
s->voice_mc,
"ac97.mc",
s,
@ -355,17 +355,17 @@ static void open_voice(AC97LinkState *s, int index, int freq)
s->invalid_freq[index] = freq;
switch (index) {
case PI_INDEX:
AUD_close_in(&s->card, s->voice_pi);
AUD_close_in(s->audio_be, s->voice_pi);
s->voice_pi = NULL;
break;
case PO_INDEX:
AUD_close_out(&s->card, s->voice_po);
AUD_close_out(s->audio_be, s->voice_po);
s->voice_po = NULL;
break;
case MC_INDEX:
AUD_close_in(&s->card, s->voice_mc);
AUD_close_in(s->audio_be, s->voice_mc);
s->voice_mc = NULL;
break;
}
@ -1275,7 +1275,7 @@ static void ac97_realize(PCIDevice *dev, Error **errp)
AC97LinkState *s = AC97(dev);
uint8_t *c = s->dev.config;
if (!AUD_register_card ("ac97", &s->card, errp)) {
if (!AUD_backend_check (&s->audio_be, errp)) {
return;
}
@ -1320,14 +1320,13 @@ static void ac97_exit(PCIDevice *dev)
{
AC97LinkState *s = AC97(dev);
AUD_close_in(&s->card, s->voice_pi);
AUD_close_out(&s->card, s->voice_po);
AUD_close_in(&s->card, s->voice_mc);
AUD_remove_card(&s->card);
AUD_close_in(s->audio_be, s->voice_pi);
AUD_close_out(s->audio_be, s->voice_po);
AUD_close_in(s->audio_be, s->voice_mc);
}
static const Property ac97_properties[] = {
DEFINE_AUDIO_PROPERTIES(AC97LinkState, card),
DEFINE_AUDIO_PROPERTIES(AC97LinkState, audio_be),
};
static void ac97_class_init(ObjectClass *klass, const void *data)

View file

@ -57,7 +57,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(AdlibState, ADLIB)
struct AdlibState {
ISADevice parent_obj;
QEMUSoundCard card;
AudioBackend *audio_be;
uint32_t freq;
uint32_t port;
int ticking[2];
@ -240,7 +240,6 @@ static void Adlib_fini (AdlibState *s)
s->active = 0;
s->enabled = 0;
AUD_remove_card (&s->card);
}
static MemoryRegionPortio adlib_portio_list[] = {
@ -255,7 +254,7 @@ static void adlib_realizefn (DeviceState *dev, Error **errp)
AdlibState *s = ADLIB(dev);
struct audsettings as;
if (!AUD_register_card ("adlib", &s->card, errp)) {
if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
@ -275,7 +274,7 @@ static void adlib_realizefn (DeviceState *dev, Error **errp)
as.endianness = HOST_BIG_ENDIAN;
s->voice = AUD_open_out (
&s->card,
s->audio_be,
s->voice,
"adlib",
s,
@ -298,7 +297,7 @@ static void adlib_realizefn (DeviceState *dev, Error **errp)
}
static const Property adlib_properties[] = {
DEFINE_AUDIO_PROPERTIES(AdlibState, card),
DEFINE_AUDIO_PROPERTIES(AdlibState, audio_be),
DEFINE_PROP_UINT32 ("iobase", AdlibState, port, 0x220),
DEFINE_PROP_UINT32 ("freq", AdlibState, freq, 44100),
};

View file

@ -634,8 +634,6 @@ static void asc_unrealize(DeviceState *dev)
g_free(s->mixbuf);
g_free(s->silentbuf);
AUD_remove_card(&s->card);
}
static void asc_realize(DeviceState *dev, Error **errp)
@ -643,7 +641,7 @@ static void asc_realize(DeviceState *dev, Error **errp)
ASCState *s = ASC(dev);
struct audsettings as;
if (!AUD_register_card("Apple Sound Chip", &s->card, errp)) {
if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
@ -652,10 +650,9 @@ static void asc_realize(DeviceState *dev, Error **errp)
as.fmt = AUDIO_FORMAT_U8;
as.endianness = HOST_BIG_ENDIAN;
s->voice = AUD_open_out(&s->card, s->voice, "asc.out", s, asc_out_cb,
s->voice = AUD_open_out(s->audio_be, s->voice, "asc.out", s, asc_out_cb,
&as);
if (!s->voice) {
AUD_remove_card(&s->card);
error_setg(errp, "Initializing audio stream failed");
return;
}
@ -702,7 +699,7 @@ static void asc_init(Object *obj)
}
static const Property asc_properties[] = {
DEFINE_AUDIO_PROPERTIES(ASCState, card),
DEFINE_AUDIO_PROPERTIES(ASCState, audio_be),
DEFINE_PROP_UINT8("asctype", ASCState, type, ASC_TYPE_ASC),
};

View file

@ -69,7 +69,7 @@ DECLARE_INSTANCE_CHECKER(CSState, CS4231A,
struct CSState {
ISADevice dev;
QEMUSoundCard card;
AudioBackend *audio_be;
MemoryRegion ioports;
qemu_irq pic;
uint32_t regs[CS_REGS];
@ -328,7 +328,7 @@ static void cs_reset_voices (CSState *s, uint32_t val)
}
s->voice = AUD_open_out (
&s->card,
s->audio_be,
s->voice,
"cs4231a",
s,
@ -678,7 +678,7 @@ static void cs4231a_realizefn (DeviceState *dev, Error **errp)
return;
}
if (!AUD_register_card ("cs4231a", &s->card, errp)) {
if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
@ -694,7 +694,7 @@ static void cs4231a_realizefn (DeviceState *dev, Error **errp)
}
static const Property cs4231a_properties[] = {
DEFINE_AUDIO_PROPERTIES(CSState, card),
DEFINE_AUDIO_PROPERTIES(CSState, audio_be),
DEFINE_PROP_UINT32 ("iobase", CSState, port, 0x534),
DEFINE_PROP_UINT32 ("irq", CSState, irq, 9),
DEFINE_PROP_UINT32 ("dma", CSState, dma, 3),

View file

@ -258,7 +258,7 @@ struct chan {
struct ES1370State {
PCIDevice dev;
QEMUSoundCard card;
AudioBackend *audio_be;
MemoryRegion io;
struct chan chan[NB_CHANNELS];
SWVoiceOut *dac_voice[2];
@ -330,10 +330,10 @@ static void es1370_reset (ES1370State *s)
d->scount = 0;
d->leftover = 0;
if (i == ADC_CHANNEL) {
AUD_close_in (&s->card, s->adc_voice);
AUD_close_in(s->audio_be, s->adc_voice);
s->adc_voice = NULL;
} else {
AUD_close_out (&s->card, s->dac_voice[i]);
AUD_close_out(s->audio_be, s->dac_voice[i]);
s->dac_voice[i] = NULL;
}
}
@ -412,7 +412,7 @@ static void es1370_update_voices (ES1370State *s, uint32_t ctl, uint32_t sctl)
if (i == ADC_CHANNEL) {
s->adc_voice =
AUD_open_in (
&s->card,
s->audio_be,
s->adc_voice,
"es1370.adc",
s,
@ -422,7 +422,7 @@ static void es1370_update_voices (ES1370State *s, uint32_t ctl, uint32_t sctl)
} else {
s->dac_voice[i] =
AUD_open_out (
&s->card,
s->audio_be,
s->dac_voice[i],
i ? "es1370.dac2" : "es1370.dac1",
s,
@ -784,12 +784,12 @@ static int es1370_post_load (void *opaque, int version_id)
for (i = 0; i < NB_CHANNELS; ++i) {
if (i == ADC_CHANNEL) {
if (s->adc_voice) {
AUD_close_in (&s->card, s->adc_voice);
AUD_close_in(s->audio_be, s->adc_voice);
s->adc_voice = NULL;
}
} else {
if (s->dac_voice[i]) {
AUD_close_out (&s->card, s->dac_voice[i]);
AUD_close_out(s->audio_be, s->dac_voice[i]);
s->dac_voice[i] = NULL;
}
}
@ -833,7 +833,7 @@ static void es1370_realize(PCIDevice *dev, Error **errp)
ES1370State *s = ES1370(dev);
uint8_t *c = s->dev.config;
if (!AUD_register_card ("es1370", &s->card, errp)) {
if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
@ -861,15 +861,14 @@ static void es1370_exit(PCIDevice *dev)
int i;
for (i = 0; i < 2; ++i) {
AUD_close_out(&s->card, s->dac_voice[i]);
AUD_close_out(s->audio_be, s->dac_voice[i]);
}
AUD_close_in(&s->card, s->adc_voice);
AUD_remove_card(&s->card);
AUD_close_in(s->audio_be, s->adc_voice);
}
static const Property es1370_properties[] = {
DEFINE_AUDIO_PROPERTIES(ES1370State, card),
DEFINE_AUDIO_PROPERTIES(ES1370State, audio_be),
};
static void es1370_class_init(ObjectClass *klass, const void *data)

View file

@ -49,7 +49,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(GUSState, GUS)
struct GUSState {
ISADevice dev;
GUSEmuState emu;
QEMUSoundCard card;
AudioBackend *audio_be;
uint32_t freq;
uint32_t port;
int pos, left, shift, irqs;
@ -242,7 +242,7 @@ static void gus_realizefn (DeviceState *dev, Error **errp)
IsaDmaClass *k;
struct audsettings as;
if (!AUD_register_card ("gus", &s->card, errp)) {
if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
@ -258,7 +258,7 @@ static void gus_realizefn (DeviceState *dev, Error **errp)
as.endianness = HOST_BIG_ENDIAN;
s->voice = AUD_open_out (
&s->card,
s->audio_be,
NULL,
"gus",
s,
@ -267,7 +267,6 @@ static void gus_realizefn (DeviceState *dev, Error **errp)
);
if (!s->voice) {
AUD_remove_card (&s->card);
error_setg(errp, "No voice");
return;
}
@ -292,7 +291,7 @@ static void gus_realizefn (DeviceState *dev, Error **errp)
}
static const Property gus_properties[] = {
DEFINE_AUDIO_PROPERTIES(GUSState, card),
DEFINE_AUDIO_PROPERTIES(GUSState, audio_be),
DEFINE_PROP_UINT32 ("freq", GUSState, freq, 44100),
DEFINE_PROP_UINT32 ("iobase", GUSState, port, 0x240),
DEFINE_PROP_UINT32 ("irq", GUSState, emu.gusirq, 7),

View file

@ -178,7 +178,7 @@ struct HDAAudioState {
HDACodecDevice hda;
const char *name;
QEMUSoundCard card;
AudioBackend *audio_be;
const desc_codec *desc;
HDAAudioStream st[4];
bool running_compat[16];
@ -491,7 +491,7 @@ static void hda_audio_setup(HDAAudioStream *st)
} else {
cb = hda_audio_compat_output_cb;
}
st->voice.out = AUD_open_out(&st->state->card, st->voice.out,
st->voice.out = AUD_open_out(st->state->audio_be, st->voice.out,
st->node->name, st, cb, &st->as);
} else {
if (use_timer) {
@ -500,7 +500,7 @@ static void hda_audio_setup(HDAAudioStream *st)
} else {
cb = hda_audio_compat_input_cb;
}
st->voice.in = AUD_open_in(&st->state->card, st->voice.in,
st->voice.in = AUD_open_in(st->state->audio_be, st->voice.in,
st->node->name, st, cb, &st->as);
}
}
@ -696,7 +696,7 @@ static void hda_audio_init(HDACodecDevice *hda,
const desc_param *param;
uint32_t i, type;
if (!AUD_register_card("hda", &a->card, errp)) {
if (!AUD_backend_check(&a->audio_be, errp)) {
return;
}
@ -754,12 +754,11 @@ static void hda_audio_exit(HDACodecDevice *hda)
}
timer_free(st->buft);
if (st->output) {
AUD_close_out(&a->card, st->voice.out);
AUD_close_out(a->audio_be, st->voice.out);
} else {
AUD_close_in(&a->card, st->voice.in);
AUD_close_in(a->audio_be, st->voice.in);
}
}
AUD_remove_card(&a->card);
}
static int hda_audio_post_load(void *opaque, int version)
@ -858,7 +857,7 @@ static const VMStateDescription vmstate_hda_audio = {
};
static const Property hda_audio_properties[] = {
DEFINE_AUDIO_PROPERTIES(HDAAudioState, card),
DEFINE_AUDIO_PROPERTIES(HDAAudioState, audio_be),
DEFINE_PROP_UINT32("debug", HDAAudioState, debug, 0),
DEFINE_PROP_BOOL("mixer", HDAAudioState, mixer, true),
DEFINE_PROP_BOOL("use-timer", HDAAudioState, use_timer, true),

View file

@ -190,7 +190,7 @@ void lm4549_write(lm4549_state *s,
as.endianness = 0;
s->voice = AUD_open_out(
&s->card,
s->audio_be,
s->voice,
"lm4549.out",
s,
@ -260,7 +260,7 @@ static int lm4549_post_load(void *opaque, int version_id)
as.endianness = 0;
s->voice = AUD_open_out(
&s->card,
s->audio_be,
s->voice,
"lm4549.out",
s,
@ -282,7 +282,7 @@ void lm4549_init(lm4549_state *s, lm4549_callback data_req_cb, void* opaque,
struct audsettings as;
/* Register an audio card */
if (!AUD_register_card("lm4549", &s->card, errp)) {
if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
@ -300,7 +300,7 @@ void lm4549_init(lm4549_state *s, lm4549_callback data_req_cb, void* opaque,
as.endianness = 0;
s->voice = AUD_open_out(
&s->card,
s->audio_be,
s->voice,
"lm4549.out",
s,

View file

@ -21,7 +21,7 @@ typedef void (*lm4549_callback)(void *opaque);
typedef struct {
QEMUSoundCard card;
AudioBackend *audio_be;
SWVoiceOut *voice;
uint32_t voice_is_active;

View file

@ -49,7 +49,7 @@ struct PCSpkState {
MemoryRegion ioport;
uint32_t iobase;
uint8_t sample_buf[PCSPK_BUF_LEN];
QEMUSoundCard card;
AudioBackend *audio_be;
SWVoiceOut *voice;
PITCommonState *pit;
unsigned int pit_count;
@ -123,7 +123,7 @@ static int pcspk_audio_init(PCSpkState *s)
return 0;
}
s->voice = AUD_open_out(&s->card, s->voice, s_spk, s, pcspk_callback, &as);
s->voice = AUD_open_out(s->audio_be, s->voice, s_spk, s, pcspk_callback, &as);
if (!s->voice) {
error_report("pcspk: Could not open voice");
return -1;
@ -196,8 +196,9 @@ static void pcspk_realizefn(DeviceState *dev, Error **errp)
isa_register_ioport(isadev, &s->ioport, s->iobase);
if (s->card.be && AUD_register_card(s_spk, &s->card, errp)) {
if (s->audio_be && AUD_backend_check(&s->audio_be, errp)) {
pcspk_audio_init(s);
return;
}
}
@ -221,7 +222,7 @@ static const VMStateDescription vmstate_spk = {
};
static const Property pcspk_properties[] = {
DEFINE_AUDIO_PROPERTIES(PCSpkState, card),
DEFINE_AUDIO_PROPERTIES(PCSpkState, audio_be),
DEFINE_PROP_UINT32("iobase", PCSpkState, iobase, 0x61),
DEFINE_PROP_BOOL("migrate", PCSpkState, migrate, true),
DEFINE_PROP_LINK("pit", PCSpkState, pit, TYPE_PIT_COMMON, PITCommonState *),

View file

@ -626,7 +626,7 @@ static const VMStateDescription vmstate_pl041 = {
};
static const Property pl041_device_properties[] = {
DEFINE_AUDIO_PROPERTIES(PL041State, codec.card),
DEFINE_AUDIO_PROPERTIES(PL041State, codec.audio_be),
/* Non-compact FIFO depth property */
DEFINE_PROP_UINT32("nc_fifo_depth", PL041State, fifo_depth,
DEFAULT_FIFO_DEPTH),

View file

@ -54,7 +54,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(SB16State, SB16)
struct SB16State {
ISADevice parent_obj;
QEMUSoundCard card;
AudioBackend *audio_be;
qemu_irq pic;
uint32_t irq;
uint32_t dma;
@ -216,7 +216,7 @@ static void continue_dma8 (SB16State *s)
as.endianness = 0;
s->voice = AUD_open_out (
&s->card,
s->audio_be,
s->voice,
"sb16",
s,
@ -379,7 +379,7 @@ static void dma_cmd (SB16State *s, uint8_t cmd, uint8_t d0, int dma_len)
as.endianness = 0;
s->voice = AUD_open_out (
&s->card,
s->audio_be,
s->voice,
"sb16",
s,
@ -880,7 +880,7 @@ static void legacy_reset (SB16State *s)
as.endianness = 0;
s->voice = AUD_open_out (
&s->card,
s->audio_be,
s->voice,
"sb16",
s,
@ -1287,7 +1287,7 @@ static int sb16_post_load (void *opaque, int version_id)
SB16State *s = opaque;
if (s->voice) {
AUD_close_out (&s->card, s->voice);
AUD_close_out(s->audio_be, s->voice);
s->voice = NULL;
}
@ -1303,7 +1303,7 @@ static int sb16_post_load (void *opaque, int version_id)
as.endianness = 0;
s->voice = AUD_open_out (
&s->card,
s->audio_be,
s->voice,
"sb16",
s,
@ -1401,7 +1401,7 @@ static void sb16_realizefn (DeviceState *dev, Error **errp)
SB16State *s = SB16 (dev);
IsaDmaClass *k;
if (!AUD_register_card ("sb16", &s->card, errp)) {
if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
@ -1440,7 +1440,7 @@ static void sb16_realizefn (DeviceState *dev, Error **errp)
}
static const Property sb16_properties[] = {
DEFINE_AUDIO_PROPERTIES(SB16State, card),
DEFINE_AUDIO_PROPERTIES(SB16State, audio_be),
DEFINE_PROP_UINT32 ("version", SB16State, ver, 0x0405), /* 4.5 */
DEFINE_PROP_UINT32 ("iobase", SB16State, port, 0x220),
DEFINE_PROP_UINT32 ("irq", SB16State, irq, 5),

View file

@ -239,7 +239,7 @@ static void open_voice_out(ViaAC97State *s)
.fmt = s->aur.type & BIT(5) ? AUDIO_FORMAT_S16 : AUDIO_FORMAT_S8,
.endianness = 0,
};
s->vo = AUD_open_out(&s->card, s->vo, "via-ac97.out", s, out_cb, &as);
s->vo = AUD_open_out(s->audio_be, s->vo, "via-ac97.out", s, out_cb, &as);
}
static uint64_t sgd_read(void *opaque, hwaddr addr, unsigned size)
@ -426,7 +426,7 @@ static void via_ac97_realize(PCIDevice *pci_dev, Error **errp)
ViaAC97State *s = VIA_AC97(pci_dev);
Object *o = OBJECT(s);
if (!AUD_register_card ("via-ac97", &s->card, errp)) {
if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
@ -455,12 +455,11 @@ static void via_ac97_exit(PCIDevice *dev)
{
ViaAC97State *s = VIA_AC97(dev);
AUD_close_out(&s->card, s->vo);
AUD_remove_card(&s->card);
AUD_close_out(s->audio_be, s->vo);
}
static const Property via_ac97_properties[] = {
DEFINE_AUDIO_PROPERTIES(ViaAC97State, card),
DEFINE_AUDIO_PROPERTIES(ViaAC97State, audio_be),
};
static void via_ac97_class_init(ObjectClass *klass, const void *data)

View file

@ -78,7 +78,7 @@ static const VMStateDescription vmstate_virtio_snd = {
};
static const Property virtio_snd_properties[] = {
DEFINE_AUDIO_PROPERTIES(VirtIOSound, card),
DEFINE_AUDIO_PROPERTIES(VirtIOSound, audio_be),
DEFINE_PROP_UINT32("jacks", VirtIOSound, snd_conf.jacks,
VIRTIO_SOUND_JACK_DEFAULT),
DEFINE_PROP_UINT32("streams", VirtIOSound, snd_conf.streams,
@ -391,10 +391,10 @@ static void virtio_snd_pcm_close(VirtIOSoundPCMStream *stream)
if (stream) {
virtio_snd_pcm_flush(stream);
if (stream->info.direction == VIRTIO_SND_D_OUTPUT) {
AUD_close_out(&stream->pcm->snd->card, stream->voice.out);
AUD_close_out(stream->pcm->snd->audio_be, stream->voice.out);
stream->voice.out = NULL;
} else if (stream->info.direction == VIRTIO_SND_D_INPUT) {
AUD_close_in(&stream->pcm->snd->card, stream->voice.in);
AUD_close_in(stream->pcm->snd->audio_be, stream->voice.in);
stream->voice.in = NULL;
}
}
@ -457,7 +457,7 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s, uint32_t stream_id)
stream->as = as;
if (stream->info.direction == VIRTIO_SND_D_OUTPUT) {
stream->voice.out = AUD_open_out(&s->card,
stream->voice.out = AUD_open_out(s->audio_be,
stream->voice.out,
"virtio-sound.out",
stream,
@ -465,7 +465,7 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s, uint32_t stream_id)
&as);
AUD_set_volume_out_lr(stream->voice.out, 0, 255, 255);
} else {
stream->voice.in = AUD_open_in(&s->card,
stream->voice.in = AUD_open_in(s->audio_be,
stream->voice.in,
"virtio-sound.in",
stream,
@ -1053,7 +1053,7 @@ static void virtio_snd_realize(DeviceState *dev, Error **errp)
return;
}
if (!AUD_register_card("virtio-sound", &vsnd->card, errp)) {
if (!AUD_backend_check(&vsnd->audio_be, errp)) {
return;
}
@ -1330,7 +1330,6 @@ static void virtio_snd_unrealize(DeviceState *dev)
g_free(vsnd->pcm);
vsnd->pcm = NULL;
}
AUD_remove_card(&vsnd->card);
qemu_mutex_destroy(&vsnd->cmdq_mutex);
virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_CONTROL]);
virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_EVENT]);

View file

@ -34,7 +34,7 @@ struct WM8750State {
uint8_t i2c_data[2];
int i2c_len;
QEMUSoundCard card;
AudioBackend *audio_be;
SWVoiceIn *adc_voice[IN_PORT_N];
SWVoiceOut *dac_voice[OUT_PORT_N];
int enable;
@ -188,12 +188,12 @@ static void wm8750_set_format(WM8750State *s)
for (i = 0; i < IN_PORT_N; i ++)
if (s->adc_voice[i]) {
AUD_close_in(&s->card, s->adc_voice[i]);
AUD_close_in(s->audio_be, s->adc_voice[i]);
s->adc_voice[i] = NULL;
}
for (i = 0; i < OUT_PORT_N; i ++)
if (s->dac_voice[i]) {
AUD_close_out(&s->card, s->dac_voice[i]);
AUD_close_out(s->audio_be, s->dac_voice[i]);
s->dac_voice[i] = NULL;
}
@ -206,11 +206,11 @@ static void wm8750_set_format(WM8750State *s)
in_fmt.freq = s->adc_hz;
in_fmt.fmt = AUDIO_FORMAT_S16;
s->adc_voice[0] = AUD_open_in(&s->card, s->adc_voice[0],
s->adc_voice[0] = AUD_open_in(s->audio_be, s->adc_voice[0],
CODEC ".input1", s, wm8750_audio_in_cb, &in_fmt);
s->adc_voice[1] = AUD_open_in(&s->card, s->adc_voice[1],
s->adc_voice[1] = AUD_open_in(s->audio_be, s->adc_voice[1],
CODEC ".input2", s, wm8750_audio_in_cb, &in_fmt);
s->adc_voice[2] = AUD_open_in(&s->card, s->adc_voice[2],
s->adc_voice[2] = AUD_open_in(s->audio_be, s->adc_voice[2],
CODEC ".input3", s, wm8750_audio_in_cb, &in_fmt);
/* Setup output */
@ -219,12 +219,12 @@ static void wm8750_set_format(WM8750State *s)
out_fmt.freq = s->dac_hz;
out_fmt.fmt = AUDIO_FORMAT_S16;
s->dac_voice[0] = AUD_open_out(&s->card, s->dac_voice[0],
s->dac_voice[0] = AUD_open_out(s->audio_be, s->dac_voice[0],
CODEC ".speaker", s, wm8750_audio_out_cb, &out_fmt);
s->dac_voice[1] = AUD_open_out(&s->card, s->dac_voice[1],
s->dac_voice[1] = AUD_open_out(s->audio_be, s->dac_voice[1],
CODEC ".headphone", s, wm8750_audio_out_cb, &out_fmt);
/* MONOMIX is also in stereo for simplicity */
s->dac_voice[2] = AUD_open_out(&s->card, s->dac_voice[2],
s->dac_voice[2] = AUD_open_out(s->audio_be, s->dac_voice[2],
CODEC ".monomix", s, wm8750_audio_out_cb, &out_fmt);
/* no sense emulating OUT3 which is a mix of other outputs */
@ -624,7 +624,7 @@ static void wm8750_realize(DeviceState *dev, Error **errp)
{
WM8750State *s = WM8750(dev);
if (!AUD_register_card(CODEC, &s->card, errp)) {
if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
@ -637,7 +637,6 @@ static void wm8750_fini(I2CSlave *i2c)
WM8750State *s = WM8750(i2c);
wm8750_reset(I2C_SLAVE(s));
AUD_remove_card(&s->card);
g_free(s);
}
#endif
@ -707,7 +706,7 @@ void wm8750_set_bclk_in(void *opaque, int new_hz)
}
static const Property wm8750_properties[] = {
DEFINE_AUDIO_PROPERTIES(WM8750State, card),
DEFINE_AUDIO_PROPERTIES(WM8750State, audio_be),
};
static void wm8750_class_init(ObjectClass *klass, const void *data)

View file

@ -487,18 +487,17 @@ static void get_audiodev(Object *obj, Visitor *v, const char* name,
void *opaque, Error **errp)
{
const Property *prop = opaque;
QEMUSoundCard *card = object_field_prop_ptr(obj, prop);
char *p = g_strdup(audio_get_id(card));
AudioBackend **be = object_field_prop_ptr(obj, prop);
g_autofree char *id = g_strdup(audio_be_get_id(*be));
visit_type_str(v, name, &p, errp);
g_free(p);
visit_type_str(v, name, (char **)&id, errp);
}
static void set_audiodev(Object *obj, Visitor *v, const char* name,
void *opaque, Error **errp)
{
const Property *prop = opaque;
QEMUSoundCard *card = object_field_prop_ptr(obj, prop);
AudioBackend **be = object_field_prop_ptr(obj, prop);
AudioBackend *state;
g_autofree char *str = NULL;
@ -508,7 +507,7 @@ static void set_audiodev(Object *obj, Visitor *v, const char* name,
state = audio_be_by_name(str, errp);
if (state) {
card->be = state;
*be = state;
}
}

View file

@ -1306,7 +1306,7 @@ static void xlnx_dp_realize(DeviceState *dev, Error **errp)
DisplaySurface *surface;
struct audsettings as;
if (!AUD_register_card("xlnx_dp.audio", &s->aud_card, errp)) {
if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
@ -1328,7 +1328,7 @@ static void xlnx_dp_realize(DeviceState *dev, Error **errp)
as.fmt = AUDIO_FORMAT_S16;
as.endianness = 0;
s->amixer_output_stream = AUD_open_out(&s->aud_card,
s->amixer_output_stream = AUD_open_out(s->audio_be,
s->amixer_output_stream,
"xlnx_dp.audio.out",
s,
@ -1392,7 +1392,7 @@ static void xlnx_dp_reset(DeviceState *dev)
}
static const Property xlnx_dp_device_properties[] = {
DEFINE_AUDIO_PROPERTIES(XlnxDPState, aud_card),
DEFINE_AUDIO_PROPERTIES(XlnxDPState, audio_be),
};
static void xlnx_dp_class_init(ObjectClass *oc, const void *data)

View file

@ -635,7 +635,7 @@ static uint8_t *streambuf_get(struct streambuf *buf, size_t *len)
struct USBAudioState {
/* qemu interfaces */
USBDevice dev;
QEMUSoundCard card;
AudioBackend *audio_be;
/* state */
struct {
@ -931,8 +931,7 @@ static void usb_audio_unrealize(USBDevice *dev)
}
usb_audio_set_output_altset(s, ALTSET_OFF);
AUD_close_out(&s->card, s->out.voice);
AUD_remove_card(&s->card);
AUD_close_out(s->audio_be, s->out.voice);
streambuf_fini(&s->out.buf);
}
@ -942,7 +941,7 @@ static void usb_audio_realize(USBDevice *dev, Error **errp)
USBAudioState *s = USB_AUDIO(dev);
int i;
if (!AUD_register_card(TYPE_USB_AUDIO, &s->card, errp)) {
if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
@ -979,7 +978,7 @@ static void usb_audio_reinit(USBDevice *dev, unsigned channels)
s->out.as.endianness = 0;
streambuf_init(&s->out.buf, s->buffer, s->out.channels);
s->out.voice = AUD_open_out(&s->card, s->out.voice, TYPE_USB_AUDIO,
s->out.voice = AUD_open_out(s->audio_be, s->out.voice, TYPE_USB_AUDIO,
s, output_callback, &s->out.as);
AUD_set_volume_out(s->out.voice, &s->out.vol);
AUD_set_active_out(s->out.voice, 0);
@ -991,7 +990,7 @@ static const VMStateDescription vmstate_usb_audio = {
};
static const Property usb_audio_properties[] = {
DEFINE_AUDIO_PROPERTIES(USBAudioState, card),
DEFINE_AUDIO_PROPERTIES(USBAudioState, audio_be),
DEFINE_PROP_UINT32("debug", USBAudioState, debug, 0),
DEFINE_PROP_UINT32("buffer", USBAudioState, buffer_user, 0),
DEFINE_PROP_BOOL("multi", USBAudioState, multi, false),

View file

@ -61,7 +61,7 @@ struct ASCState {
MemoryRegion mem_regs;
MemoryRegion mem_extregs;
QEMUSoundCard card;
AudioBackend *audio_be;
SWVoiceOut *voice;
uint8_t *mixbuf;
int samples;

View file

@ -216,7 +216,7 @@ struct VirtIOSound {
VirtQueue *queues[VIRTIO_SND_VQ_MAX];
uint64_t features;
VirtIOSoundPCM *pcm;
QEMUSoundCard card;
AudioBackend *audio_be;
VMChangeStateEntry *vmstate;
virtio_snd_config snd_conf;
QemuMutex cmdq_mutex;

View file

@ -84,7 +84,7 @@ struct XlnxDPState {
struct PixmanPlane v_plane;
struct PixmanPlane bout_plane;
QEMUSoundCard aud_card;
AudioBackend *audio_be;
SWVoiceOut *amixer_output_stream;
int16_t audio_buffer_0[AUD_CHBUF_MAX_DEPTH];
int16_t audio_buffer_1[AUD_CHBUF_MAX_DEPTH];

View file

@ -24,7 +24,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(ViaAC97State, VIA_AC97);
struct ViaAC97State {
PCIDevice dev;
QEMUSoundCard card;
AudioBackend *audio_be;
MemoryRegion sgd;
MemoryRegion fm;
MemoryRegion midi;

View file

@ -87,7 +87,7 @@ extern const PropertyInfo qdev_prop_virtio_gpu_output_list;
.set_default = true)
#define DEFINE_PROP_AUDIODEV(_n, _s, _f) \
DEFINE_PROP(_n, _s, _f, qdev_prop_audiodev, QEMUSoundCard)
DEFINE_PROP(_n, _s, _f, qdev_prop_audiodev, AudioBackend *)
#define DEFINE_PROP_UUID_NODEFAULT(_name, _state, _field) \
DEFINE_PROP(_name, _state, _field, qdev_prop_uuid, QemuUUID)