diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index bca1888dff..a28672e027 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -7615,6 +7615,40 @@ qemuBuildAudioCommonArg(virBufferPtr buf,
}
}
+static void
+qemuBuildAudioALSAArg(virBufferPtr buf,
+ const char *prefix,
+ virDomainAudioIOALSAPtr def)
+{
+ if (def->dev)
+ virBufferAsprintf(buf, ",%s.dev=%s", prefix, def->dev);
+}
+
+static void
+qemuBuildAudioCoreAudioArg(virBufferPtr buf,
+ const char *prefix,
+ virDomainAudioIOCoreAudioPtr def)
+{
+ if (def->bufferCount)
+ virBufferAsprintf(buf, ",%s.buffer-count=%u", prefix, def->bufferCount);
+}
+
+static void
+qemuBuildAudioJackArg(virBufferPtr buf,
+ const char *prefix,
+ virDomainAudioIOJackPtr def)
+{
+ if (def->serverName)
+ virBufferAsprintf(buf, ",%s.server-name=%s", prefix, def->serverName);
+ if (def->clientName)
+ virBufferAsprintf(buf, ",%s.client-name=%s", prefix, def->clientName);
+ if (def->connectPorts)
+ virBufferAsprintf(buf, ",%s.connect-ports=%s", prefix, def->connectPorts);
+ if (def->exactName)
+ virBufferAsprintf(buf, ",%s.exact-name=%s", prefix,
+ virTristateSwitchTypeToString(def->exactName));
+}
+
static void
qemuBuildAudioOSSArg(virBufferPtr buf,
const char *prefix,
@@ -7622,6 +7656,33 @@ qemuBuildAudioOSSArg(virBufferPtr buf,
{
if (def->dev)
virBufferAsprintf(buf, ",%s.dev=%s", prefix, def->dev);
+ if (def->bufferCount)
+ virBufferAsprintf(buf, ",%s.buffer-count=%u", prefix, def->bufferCount);
+ if (def->tryPoll)
+ virBufferAsprintf(buf, ",%s.try-poll=%s", prefix,
+ virTristateSwitchTypeToString(def->tryPoll));
+}
+
+static void
+qemuBuildAudioPulseAudioArg(virBufferPtr buf,
+ const char *prefix,
+ virDomainAudioIOPulseAudioPtr def)
+{
+ if (def->name)
+ virBufferAsprintf(buf, ",%s.name=%s", prefix, def->name);
+ if (def->streamName)
+ virBufferAsprintf(buf, ",%s.stream-name=%s", prefix, def->streamName);
+ if (def->latency)
+ virBufferAsprintf(buf, ",%s.latency=%u", prefix, def->latency);
+}
+
+static void
+qemuBuildAudioSDLArg(virBufferPtr buf,
+ const char *prefix,
+ virDomainAudioIOSDLPtr def)
+{
+ if (def->bufferCount)
+ virBufferAsprintf(buf, ",%s.buffer-count=%u", prefix, def->bufferCount);
}
static int
@@ -7644,23 +7705,46 @@ qemuBuildAudioCommandLineArg(virCommandPtr cmd,
break;
case VIR_DOMAIN_AUDIO_TYPE_ALSA:
+ qemuBuildAudioALSAArg(&buf, "in", &def->backend.alsa.input);
+ qemuBuildAudioALSAArg(&buf, "out", &def->backend.alsa.output);
break;
case VIR_DOMAIN_AUDIO_TYPE_COREAUDIO:
+ qemuBuildAudioCoreAudioArg(&buf, "in", &def->backend.coreaudio.input);
+ qemuBuildAudioCoreAudioArg(&buf, "out", &def->backend.coreaudio.output);
break;
case VIR_DOMAIN_AUDIO_TYPE_JACK:
+ qemuBuildAudioJackArg(&buf, "in", &def->backend.jack.input);
+ qemuBuildAudioJackArg(&buf, "out", &def->backend.jack.output);
break;
case VIR_DOMAIN_AUDIO_TYPE_OSS:
qemuBuildAudioOSSArg(&buf, "in", &def->backend.oss.input);
qemuBuildAudioOSSArg(&buf, "out", &def->backend.oss.output);
+
+ if (def->backend.oss.tryMMap)
+ virBufferAsprintf(&buf, ",try-mmap=%s",
+ virTristateSwitchTypeToString(def->backend.oss.tryMMap));
+ if (def->backend.oss.exclusive)
+ virBufferAsprintf(&buf, ",exclusive=%s",
+ virTristateSwitchTypeToString(def->backend.oss.exclusive));
+ if (def->backend.oss.dspPolicySet)
+ virBufferAsprintf(&buf, ",dsp-policy=%d", def->backend.oss.dspPolicy);
break;
case VIR_DOMAIN_AUDIO_TYPE_PULSEAUDIO:
+ qemuBuildAudioPulseAudioArg(&buf, "in", &def->backend.pulseaudio.input);
+ qemuBuildAudioPulseAudioArg(&buf, "out", &def->backend.pulseaudio.output);
+
+ if (def->backend.pulseaudio.serverName)
+ virBufferAsprintf(&buf, ",server=%s", def->backend.pulseaudio.serverName);
break;
case VIR_DOMAIN_AUDIO_TYPE_SDL:
+ qemuBuildAudioSDLArg(&buf, "in", &def->backend.sdl.input);
+ qemuBuildAudioSDLArg(&buf, "out", &def->backend.sdl.output);
+
if (def->backend.sdl.driver) {
/*
* Some SDL audio driver names are different on SDL 1.2
@@ -7679,6 +7763,8 @@ qemuBuildAudioCommandLineArg(virCommandPtr cmd,
break;
case VIR_DOMAIN_AUDIO_TYPE_FILE:
+ if (def->backend.file.path)
+ virBufferEscapeString(&buf, ",path=%s", def->backend.file.path);
break;
case VIR_DOMAIN_AUDIO_TYPE_LAST:
@@ -7732,15 +7818,62 @@ qemuBuildAudioCommonEnv(virCommandPtr cmd,
}
static void
-qemuBuildAudioOSSEnv(virCommandPtr cmd,
- const char *prefix,
- virDomainAudioIOOSSPtr def)
+qemuBuildAudioALSAEnv(virCommandPtr cmd,
+ const char *prefix,
+ virDomainAudioIOALSAPtr def)
{
if (def->dev)
virCommandAddEnvFormat(cmd, "%sDEV=%s",
prefix, def->dev);
}
+static void
+qemuBuildAudioCoreAudioEnv(virCommandPtr cmd,
+ virDomainAudioDefPtr def)
+{
+ if (def->backend.coreaudio.output.bufferCount)
+ virCommandAddEnvFormat(cmd, "QEMU_COREAUDIO_BUFFER_COUNT=%u",
+ def->backend.coreaudio.output.bufferCount);
+ if (def->output.bufferLength)
+ virCommandAddEnvFormat(cmd, "QEMU_COREAUDIO_BUFFER_SIZE=%u",
+ def->output.bufferLength);
+}
+
+static void
+qemuBuildAudioOSSEnv(virCommandPtr cmd,
+ const char *prefix,
+ const char *prefix2,
+ virDomainAudioIOOSSPtr def)
+{
+ if (def->dev)
+ virCommandAddEnvFormat(cmd, "%sDEV=%s",
+ prefix, def->dev);
+ if (def->tryPoll)
+ virCommandAddEnvFormat(cmd, "%sTRY_POLL=%s", prefix2,
+ virTristateSwitchTypeToString(def->tryPoll));
+}
+
+static void
+qemuBuildAudioPulseAudioEnv(virCommandPtr cmd,
+ virDomainAudioDefPtr def)
+{
+ if (def->backend.pulseaudio.input.name)
+ virCommandAddEnvPair(cmd, "QEMU_PA_SOURCE",
+ def->backend.pulseaudio.input.name);
+ if (def->backend.pulseaudio.output.name)
+ virCommandAddEnvPair(cmd, "QEMU_PA_SINK",
+ def->backend.pulseaudio.output.name);
+
+ if (def->input.bufferLength)
+ virCommandAddEnvFormat(cmd, "QEMU_PA_SAMPLES=%u",
+ def->input.bufferLength);
+
+ if (def->backend.pulseaudio.serverName)
+ virCommandAddEnvPair(cmd, "QEMU_PA_SERVER=%s",
+ def->backend.pulseaudio.serverName);
+}
+
+
static int
qemuBuildAudioCommandLineEnv(virCommandPtr cmd,
virDomainDefPtr def)
@@ -7761,23 +7894,47 @@ qemuBuildAudioCommandLineEnv(virCommandPtr cmd,
break;
case VIR_DOMAIN_AUDIO_TYPE_ALSA:
+ qemuBuildAudioALSAEnv(cmd, "QEMU_AUDIO_ADC_", &audio->backend.alsa.input);
+ qemuBuildAudioALSAEnv(cmd, "QEMU_AUDIO_DAC_", &audio->backend.alsa.output);
break;
case VIR_DOMAIN_AUDIO_TYPE_COREAUDIO:
+ qemuBuildAudioCoreAudioEnv(cmd, audio);
break;
case VIR_DOMAIN_AUDIO_TYPE_JACK:
break;
case VIR_DOMAIN_AUDIO_TYPE_OSS:
- qemuBuildAudioOSSEnv(cmd, "QEMU_OSS_ADC_", &audio->backend.oss.input);
- qemuBuildAudioOSSEnv(cmd, "QEMU_OSS_DAC_", &audio->backend.oss.output);
+ qemuBuildAudioOSSEnv(cmd, "QEMU_OSS_ADC_", "QEMU_AUDIO_ADC_",
+ &audio->backend.oss.input);
+ qemuBuildAudioOSSEnv(cmd, "QEMU_OSS_DAC_", "QEMU_AUDIO_DAC_",
+ &audio->backend.oss.output);
+
+ if (audio->backend.oss.input.bufferCount)
+ virCommandAddEnvFormat(cmd, "QEMU_OSS_NFRAGS=%u",
+ audio->backend.oss.input.bufferCount);
+
+ if (audio->backend.oss.tryMMap)
+ virCommandAddEnvFormat(cmd, "QEMU_OSS_MMAP=%s",
+ virTristateSwitchTypeToString(audio->backend.oss.tryMMap));
+ if (audio->backend.oss.exclusive)
+ virCommandAddEnvFormat(cmd, "QEMU_OSS_EXCLUSIVE=%s",
+ virTristateSwitchTypeToString(audio->backend.oss.exclusive));
+ if (audio->backend.oss.dspPolicySet)
+ virCommandAddEnvFormat(cmd, "QEMU_OSS_POLICY=%d",
+ audio->backend.oss.dspPolicy);
break;
case VIR_DOMAIN_AUDIO_TYPE_PULSEAUDIO:
+ qemuBuildAudioPulseAudioEnv(cmd, audio);
break;
case VIR_DOMAIN_AUDIO_TYPE_SDL:
+ if (audio->output.bufferLength)
+ virCommandAddEnvFormat(cmd, "QEMU_SDL_SAMPLES=%u",
+ audio->output.bufferLength);
+
if (audio->backend.sdl.driver) {
/*
* Some SDL audio driver names are different on SDL 1.2
@@ -7796,6 +7953,9 @@ qemuBuildAudioCommandLineEnv(virCommandPtr cmd,
break;
case VIR_DOMAIN_AUDIO_TYPE_FILE:
+ if (audio->backend.file.path)
+ virCommandAddEnvFormat(cmd, "QEMU_WAV_PATH=%s",
+ audio->backend.file.path);
break;
case VIR_DOMAIN_AUDIO_TYPE_LAST:
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index ee9592aa34..6043f974ce 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -4209,6 +4209,11 @@ qemuValidateDomainDeviceDefAudio(virDomainAudioDefPtr audio,
_("setting audio buffer length is not supported with this QEMU"));
return -1;
}
+ if (audio->backend.coreaudio.input.bufferCount) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("setting audio buffer count is not supported with this QEMU"));
+ return -1;
+ }
}
break;
@@ -4221,10 +4226,32 @@ qemuValidateDomainDeviceDefAudio(virDomainAudioDefPtr audio,
break;
case VIR_DOMAIN_AUDIO_TYPE_OSS:
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_AUDIODEV)) {
+ if (audio->backend.oss.input.bufferCount !=
+ audio->backend.oss.output.bufferCount) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("setting audio buffer count is not supported with this QEMU"));
+ return -1;
+ }
+ }
break;
case VIR_DOMAIN_AUDIO_TYPE_PULSEAUDIO:
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_AUDIODEV)) {
+ if (audio->backend.pulseaudio.input.streamName ||
+ audio->backend.pulseaudio.output.streamName) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("setting audio stream name is not supported with this QEMU"));
+ return -1;
+ }
+
+ if (audio->backend.pulseaudio.input.latency ||
+ audio->backend.pulseaudio.output.latency) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("setting audio latency is not supported with this QEMU"));
+ return -1;
+ }
+
if (audio->input.bufferLength != audio->output.bufferLength) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("setting audio buffer length is not supported with this QEMU"));
@@ -4240,6 +4267,13 @@ qemuValidateDomainDeviceDefAudio(virDomainAudioDefPtr audio,
_("setting audio buffer length is not supported with this QEMU"));
return -1;
}
+
+ if (audio->backend.sdl.input.bufferCount ||
+ audio->backend.sdl.output.bufferCount) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("setting audio buffer count is not supported with this QEMU"));
+ return -1;
+ }
}
break;
diff --git a/tests/qemuxml2argvdata/audio-alsa-best.args b/tests/qemuxml2argvdata/audio-alsa-best.args
index 4461fc670c..d6c73dfc8b 100644
--- a/tests/qemuxml2argvdata/audio-alsa-best.args
+++ b/tests/qemuxml2argvdata/audio-alsa-best.args
@@ -17,6 +17,8 @@ QEMU_AUDIO_DAC_VOICES=2 \
QEMU_AUDIO_DAC_FIXED_FREQ=22050 \
QEMU_AUDIO_DAC_FIXED_CHANNELS=4 \
QEMU_AUDIO_DAC_FIXED_FMT=f32 \
+QEMU_AUDIO_ADC_DEV=/dev/dsp0 \
+QEMU_AUDIO_DAC_DEV=/dev/dsp1 \
/usr/bin/qemu-system-i386 \
-name QEMUGuest1 \
-S \
diff --git a/tests/qemuxml2argvdata/audio-alsa-best.x86_64-latest.args b/tests/qemuxml2argvdata/audio-alsa-best.x86_64-latest.args
index 5f84dcca72..e9898c29de 100644
--- a/tests/qemuxml2argvdata/audio-alsa-best.x86_64-latest.args
+++ b/tests/qemuxml2argvdata/audio-alsa-best.x86_64-latest.args
@@ -36,7 +36,7 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
-audiodev id=audio1,driver=alsa,in.mixing-engine=on,in.fixed-settings=on,\
in.voices=1,in.frequency=44100,in.channels=2,in.format=s16,\
out.mixing-engine=on,out.fixed-settings=on,out.voices=2,out.frequency=22050,\
-out.channels=4,out.format=f32 \
+out.channels=4,out.format=f32,in.dev=/dev/dsp0,out.dev=/dev/dsp1 \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\
resourcecontrol=deny \
-msg timestamp=on
diff --git a/tests/qemuxml2argvdata/audio-alsa-best.xml b/tests/qemuxml2argvdata/audio-alsa-best.xml
index cefcc47027..1a6d5f4d9f 100644
--- a/tests/qemuxml2argvdata/audio-alsa-best.xml
+++ b/tests/qemuxml2argvdata/audio-alsa-best.xml
@@ -31,10 +31,10 @@
diff --git a/tests/qemuxml2argvdata/audio-alsa-full.x86_64-latest.args b/tests/qemuxml2argvdata/audio-alsa-full.x86_64-latest.args
index 6ade7ef069..3c1b5ba6a5 100644
--- a/tests/qemuxml2argvdata/audio-alsa-full.x86_64-latest.args
+++ b/tests/qemuxml2argvdata/audio-alsa-full.x86_64-latest.args
@@ -36,7 +36,8 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
-audiodev id=audio1,driver=alsa,in.mixing-engine=on,in.fixed-settings=on,\
in.voices=1,in.buffer-length=100,in.frequency=44100,in.channels=2,\
in.format=s16,out.mixing-engine=on,out.fixed-settings=on,out.voices=2,\
-out.buffer-length=200,out.frequency=22050,out.channels=4,out.format=f32 \
+out.buffer-length=200,out.frequency=22050,out.channels=4,out.format=f32,\
+in.dev=/dev/dsp0,out.dev=/dev/dsp1 \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\
resourcecontrol=deny \
-msg timestamp=on
diff --git a/tests/qemuxml2argvdata/audio-alsa-full.xml b/tests/qemuxml2argvdata/audio-alsa-full.xml
index 2cd488a3a5..634b41a0f0 100644
--- a/tests/qemuxml2argvdata/audio-alsa-full.xml
+++ b/tests/qemuxml2argvdata/audio-alsa-full.xml
@@ -31,10 +31,10 @@
diff --git a/tests/qemuxml2argvdata/audio-coreaudio-best.args b/tests/qemuxml2argvdata/audio-coreaudio-best.args
index f8250df5cb..cc8be459f6 100644
--- a/tests/qemuxml2argvdata/audio-coreaudio-best.args
+++ b/tests/qemuxml2argvdata/audio-coreaudio-best.args
@@ -17,6 +17,8 @@ QEMU_AUDIO_DAC_VOICES=2 \
QEMU_AUDIO_DAC_FIXED_FREQ=22050 \
QEMU_AUDIO_DAC_FIXED_CHANNELS=4 \
QEMU_AUDIO_DAC_FIXED_FMT=f32 \
+QEMU_COREAUDIO_BUFFER_COUNT=42 \
+QEMU_COREAUDIO_BUFFER_SIZE=200 \
/usr/bin/qemu-system-i386 \
-name QEMUGuest1 \
-S \
diff --git a/tests/qemuxml2argvdata/audio-coreaudio-best.x86_64-latest.args b/tests/qemuxml2argvdata/audio-coreaudio-best.x86_64-latest.args
index 93166f27de..273655840a 100644
--- a/tests/qemuxml2argvdata/audio-coreaudio-best.x86_64-latest.args
+++ b/tests/qemuxml2argvdata/audio-coreaudio-best.x86_64-latest.args
@@ -35,8 +35,8 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
-device ide-cd,bus=ide.1,unit=0,drive=libvirt-1-format,id=ide0-1-0,bootindex=1 \
-audiodev id=audio1,driver=coreaudio,in.mixing-engine=on,in.fixed-settings=on,\
in.voices=1,in.frequency=44100,in.channels=2,in.format=s16,\
-out.mixing-engine=on,out.fixed-settings=on,out.voices=2,out.frequency=22050,\
-out.channels=4,out.format=f32 \
+out.mixing-engine=on,out.fixed-settings=on,out.voices=2,out.buffer-length=200,\
+out.frequency=22050,out.channels=4,out.format=f32,out.buffer-count=42 \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\
resourcecontrol=deny \
-msg timestamp=on
diff --git a/tests/qemuxml2argvdata/audio-coreaudio-best.xml b/tests/qemuxml2argvdata/audio-coreaudio-best.xml
index 8a79404fde..66c52bb24c 100644
--- a/tests/qemuxml2argvdata/audio-coreaudio-best.xml
+++ b/tests/qemuxml2argvdata/audio-coreaudio-best.xml
@@ -34,7 +34,7 @@
-