Browse Source

audio/oss: convert to QOM lifecycle methods

Migrate the OSS audio backend from the legacy driver init/fini
callbacks to proper QOM realize method.

The oss_audio_init() function is replaced with audio_oss_realize(),
which performs the same device accessibility check before delegating
to the parent class realize method. The empty oss_audio_fini() is
removed.

Access to the Audiodev is now through hw->s->dev instead of the
drv_opaque pointer.

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>
master
Marc-André Lureau 7 months ago
parent
commit
8c24dd8a7e
  1. 41
      audio/ossaudio.c

41
audio/ossaudio.c

@ -23,6 +23,7 @@
*/
#include "qemu/osdep.h"
#include "qapi-types-audio.h"
#include <sys/ioctl.h>
#include <sys/soundcard.h>
#include "qemu/main-loop.h"
@ -39,19 +40,14 @@
#define TYPE_AUDIO_OSS "audio-oss"
OBJECT_DECLARE_SIMPLE_TYPE(AudioOss, AUDIO_OSS)
static AudioBackendClass *audio_oss_parent_class;
struct AudioOss {
AudioMixengBackend parent_obj;
};
static struct audio_driver oss_audio_driver;
static void audio_oss_class_init(ObjectClass *klass, const void *data)
{
AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
k->driver = &oss_audio_driver;
}
#if defined OSS_GETVERSION && defined SNDCTL_DSP_POLICY
#define USE_DSP_POLICY
#endif
@ -505,7 +501,7 @@ static int oss_init_out(HWVoiceOut *hw, struct audsettings *as,
int err;
int fd;
struct audsettings obt_as;
Audiodev *dev = drv_opaque;
Audiodev *dev = hw->s->dev;
AudiodevOssOptions *oopts = &dev->u.oss;
oss->fd = -1;
@ -636,7 +632,7 @@ static int oss_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque)
int err;
int fd;
struct audsettings obt_as;
Audiodev *dev = drv_opaque;
Audiodev *dev = hw->s->dev;
oss->fd = -1;
@ -737,7 +733,8 @@ static void oss_init_per_direction(AudiodevOssPerDirectionOptions *opdo)
}
}
static void *oss_audio_init(Audiodev *dev, Error **errp)
static bool
audio_oss_realize(AudioBackend *abe, Audiodev *dev, Error **errp)
{
AudiodevOssOptions *oopts;
assert(dev->driver == AUDIODEV_DRIVER_OSS);
@ -748,17 +745,16 @@ static void *oss_audio_init(Audiodev *dev, Error **errp)
if (access(oopts->in->dev ?: "/dev/dsp", R_OK | W_OK) < 0) {
error_setg_errno(errp, errno, "%s not accessible", oopts->in->dev ?: "/dev/dsp");
return NULL;
qapi_free_Audiodev(dev);
return false;
}
if (access(oopts->out->dev ?: "/dev/dsp", R_OK | W_OK) < 0) {
error_setg_errno(errp, errno, "%s not accessible", oopts->out->dev ?: "/dev/dsp");
return NULL;
}
return dev;
qapi_free_Audiodev(dev);
return false;
}
static void oss_audio_fini (void *opaque)
{
return audio_oss_parent_class->realize(abe, dev, errp);
}
static struct audio_pcm_ops oss_pcm_ops = {
@ -780,8 +776,6 @@ static struct audio_pcm_ops oss_pcm_ops = {
static struct audio_driver oss_audio_driver = {
.name = "oss",
.init = oss_audio_init,
.fini = oss_audio_fini,
.pcm_ops = &oss_pcm_ops,
.max_voices_out = INT_MAX,
.max_voices_in = INT_MAX,
@ -789,6 +783,17 @@ static struct audio_driver oss_audio_driver = {
.voice_size_in = sizeof (OSSVoiceIn)
};
static void audio_oss_class_init(ObjectClass *klass, const void *data)
{
AudioBackendClass *b = AUDIO_BACKEND_CLASS(klass);
AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
audio_oss_parent_class = AUDIO_BACKEND_CLASS(object_class_get_parent(klass));
b->realize = audio_oss_realize;
k->driver = &oss_audio_driver;
}
static const TypeInfo audio_types[] = {
{
.name = TYPE_AUDIO_OSS,

Loading…
Cancel
Save