audio: add audiodev property to vnc and wav_capture
Signed-off-by: Kővágó, Zoltán <DirtY.iCE.hu@gmail.com> Message-id: 8cbc9e865bbf40850c14340fc0549e6ac2d5fe9c.1566168923.git.DirtY.iCE.hu@gmail.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
ecd97e9592
commit
f0b9f36d71
@ -819,16 +819,17 @@ ETEXI
|
||||
|
||||
{
|
||||
.name = "wavcapture",
|
||||
.args_type = "path:F,freq:i?,bits:i?,nchannels:i?",
|
||||
.params = "path [frequency [bits [channels]]]",
|
||||
.args_type = "path:F,audiodev:s,freq:i?,bits:i?,nchannels:i?",
|
||||
.params = "path audiodev [frequency [bits [channels]]]",
|
||||
.help = "capture audio to a wave file (default frequency=44100 bits=16 channels=2)",
|
||||
.cmd = hmp_wavcapture,
|
||||
},
|
||||
STEXI
|
||||
@item wavcapture @var{filename} [@var{frequency} [@var{bits} [@var{channels}]]]
|
||||
@item wavcapture @var{filename} @var{audiodev} [@var{frequency} [@var{bits} [@var{channels}]]]
|
||||
@findex wavcapture
|
||||
Capture audio into @var{filename}. Using sample rate @var{frequency}
|
||||
bits per sample @var{bits} and number of channels @var{channels}.
|
||||
Capture audio into @var{filename} from @var{audiodev}, using sample rate
|
||||
@var{frequency} bits per sample @var{bits} and number of channels
|
||||
@var{channels}.
|
||||
|
||||
Defaults:
|
||||
@itemize @minus
|
||||
|
@ -1142,21 +1142,21 @@ static void hmp_stopcapture(Monitor *mon, const QDict *qdict)
|
||||
static void hmp_wavcapture(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
const char *path = qdict_get_str(qdict, "path");
|
||||
int has_freq = qdict_haskey(qdict, "freq");
|
||||
int freq = qdict_get_try_int(qdict, "freq", -1);
|
||||
int has_bits = qdict_haskey(qdict, "bits");
|
||||
int bits = qdict_get_try_int(qdict, "bits", -1);
|
||||
int has_channels = qdict_haskey(qdict, "nchannels");
|
||||
int nchannels = qdict_get_try_int(qdict, "nchannels", -1);
|
||||
int freq = qdict_get_try_int(qdict, "freq", 44100);
|
||||
int bits = qdict_get_try_int(qdict, "bits", 16);
|
||||
int nchannels = qdict_get_try_int(qdict, "nchannels", 2);
|
||||
const char *audiodev = qdict_get_str(qdict, "audiodev");
|
||||
CaptureState *s;
|
||||
AudioState *as = audio_state_by_name(audiodev);
|
||||
|
||||
if (!as) {
|
||||
monitor_printf(mon, "Audiodev '%s' not found\n", audiodev);
|
||||
return;
|
||||
}
|
||||
|
||||
s = g_malloc0 (sizeof (*s));
|
||||
|
||||
freq = has_freq ? freq : 44100;
|
||||
bits = has_bits ? bits : 16;
|
||||
nchannels = has_channels ? nchannels : 2;
|
||||
|
||||
if (wav_start_capture(NULL, s, path, freq, bits, nchannels)) {
|
||||
if (wav_start_capture(as, s, path, freq, bits, nchannels)) {
|
||||
monitor_printf(mon, "Failed to add wave capture\n");
|
||||
g_free (s);
|
||||
return;
|
||||
|
@ -1978,6 +1978,12 @@ can help the device and guest to keep up and not lose events in case
|
||||
events are arriving in bulk. Possible causes for the latter are flaky
|
||||
network connections, or scripts for automated testing.
|
||||
|
||||
@item audiodev=@var{audiodev}
|
||||
|
||||
Use the specified @var{audiodev} when the VNC client requests audio
|
||||
transmission. When not using an -audiodev argument, this option must
|
||||
be omitted, otherwise is must be present and specify a valid audiodev.
|
||||
|
||||
@end table
|
||||
ETEXI
|
||||
|
||||
|
15
ui/vnc.c
15
ui/vnc.c
@ -1224,7 +1224,7 @@ static void audio_add(VncState *vs)
|
||||
ops.destroy = audio_capture_destroy;
|
||||
ops.capture = audio_capture;
|
||||
|
||||
vs->audio_cap = AUD_add_capture(NULL, &vs->as, &ops, vs);
|
||||
vs->audio_cap = AUD_add_capture(vs->vd->audio_state, &vs->as, &ops, vs);
|
||||
if (!vs->audio_cap) {
|
||||
error_report("Failed to add audio capture");
|
||||
}
|
||||
@ -3371,6 +3371,9 @@ static QemuOptsList qemu_vnc_opts = {
|
||||
},{
|
||||
.name = "non-adaptive",
|
||||
.type = QEMU_OPT_BOOL,
|
||||
},{
|
||||
.name = "audiodev",
|
||||
.type = QEMU_OPT_STRING,
|
||||
},
|
||||
{ /* end of list */ }
|
||||
},
|
||||
@ -3808,6 +3811,7 @@ void vnc_display_open(const char *id, Error **errp)
|
||||
const char *saslauthz;
|
||||
int lock_key_sync = 1;
|
||||
int key_delay_ms;
|
||||
const char *audiodev;
|
||||
|
||||
if (!vd) {
|
||||
error_setg(errp, "VNC display not active");
|
||||
@ -3993,6 +3997,15 @@ void vnc_display_open(const char *id, Error **errp)
|
||||
}
|
||||
vd->ledstate = 0;
|
||||
|
||||
audiodev = qemu_opt_get(opts, "audiodev");
|
||||
if (audiodev) {
|
||||
vd->audio_state = audio_state_by_name(audiodev);
|
||||
if (!vd->audio_state) {
|
||||
error_setg(errp, "Audiodev '%s' not found", audiodev);
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
device_id = qemu_opt_get(opts, "display");
|
||||
if (device_id) {
|
||||
int head = qemu_opt_get_number(opts, "head", 0);
|
||||
|
Loading…
Reference in New Issue
Block a user