From 24755afee99dbe5ab2018f28369f198e8b97ec72 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 29 Jul 2020 14:42:29 +0200 Subject: [PATCH] pulse: use format from node if available And fall back to some defaults otherwise. --- pipewire-pulseaudio/src/context.c | 2 ++ pipewire-pulseaudio/src/introspect.c | 42 +++++++++++++++++----------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/pipewire-pulseaudio/src/context.c b/pipewire-pulseaudio/src/context.c index e9ea14b18..f5ba494c2 100644 --- a/pipewire-pulseaudio/src/context.c +++ b/pipewire-pulseaudio/src/context.c @@ -1103,6 +1103,8 @@ static int set_mask(pa_context *c, struct global *g) g->node_info.device_id = SPA_ID_INVALID; ginfo = &node_info; + g->node_info.sample_spec.format = PA_SAMPLE_S16NE; + g->node_info.sample_spec.rate = 44100; g->node_info.volume = 1.0f; g->node_info.mute = false; g->node_info.base_volume = 1.0f; diff --git a/pipewire-pulseaudio/src/introspect.c b/pipewire-pulseaudio/src/introspect.c index 497281536..10f5cb7cb 100644 --- a/pipewire-pulseaudio/src/introspect.c +++ b/pipewire-pulseaudio/src/introspect.c @@ -104,13 +104,15 @@ static int sink_callback(pa_context *c, struct global *g, struct sink_data *d) else i.description = "Unknown"; - i.sample_spec.format = PA_SAMPLE_S16LE; - i.sample_spec.rate = 44100; + i.sample_spec = g->node_info.sample_spec; if (g->node_info.n_channel_volumes) i.sample_spec.channels = g->node_info.n_channel_volumes; else i.sample_spec.channels = 2; - pa_channel_map_init_auto(&i.channel_map, i.sample_spec.channels, PA_CHANNEL_MAP_OSS); + if (i.sample_spec.channels == g->node_info.channel_map.channels) + i.channel_map = g->node_info.channel_map; + else + pa_channel_map_init_auto(&i.channel_map, i.sample_spec.channels, PA_CHANNEL_MAP_OSS); i.owner_module = 0; i.volume.channels = i.sample_spec.channels; for (n = 0; n < i.volume.channels; n++) @@ -843,13 +845,15 @@ static int source_callback(pa_context *c, struct global *g, struct source_data * i.description = str; else i.description = "unknown"; - i.sample_spec.format = PA_SAMPLE_S16LE; - i.sample_spec.rate = 44100; + i.sample_spec = g->node_info.sample_spec; if (g->node_info.n_channel_volumes) i.sample_spec.channels = g->node_info.n_channel_volumes; else i.sample_spec.channels = 2; - pa_channel_map_init_auto(&i.channel_map, i.sample_spec.channels, PA_CHANNEL_MAP_OSS); + if (i.sample_spec.channels == g->node_info.channel_map.channels) + i.channel_map = g->node_info.channel_map; + else + pa_channel_map_init_auto(&i.channel_map, i.sample_spec.channels, PA_CHANNEL_MAP_OSS); i.owner_module = 0; i.volume.channels = i.sample_spec.channels; for (n = 0; n < i.volume.channels; n++) @@ -1913,12 +1917,15 @@ static int sink_input_callback(pa_context *c, struct sink_input_data *d, struct i.format = s->format; } else { - i.sample_spec.format = PA_SAMPLE_S16LE; - i.sample_spec.rate = 44100; - i.sample_spec.channels = g->node_info.n_channel_volumes; - if (i.sample_spec.channels == 0) + i.sample_spec = g->node_info.sample_spec; + if (g->node_info.n_channel_volumes) + i.sample_spec.channels = g->node_info.n_channel_volumes; + else i.sample_spec.channels = 2; - pa_channel_map_init_auto(&i.channel_map, i.sample_spec.channels, PA_CHANNEL_MAP_OSS); + if (i.sample_spec.channels == g->node_info.channel_map.channels) + i.channel_map = g->node_info.channel_map; + else + pa_channel_map_init_auto(&i.channel_map, i.sample_spec.channels, PA_CHANNEL_MAP_OSS); ii[0].encoding = PA_ENCODING_PCM; ii[0].plist = pa_proplist_new(); i.format = ii; @@ -2324,12 +2331,15 @@ static int source_output_callback(struct source_output_data *d, pa_context *c, s i.format = s->format; } else { - i.sample_spec.format = PA_SAMPLE_S16LE; - i.sample_spec.rate = 44100; - i.sample_spec.channels = g->node_info.n_channel_volumes; - if (i.sample_spec.channels == 0) + i.sample_spec = g->node_info.sample_spec; + if (g->node_info.n_channel_volumes) + i.sample_spec.channels = g->node_info.n_channel_volumes; + else i.sample_spec.channels = 2; - pa_channel_map_init_auto(&i.channel_map, i.sample_spec.channels, PA_CHANNEL_MAP_OSS); + if (i.sample_spec.channels == g->node_info.channel_map.channels) + i.channel_map = g->node_info.channel_map; + else + pa_channel_map_init_auto(&i.channel_map, i.sample_spec.channels, PA_CHANNEL_MAP_OSS); ii[0].encoding = PA_ENCODING_PCM; ii[0].plist = pa_proplist_new(); i.format = ii;