mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-10-15 15:32:51 +00:00
coreaudio: port to -audiodev config
Signed-off-by: Kővágó, Zoltán <DirtY.iCE.hu@gmail.com> Message-id: ba58f7e2501b1454b5e0f91c03aad416a404fc6a.1552083282.git.DirtY.iCE.hu@gmail.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
a93f328177
commit
17c56dc1d1
|
@ -109,6 +109,17 @@ static uint32_t frames_to_usecs(uint32_t frames,
|
||||||
return (frames * 1000000 + freq / 2) / freq;
|
return (frames * 1000000 + freq / 2) / freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void get_frames_to_usecs(const char *env, uint32_t *dst, bool *has_dst,
|
||||||
|
AudiodevPerDirectionOptions *pdo)
|
||||||
|
{
|
||||||
|
const char *val = getenv(env);
|
||||||
|
if (val) {
|
||||||
|
*dst = frames_to_usecs(toui32(val), pdo);
|
||||||
|
*has_dst = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* backend specific functions */
|
/* backend specific functions */
|
||||||
/* ALSA */
|
/* ALSA */
|
||||||
static void handle_alsa_per_direction(
|
static void handle_alsa_per_direction(
|
||||||
|
@ -156,6 +167,19 @@ static void handle_alsa(Audiodev *dev)
|
||||||
&aopt->threshold, &aopt->has_threshold);
|
&aopt->threshold, &aopt->has_threshold);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* coreaudio */
|
||||||
|
static void handle_coreaudio(Audiodev *dev)
|
||||||
|
{
|
||||||
|
get_frames_to_usecs(
|
||||||
|
"QEMU_COREAUDIO_BUFFER_SIZE",
|
||||||
|
&dev->u.coreaudio.out->buffer_length,
|
||||||
|
&dev->u.coreaudio.out->has_buffer_length,
|
||||||
|
qapi_AudiodevCoreaudioPerDirectionOptions_base(dev->u.coreaudio.out));
|
||||||
|
get_int("QEMU_COREAUDIO_BUFFER_COUNT",
|
||||||
|
&dev->u.coreaudio.out->buffer_count,
|
||||||
|
&dev->u.coreaudio.out->has_buffer_count);
|
||||||
|
}
|
||||||
|
|
||||||
/* general */
|
/* general */
|
||||||
static void handle_per_direction(
|
static void handle_per_direction(
|
||||||
AudiodevPerDirectionOptions *pdo, const char *prefix)
|
AudiodevPerDirectionOptions *pdo, const char *prefix)
|
||||||
|
@ -201,6 +225,10 @@ static AudiodevListEntry *legacy_opt(const char *drvname)
|
||||||
handle_alsa(e->dev);
|
handle_alsa(e->dev);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case AUDIODEV_DRIVER_COREAUDIO:
|
||||||
|
handle_coreaudio(e->dev);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,11 +36,6 @@
|
||||||
#define MAC_OS_X_VERSION_10_6 1060
|
#define MAC_OS_X_VERSION_10_6 1060
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int buffer_frames;
|
|
||||||
int nbuffers;
|
|
||||||
} CoreaudioConf;
|
|
||||||
|
|
||||||
typedef struct coreaudioVoiceOut {
|
typedef struct coreaudioVoiceOut {
|
||||||
HWVoiceOut hw;
|
HWVoiceOut hw;
|
||||||
pthread_mutex_t mutex;
|
pthread_mutex_t mutex;
|
||||||
|
@ -507,7 +502,9 @@ static int coreaudio_init_out(HWVoiceOut *hw, struct audsettings *as,
|
||||||
int err;
|
int err;
|
||||||
const char *typ = "playback";
|
const char *typ = "playback";
|
||||||
AudioValueRange frameRange;
|
AudioValueRange frameRange;
|
||||||
CoreaudioConf *conf = drv_opaque;
|
Audiodev *dev = drv_opaque;
|
||||||
|
AudiodevCoreaudioPerDirectionOptions *cpdo = dev->u.coreaudio.out;
|
||||||
|
int frames;
|
||||||
|
|
||||||
/* create mutex */
|
/* create mutex */
|
||||||
err = pthread_mutex_init(&core->mutex, NULL);
|
err = pthread_mutex_init(&core->mutex, NULL);
|
||||||
|
@ -538,16 +535,17 @@ static int coreaudio_init_out(HWVoiceOut *hw, struct audsettings *as,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (frameRange.mMinimum > conf->buffer_frames) {
|
frames = audio_buffer_frames(
|
||||||
|
qapi_AudiodevCoreaudioPerDirectionOptions_base(cpdo), as, 11610);
|
||||||
|
if (frameRange.mMinimum > frames) {
|
||||||
core->audioDevicePropertyBufferFrameSize = (UInt32) frameRange.mMinimum;
|
core->audioDevicePropertyBufferFrameSize = (UInt32) frameRange.mMinimum;
|
||||||
dolog ("warning: Upsizing Buffer Frames to %f\n", frameRange.mMinimum);
|
dolog ("warning: Upsizing Buffer Frames to %f\n", frameRange.mMinimum);
|
||||||
}
|
} else if (frameRange.mMaximum < frames) {
|
||||||
else if (frameRange.mMaximum < conf->buffer_frames) {
|
|
||||||
core->audioDevicePropertyBufferFrameSize = (UInt32) frameRange.mMaximum;
|
core->audioDevicePropertyBufferFrameSize = (UInt32) frameRange.mMaximum;
|
||||||
dolog ("warning: Downsizing Buffer Frames to %f\n", frameRange.mMaximum);
|
dolog ("warning: Downsizing Buffer Frames to %f\n", frameRange.mMaximum);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
core->audioDevicePropertyBufferFrameSize = conf->buffer_frames;
|
core->audioDevicePropertyBufferFrameSize = frames;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set Buffer Frame Size */
|
/* set Buffer Frame Size */
|
||||||
|
@ -568,7 +566,8 @@ static int coreaudio_init_out(HWVoiceOut *hw, struct audsettings *as,
|
||||||
"Could not get device buffer frame size\n");
|
"Could not get device buffer frame size\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
hw->samples = conf->nbuffers * core->audioDevicePropertyBufferFrameSize;
|
hw->samples = (cpdo->has_buffer_count ? cpdo->buffer_count : 4) *
|
||||||
|
core->audioDevicePropertyBufferFrameSize;
|
||||||
|
|
||||||
/* get StreamFormat */
|
/* get StreamFormat */
|
||||||
status = coreaudio_get_streamformat(core->outputDeviceID,
|
status = coreaudio_get_streamformat(core->outputDeviceID,
|
||||||
|
@ -680,40 +679,15 @@ static int coreaudio_ctl_out (HWVoiceOut *hw, int cmd, ...)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CoreaudioConf glob_conf = {
|
|
||||||
.buffer_frames = 512,
|
|
||||||
.nbuffers = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void *coreaudio_audio_init(Audiodev *dev)
|
static void *coreaudio_audio_init(Audiodev *dev)
|
||||||
{
|
{
|
||||||
CoreaudioConf *conf = g_malloc(sizeof(CoreaudioConf));
|
return dev;
|
||||||
*conf = glob_conf;
|
|
||||||
|
|
||||||
return conf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void coreaudio_audio_fini (void *opaque)
|
static void coreaudio_audio_fini (void *opaque)
|
||||||
{
|
{
|
||||||
g_free(opaque);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct audio_option coreaudio_options[] = {
|
|
||||||
{
|
|
||||||
.name = "BUFFER_SIZE",
|
|
||||||
.tag = AUD_OPT_INT,
|
|
||||||
.valp = &glob_conf.buffer_frames,
|
|
||||||
.descr = "Size of the buffer in frames"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "BUFFER_COUNT",
|
|
||||||
.tag = AUD_OPT_INT,
|
|
||||||
.valp = &glob_conf.nbuffers,
|
|
||||||
.descr = "Number of buffers"
|
|
||||||
},
|
|
||||||
{ /* End of list */ }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct audio_pcm_ops coreaudio_pcm_ops = {
|
static struct audio_pcm_ops coreaudio_pcm_ops = {
|
||||||
.init_out = coreaudio_init_out,
|
.init_out = coreaudio_init_out,
|
||||||
.fini_out = coreaudio_fini_out,
|
.fini_out = coreaudio_fini_out,
|
||||||
|
@ -725,7 +699,6 @@ static struct audio_pcm_ops coreaudio_pcm_ops = {
|
||||||
static struct audio_driver coreaudio_audio_driver = {
|
static struct audio_driver coreaudio_audio_driver = {
|
||||||
.name = "coreaudio",
|
.name = "coreaudio",
|
||||||
.descr = "CoreAudio http://developer.apple.com/audio/coreaudio.html",
|
.descr = "CoreAudio http://developer.apple.com/audio/coreaudio.html",
|
||||||
.options = coreaudio_options,
|
|
||||||
.init = coreaudio_audio_init,
|
.init = coreaudio_audio_init,
|
||||||
.fini = coreaudio_audio_fini,
|
.fini = coreaudio_audio_fini,
|
||||||
.pcm_ops = &coreaudio_pcm_ops,
|
.pcm_ops = &coreaudio_pcm_ops,
|
||||||
|
|
Loading…
Reference in a new issue