Hi On Mon, Feb 23, 2026 at 9:26 PM Sergei Heifetz <[email protected]> wrote: > > Disable the audio feature in VNC when QEMU is configured with > `--disable-audio`. Do not compile the corresponding audio-related > code.
Users will have to call query-command-line-options to figure out if audio support was disabled. Since this is an optional build option, I don't know if we treat it as a breaking change. > > Signed-off-by: Sergei Heifetz <[email protected]> > --- > ui/vnc.c | 31 ++++++++++++++++++++++++++++--- > 1 file changed, 28 insertions(+), 3 deletions(-) > > diff --git a/ui/vnc.c b/ui/vnc.c > index daf5b01d34..e6b6a9f4f9 100644 > --- a/ui/vnc.c > +++ b/ui/vnc.c > @@ -1072,6 +1072,7 @@ static void vnc_update_throttle_offset(VncState *vs) > size_t offset = > vs->client_width * vs->client_height * vs->client_pf.bytes_per_pixel; > > +#ifdef CONFIG_AUDIO > if (vs->audio_cap) { > int bps; > switch (vs->as.fmt) { > @@ -1091,6 +1092,7 @@ static void vnc_update_throttle_offset(VncState *vs) > } > offset += vs->as.freq * bps * vs->as.nchannels; > } > +#endif > > /* Put a floor of 1MB on offset, so that if we have a large pending > * buffer and the display is resized to a small size & back again > @@ -1214,6 +1216,7 @@ static int vnc_update_client(VncState *vs, int > has_dirty) > return n; > } > > +#ifdef CONFIG_AUDIO > /* audio */ > static void audio_capture_notify(void *opaque, audcnotification_e cmd) > { > @@ -1293,6 +1296,7 @@ static void audio_del(VncState *vs) > vs->audio_cap = NULL; > } > } > +#endif > > static void vnc_disconnect_start(VncState *vs) > { > @@ -1332,7 +1336,9 @@ void vnc_disconnect_finish(VncState *vs) > #ifdef CONFIG_VNC_SASL > vnc_sasl_client_cleanup(vs); > #endif /* CONFIG_VNC_SASL */ > +#ifdef CONFIG_AUDIO > audio_del(vs); > +#endif > qkbd_state_lift_all_keys(vs->vd->kbd); > > if (vs->mouse_mode_notifier.notify != NULL) { > @@ -2097,6 +2103,7 @@ static void send_ext_key_event_ack(VncState *vs) > vnc_flush(vs); > } > > +#ifdef CONFIG_AUDIO > static void send_ext_audio_ack(VncState *vs) > { > vnc_lock_output(vs); > @@ -2110,6 +2117,7 @@ static void send_ext_audio_ack(VncState *vs) > vnc_unlock_output(vs); > vnc_flush(vs); > } > +#endif > > static void send_xvp_message(VncState *vs, int code) > { > @@ -2197,10 +2205,15 @@ static void set_encodings(VncState *vs, int32_t > *encodings, size_t n_encodings) > send_ext_key_event_ack(vs); > break; > case VNC_ENCODING_AUDIO: > +#ifdef CONFIG_AUDIO > if (vs->vd->audio_be) { > vnc_set_feature(vs, VNC_FEATURE_AUDIO); > send_ext_audio_ack(vs); > } > +#else > + VNC_DEBUG("Audio encoding received with audio subsystem " > + "disabled\n"); > +#endif > break; > case VNC_ENCODING_WMVi: > vnc_set_feature(vs, VNC_FEATURE_WMVI); > @@ -2394,7 +2407,9 @@ static int protocol_client_msg(VncState *vs, uint8_t > *data, size_t len) > { > int i; > uint16_t limit; > - uint32_t freq; > + #ifdef CONFIG_AUDIO > + uint32_t freq; > + #endif Indentation is off > VncDisplay *vd = vs->vd; > > if (data[0] > 3) { > @@ -2571,7 +2586,9 @@ static int protocol_client_msg(VncState *vs, uint8_t > *data, size_t len) > vnc_client_error(vs); > break; > } > - > +#ifndef CONFIG_AUDIO > + abort(); I'd keep the if AUDIO case first, for consistency > +#else > if (len == 2) > return 4; > > @@ -2626,7 +2643,7 @@ static int protocol_client_msg(VncState *vs, uint8_t > *data, size_t len) > break; > } > break; > - > +#endif > default: > VNC_DEBUG("Msg: %d\n", read_u16(data, 0)); > vnc_client_error(vs); > @@ -3369,10 +3386,12 @@ static void vnc_connect(VncDisplay *vd, > QIOChannelSocket *sioc, > vs->last_x = -1; > vs->last_y = -1; > > +#ifdef CONFIG_AUDIO > vs->as.freq = 44100; > vs->as.nchannels = 2; > vs->as.fmt = AUDIO_FORMAT_S16; > vs->as.big_endian = false; > +#endif > > qemu_mutex_init(&vs->output_mutex); > vs->bh = qemu_bh_new(vnc_jobs_bh, vs); > @@ -3645,9 +3664,11 @@ static QemuOptsList qemu_vnc_opts = { > },{ > .name = "non-adaptive", > .type = QEMU_OPT_BOOL, > +#ifdef CONFIG_AUDIO > },{ > .name = "audiodev", > .type = QEMU_OPT_STRING, > +#endif > },{ > .name = "power-control", > .type = QEMU_OPT_BOOL, > @@ -4080,7 +4101,9 @@ void vnc_display_open(const char *id, Error **errp) > const char *saslauthz; > int lock_key_sync = 1; > int key_delay_ms; > +#ifdef CONFIG_AUDIO > const char *audiodev; > +#endif > const char *passwordSecret; > > if (!vd) { > @@ -4238,6 +4261,7 @@ void vnc_display_open(const char *id, Error **errp) > } > vd->ledstate = 0; > > +#ifdef CONFIG_AUDIO > audiodev = qemu_opt_get(opts, "audiodev"); > if (audiodev) { > vd->audio_be = audio_be_by_name(audiodev, errp); > @@ -4247,6 +4271,7 @@ void vnc_display_open(const char *id, Error **errp) > } else { > vd->audio_be = audio_get_default_audio_be(NULL); > } > +#endif > > device_id = qemu_opt_get(opts, "display"); > if (device_id) { > -- > 2.34.1 > > -- Marc-André Lureau
