pulse: use format from node if available

And fall back to some defaults otherwise.
This commit is contained in:
Wim Taymans 2020-07-29 14:42:29 +02:00
parent 18b4aee677
commit 24755afee9
2 changed files with 28 additions and 16 deletions

View file

@ -1103,6 +1103,8 @@ static int set_mask(pa_context *c, struct global *g)
g->node_info.device_id = SPA_ID_INVALID; g->node_info.device_id = SPA_ID_INVALID;
ginfo = &node_info; 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.volume = 1.0f;
g->node_info.mute = false; g->node_info.mute = false;
g->node_info.base_volume = 1.0f; g->node_info.base_volume = 1.0f;

View file

@ -104,12 +104,14 @@ static int sink_callback(pa_context *c, struct global *g, struct sink_data *d)
else else
i.description = "Unknown"; i.description = "Unknown";
i.sample_spec.format = PA_SAMPLE_S16LE; i.sample_spec = g->node_info.sample_spec;
i.sample_spec.rate = 44100;
if (g->node_info.n_channel_volumes) if (g->node_info.n_channel_volumes)
i.sample_spec.channels = g->node_info.n_channel_volumes; i.sample_spec.channels = g->node_info.n_channel_volumes;
else else
i.sample_spec.channels = 2; i.sample_spec.channels = 2;
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); pa_channel_map_init_auto(&i.channel_map, i.sample_spec.channels, PA_CHANNEL_MAP_OSS);
i.owner_module = 0; i.owner_module = 0;
i.volume.channels = i.sample_spec.channels; i.volume.channels = i.sample_spec.channels;
@ -843,12 +845,14 @@ static int source_callback(pa_context *c, struct global *g, struct source_data *
i.description = str; i.description = str;
else else
i.description = "unknown"; i.description = "unknown";
i.sample_spec.format = PA_SAMPLE_S16LE; i.sample_spec = g->node_info.sample_spec;
i.sample_spec.rate = 44100;
if (g->node_info.n_channel_volumes) if (g->node_info.n_channel_volumes)
i.sample_spec.channels = g->node_info.n_channel_volumes; i.sample_spec.channels = g->node_info.n_channel_volumes;
else else
i.sample_spec.channels = 2; i.sample_spec.channels = 2;
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); pa_channel_map_init_auto(&i.channel_map, i.sample_spec.channels, PA_CHANNEL_MAP_OSS);
i.owner_module = 0; i.owner_module = 0;
i.volume.channels = i.sample_spec.channels; i.volume.channels = i.sample_spec.channels;
@ -1913,11 +1917,14 @@ static int sink_input_callback(pa_context *c, struct sink_input_data *d, struct
i.format = s->format; i.format = s->format;
} }
else { else {
i.sample_spec.format = PA_SAMPLE_S16LE; i.sample_spec = g->node_info.sample_spec;
i.sample_spec.rate = 44100; if (g->node_info.n_channel_volumes)
i.sample_spec.channels = g->node_info.n_channel_volumes; i.sample_spec.channels = g->node_info.n_channel_volumes;
if (i.sample_spec.channels == 0) else
i.sample_spec.channels = 2; i.sample_spec.channels = 2;
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); pa_channel_map_init_auto(&i.channel_map, i.sample_spec.channels, PA_CHANNEL_MAP_OSS);
ii[0].encoding = PA_ENCODING_PCM; ii[0].encoding = PA_ENCODING_PCM;
ii[0].plist = pa_proplist_new(); ii[0].plist = pa_proplist_new();
@ -2324,11 +2331,14 @@ static int source_output_callback(struct source_output_data *d, pa_context *c, s
i.format = s->format; i.format = s->format;
} }
else { else {
i.sample_spec.format = PA_SAMPLE_S16LE; i.sample_spec = g->node_info.sample_spec;
i.sample_spec.rate = 44100; if (g->node_info.n_channel_volumes)
i.sample_spec.channels = g->node_info.n_channel_volumes; i.sample_spec.channels = g->node_info.n_channel_volumes;
if (i.sample_spec.channels == 0) else
i.sample_spec.channels = 2; i.sample_spec.channels = 2;
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); pa_channel_map_init_auto(&i.channel_map, i.sample_spec.channels, PA_CHANNEL_MAP_OSS);
ii[0].encoding = PA_ENCODING_PCM; ii[0].encoding = PA_ENCODING_PCM;
ii[0].plist = pa_proplist_new(); ii[0].plist = pa_proplist_new();