dbus: add -audio dbus nsamples option

Allow to set the number of audio samples per read/write to dbus.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
This commit is contained in:
Marc-André Lureau 2025-01-24 17:29:24 +04:00
parent c0fb8e88cb
commit 19c628f2f5
3 changed files with 51 additions and 4 deletions

View File

@ -43,9 +43,10 @@
#define DBUS_DISPLAY1_AUDIO_PATH DBUS_DISPLAY1_ROOT "/Audio" #define DBUS_DISPLAY1_AUDIO_PATH DBUS_DISPLAY1_ROOT "/Audio"
#define DBUS_AUDIO_NSAMPLES 1024 /* could be configured? */ #define DBUS_DEFAULT_AUDIO_NSAMPLES 480
typedef struct DBusAudio { typedef struct DBusAudio {
Audiodev *dev;
GDBusObjectManagerServer *server; GDBusObjectManagerServer *server;
bool p2p; bool p2p;
GDBusObjectSkeleton *audio; GDBusObjectSkeleton *audio;
@ -151,6 +152,18 @@ dbus_init_out_listener(QemuDBusDisplay1AudioOutListener *listener,
G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL);
} }
static guint
dbus_audio_get_nsamples(DBusAudio *da)
{
AudiodevDBusOptions *opts = &da->dev->u.dbus;
if (opts->has_nsamples && opts->nsamples) {
return opts->nsamples;
} else {
return DBUS_DEFAULT_AUDIO_NSAMPLES;
}
}
static int static int
dbus_init_out(HWVoiceOut *hw, struct audsettings *as, void *drv_opaque) dbus_init_out(HWVoiceOut *hw, struct audsettings *as, void *drv_opaque)
{ {
@ -160,7 +173,7 @@ dbus_init_out(HWVoiceOut *hw, struct audsettings *as, void *drv_opaque)
QemuDBusDisplay1AudioOutListener *listener = NULL; QemuDBusDisplay1AudioOutListener *listener = NULL;
audio_pcm_init_info(&hw->info, as); audio_pcm_init_info(&hw->info, as);
hw->samples = DBUS_AUDIO_NSAMPLES; hw->samples = dbus_audio_get_nsamples(da);
audio_rate_start(&vo->rate); audio_rate_start(&vo->rate);
g_hash_table_iter_init(&iter, da->out_listeners); g_hash_table_iter_init(&iter, da->out_listeners);
@ -274,7 +287,7 @@ dbus_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque)
QemuDBusDisplay1AudioInListener *listener = NULL; QemuDBusDisplay1AudioInListener *listener = NULL;
audio_pcm_init_info(&hw->info, as); audio_pcm_init_info(&hw->info, as);
hw->samples = DBUS_AUDIO_NSAMPLES; hw->samples = dbus_audio_get_nsamples(da);
audio_rate_start(&vo->rate); audio_rate_start(&vo->rate);
g_hash_table_iter_init(&iter, da->in_listeners); g_hash_table_iter_init(&iter, da->in_listeners);
@ -399,6 +412,7 @@ dbus_audio_init(Audiodev *dev, Error **errp)
{ {
DBusAudio *da = g_new0(DBusAudio, 1); DBusAudio *da = g_new0(DBusAudio, 1);
da->dev = dev;
da->out_listeners = g_hash_table_new_full(g_str_hash, g_str_equal, da->out_listeners = g_hash_table_new_full(g_str_hash, g_str_equal,
g_free, g_object_unref); g_free, g_object_unref);
da->in_listeners = g_hash_table_new_full(g_str_hash, g_str_equal, da->in_listeners = g_hash_table_new_full(g_str_hash, g_str_equal,
@ -652,6 +666,7 @@ dbus_audio_set_server(AudioState *s, GDBusObjectManagerServer *server, bool p2p)
"swapped-signal::handle-register-out-listener", "swapped-signal::handle-register-out-listener",
dbus_audio_register_out_listener, s, dbus_audio_register_out_listener, s,
NULL); NULL);
qemu_dbus_display1_audio_set_nsamples(da->iface, dbus_audio_get_nsamples(da));
g_dbus_object_skeleton_add_interface(G_DBUS_OBJECT_SKELETON(da->audio), g_dbus_object_skeleton_add_interface(G_DBUS_OBJECT_SKELETON(da->audio),
G_DBUS_INTERFACE_SKELETON(da->iface)); G_DBUS_INTERFACE_SKELETON(da->iface));

View File

@ -65,6 +65,26 @@
'*in': 'AudiodevPerDirectionOptions', '*in': 'AudiodevPerDirectionOptions',
'*out': 'AudiodevPerDirectionOptions' } } '*out': 'AudiodevPerDirectionOptions' } }
##
# @AudiodevDBusOptions:
#
# Options of the D-Bus audio backend.
#
# @in: options of the capture stream
#
# @out: options of the playback stream
#
# @nsamples: set the number of samples per read/write calls (default to 480,
# 10ms at 48kHz).
#
# Since: 10.0
##
{ 'struct': 'AudiodevDBusOptions',
'data': {
'*in': 'AudiodevPerDirectionOptions',
'*out': 'AudiodevPerDirectionOptions',
'*nsamples': 'uint32'} }
## ##
# @AudiodevAlsaPerDirectionOptions: # @AudiodevAlsaPerDirectionOptions:
# #
@ -490,7 +510,7 @@
'if': 'CONFIG_AUDIO_ALSA' }, 'if': 'CONFIG_AUDIO_ALSA' },
'coreaudio': { 'type': 'AudiodevCoreaudioOptions', 'coreaudio': { 'type': 'AudiodevCoreaudioOptions',
'if': 'CONFIG_AUDIO_COREAUDIO' }, 'if': 'CONFIG_AUDIO_COREAUDIO' },
'dbus': { 'type': 'AudiodevGenericOptions', 'dbus': { 'type': 'AudiodevDBusOptions',
'if': 'CONFIG_DBUS_DISPLAY' }, 'if': 'CONFIG_DBUS_DISPLAY' },
'dsound': { 'type': 'AudiodevDsoundOptions', 'dsound': { 'type': 'AudiodevDsoundOptions',
'if': 'CONFIG_AUDIO_DSOUND' }, 'if': 'CONFIG_AUDIO_DSOUND' },

View File

@ -773,6 +773,18 @@
<?endif?> <?endif?>
</method> </method>
<!--
NSamples:
The number of samples per read/write frames. (for example the default is
480, or 10ms at 48kHz)
(earlier version of the display interface do not provide this property)
-->
<property name="NSamples" type="u" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<!-- <!--
Interfaces: Interfaces: