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);
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(
}
}
-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 "";
}
};
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,
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,
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);
});
}
-SWVoiceIn *AUD_open_in (
- QEMUSoundCard *card,
+SWVoiceIn *AUD_open_in(
+ AudioBackend *be,
SWVoiceIn *sw,
const char *name,
void *callback_opaque,
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);
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)
} HWVoiceIn;
struct SWVoiceOut {
- QEMUSoundCard *card;
AudioBackend *s;
struct audio_pcm_info info;
t_sample *conv;
};
struct SWVoiceIn {
- QEMUSoundCard *card;
AudioBackend *s;
int active;
struct audio_pcm_info info;
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;
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;
}
}
SW *glue (AUD_open_, TYPE) (
- QEMUSoundCard *card,
+ AudioBackend *be,
SW *sw,
const char *name,
void *callback_opaque ,
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",
}
if (!pdo->fixed_settings && sw) {
- glue (AUD_close_, TYPE) (card, sw);
+ glue(AUD_close_, TYPE)(be, sw);
sw = NULL;
}
}
}
- sw->card = card;
sw->vol = nominal_volume;
sw->callback.fn = callback_fn;
sw->callback.opaque = callback_opaque;
return sw;
fail:
- glue (AUD_close_, TYPE) (card, sw);
+ glue(AUD_close_, TYPE)(be, sw);
return NULL;
}
struct AC97LinkState {
PCIDevice dev;
- QEMUSoundCard card;
+ AudioBackend *audio_be;
uint32_t glob_cnt;
uint32_t glob_sta;
uint32_t cas;
switch (index) {
case PI_INDEX:
s->voice_pi = AUD_open_in(
- &s->card,
+ s->audio_be,
s->voice_pi,
"ac97.pi",
s,
case PO_INDEX:
s->voice_po = AUD_open_out(
- &s->card,
+ s->audio_be,
s->voice_po,
"ac97.po",
s,
case MC_INDEX:
s->voice_mc = AUD_open_in(
- &s->card,
+ s->audio_be,
s->voice_mc,
"ac97.mc",
s,
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;
}
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;
}
{
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)
struct AdlibState {
ISADevice parent_obj;
- QEMUSoundCard card;
+ AudioBackend *audio_be;
uint32_t freq;
uint32_t port;
int ticking[2];
s->active = 0;
s->enabled = 0;
- AUD_remove_card (&s->card);
}
static MemoryRegionPortio adlib_portio_list[] = {
AdlibState *s = ADLIB(dev);
struct audsettings as;
- if (!AUD_register_card ("adlib", &s->card, errp)) {
+ if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
as.endianness = HOST_BIG_ENDIAN;
s->voice = AUD_open_out (
- &s->card,
+ s->audio_be,
s->voice,
"adlib",
s,
}
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),
};
g_free(s->mixbuf);
g_free(s->silentbuf);
-
- AUD_remove_card(&s->card);
}
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;
}
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;
}
}
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),
};
struct CSState {
ISADevice dev;
- QEMUSoundCard card;
+ AudioBackend *audio_be;
MemoryRegion ioports;
qemu_irq pic;
uint32_t regs[CS_REGS];
}
s->voice = AUD_open_out (
- &s->card,
+ s->audio_be,
s->voice,
"cs4231a",
s,
return;
}
- if (!AUD_register_card ("cs4231a", &s->card, errp)) {
+ if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
}
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),
struct ES1370State {
PCIDevice dev;
- QEMUSoundCard card;
+ AudioBackend *audio_be;
MemoryRegion io;
struct chan chan[NB_CHANNELS];
SWVoiceOut *dac_voice[2];
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;
}
}
if (i == ADC_CHANNEL) {
s->adc_voice =
AUD_open_in (
- &s->card,
+ s->audio_be,
s->adc_voice,
"es1370.adc",
s,
} else {
s->dac_voice[i] =
AUD_open_out (
- &s->card,
+ s->audio_be,
s->dac_voice[i],
i ? "es1370.dac2" : "es1370.dac1",
s,
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;
}
}
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;
}
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)
struct GUSState {
ISADevice dev;
GUSEmuState emu;
- QEMUSoundCard card;
+ AudioBackend *audio_be;
uint32_t freq;
uint32_t port;
int pos, left, shift, irqs;
IsaDmaClass *k;
struct audsettings as;
- if (!AUD_register_card ("gus", &s->card, errp)) {
+ if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
as.endianness = HOST_BIG_ENDIAN;
s->voice = AUD_open_out (
- &s->card,
+ s->audio_be,
NULL,
"gus",
s,
);
if (!s->voice) {
- AUD_remove_card (&s->card);
error_setg(errp, "No voice");
return;
}
}
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),
HDACodecDevice hda;
const char *name;
- QEMUSoundCard card;
+ AudioBackend *audio_be;
const desc_codec *desc;
HDAAudioStream st[4];
bool running_compat[16];
} 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) {
} 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);
}
}
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;
}
}
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)
};
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),
as.endianness = 0;
s->voice = AUD_open_out(
- &s->card,
+ s->audio_be,
s->voice,
"lm4549.out",
s,
as.endianness = 0;
s->voice = AUD_open_out(
- &s->card,
+ s->audio_be,
s->voice,
"lm4549.out",
s,
struct audsettings as;
/* Register an audio card */
- if (!AUD_register_card("lm4549", &s->card, errp)) {
+ if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
as.endianness = 0;
s->voice = AUD_open_out(
- &s->card,
+ s->audio_be,
s->voice,
"lm4549.out",
s,
typedef struct {
- QEMUSoundCard card;
+ AudioBackend *audio_be;
SWVoiceOut *voice;
uint32_t voice_is_active;
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;
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;
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;
}
}
};
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 *),
};
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),
struct SB16State {
ISADevice parent_obj;
- QEMUSoundCard card;
+ AudioBackend *audio_be;
qemu_irq pic;
uint32_t irq;
uint32_t dma;
as.endianness = 0;
s->voice = AUD_open_out (
- &s->card,
+ s->audio_be,
s->voice,
"sb16",
s,
as.endianness = 0;
s->voice = AUD_open_out (
- &s->card,
+ s->audio_be,
s->voice,
"sb16",
s,
as.endianness = 0;
s->voice = AUD_open_out (
- &s->card,
+ s->audio_be,
s->voice,
"sb16",
s,
SB16State *s = opaque;
if (s->voice) {
- AUD_close_out (&s->card, s->voice);
+ AUD_close_out(s->audio_be, s->voice);
s->voice = NULL;
}
as.endianness = 0;
s->voice = AUD_open_out (
- &s->card,
+ s->audio_be,
s->voice,
"sb16",
s,
SB16State *s = SB16 (dev);
IsaDmaClass *k;
- if (!AUD_register_card ("sb16", &s->card, errp)) {
+ if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
}
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),
.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)
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;
}
{
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)
};
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,
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;
}
}
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,
&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,
return;
}
- if (!AUD_register_card("virtio-sound", &vsnd->card, errp)) {
+ if (!AUD_backend_check(&vsnd->audio_be, errp)) {
return;
}
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]);
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;
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;
}
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 */
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 */
{
WM8750State *s = WM8750(dev);
- if (!AUD_register_card(CODEC, &s->card, errp)) {
+ if (!AUD_backend_check(&s->audio_be, errp)) {
return;
}
WM8750State *s = WM8750(i2c);
wm8750_reset(I2C_SLAVE(s));
- AUD_remove_card(&s->card);
g_free(s);
}
#endif
}
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)
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;
state = audio_be_by_name(str, errp);
if (state) {
- card->be = state;
+ *be = state;
}
}
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;
}
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,
}
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)
struct USBAudioState {
/* qemu interfaces */
USBDevice dev;
- QEMUSoundCard card;
+ AudioBackend *audio_be;
/* state */
struct {
}
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);
}
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;
}
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);
};
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),
MemoryRegion mem_regs;
MemoryRegion mem_extregs;
- QEMUSoundCard card;
+ AudioBackend *audio_be;
SWVoiceOut *voice;
uint8_t *mixbuf;
int samples;
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;
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];
struct ViaAC97State {
PCIDevice dev;
- QEMUSoundCard card;
+ AudioBackend *audio_be;
MemoryRegion sgd;
MemoryRegion fm;
MemoryRegion midi;
.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)