audio: lookup "audio-" object types, and realize them
Now "audio_driver" is a detail implementation of AudioMixengBackend and not required to implement an AudioBackend. Reviewed-by: Mark Cave-Ayland <mark.caveayland@nutanix.com> Reviewed-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
This commit is contained in:
@@ -1562,24 +1562,16 @@ size_t audio_generic_read(HWVoiceIn *hw, void *buf, size_t size)
|
||||
return total;
|
||||
}
|
||||
|
||||
static AudioBackend *audio_be_new(Audiodev *dev, Error **errp)
|
||||
static bool audio_mixeng_backend_realize(AudioBackend *abe,
|
||||
Audiodev *dev, Error **errp)
|
||||
{
|
||||
const char *drvname = AudiodevDriver_str(dev->driver);
|
||||
struct audio_driver *drv = audio_driver_lookup(drvname);
|
||||
AudioMixengBackend *be = AUDIO_MIXENG_BACKEND(abe);
|
||||
audio_driver *drv = AUDIO_MIXENG_BACKEND_GET_CLASS(be)->driver;
|
||||
|
||||
if (!drv) {
|
||||
error_setg(errp, "Unknown audio driver `%s'", drvname);
|
||||
qapi_free_Audiodev(dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
AudioMixengBackend *be = AUDIO_MIXENG_BACKEND(object_new(TYPE_AUDIO_MIXENG_BACKEND));
|
||||
be->dev = dev;
|
||||
|
||||
be->drv_opaque = drv->init(be->dev, errp);
|
||||
if (!be->drv_opaque) {
|
||||
object_unref(OBJECT(be));
|
||||
return NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!drv->pcm_ops->get_buffer_in) {
|
||||
@@ -1601,7 +1593,26 @@ static AudioBackend *audio_be_new(Audiodev *dev, Error **errp)
|
||||
be->period_ticks = be->dev->timer_period * (int64_t)SCALE_US;
|
||||
}
|
||||
|
||||
return AUDIO_BACKEND(be);
|
||||
return true;
|
||||
}
|
||||
|
||||
static AudioBackend *audio_be_new(Audiodev *dev, Error **errp)
|
||||
{
|
||||
const char *drvname = AudiodevDriver_str(dev->driver);
|
||||
g_autofree char *type = g_strconcat("audio-", drvname, NULL);
|
||||
AudioBackend *be = AUDIO_BACKEND(object_new(type));
|
||||
|
||||
if (!be) {
|
||||
error_setg(errp, "Unknown audio driver `%s'", drvname);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!AUDIO_BACKEND_GET_CLASS(be)->realize(be, dev, errp)) {
|
||||
object_unref(OBJECT(be));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return be;
|
||||
}
|
||||
|
||||
static void audio_vm_change_state_handler (void *opaque, bool running,
|
||||
@@ -1644,6 +1655,7 @@ static void audio_mixeng_backend_class_init(ObjectClass *klass, const void *data
|
||||
{
|
||||
AudioBackendClass *be = AUDIO_BACKEND_CLASS(klass);
|
||||
|
||||
be->realize = audio_mixeng_backend_realize;
|
||||
be->get_id = audio_mixeng_backend_get_id;
|
||||
}
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@ typedef struct AudioBackend {
|
||||
typedef struct AudioBackendClass {
|
||||
ObjectClass parent_class;
|
||||
|
||||
bool (*realize)(AudioBackend *be, Audiodev *dev, Error **errp);
|
||||
const char *(*get_id)(AudioBackend *be);
|
||||
#ifdef CONFIG_GIO
|
||||
bool (*set_dbus_server)(AudioBackend *be,
|
||||
|
||||
Reference in New Issue
Block a user