diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c index 8c95b1c89..71dfa7975 100644 --- a/src/modules/alsa/alsa-mixer.c +++ b/src/modules/alsa/alsa-mixer.c @@ -3368,6 +3368,7 @@ pa_alsa_mapping *pa_alsa_mapping_get(pa_alsa_profile_set *ps, const char *name) m = pa_xnew0(pa_alsa_mapping, 1); m->profile_set = ps; m->name = pa_xstrdup(name); + pa_sample_spec_init(&m->sample_spec); pa_channel_map_init(&m->channel_map); m->proplist = pa_proplist_new(); diff --git a/src/modules/alsa/alsa-mixer.h b/src/modules/alsa/alsa-mixer.h index 432e4de78..995a34ba0 100644 --- a/src/modules/alsa/alsa-mixer.h +++ b/src/modules/alsa/alsa-mixer.h @@ -251,6 +251,7 @@ struct pa_alsa_mapping { /* These are copied over to the resultant sink/source */ pa_proplist *proplist; + pa_sample_spec sample_spec; pa_channel_map channel_map; char **device_strings; diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c index 6e6064655..d3d5b19a3 100644 --- a/src/modules/alsa/alsa-sink.c +++ b/src/modules/alsa/alsa-sink.c @@ -2030,6 +2030,19 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca ss = m->core->default_sample_spec; map = m->core->default_channel_map; + + /* Pick sample spec overrides from the mapping, if any */ + if (mapping->sample_spec.format != PA_SAMPLE_INVALID) + ss.format = mapping->sample_spec.format; + if (mapping->sample_spec.rate != 0) + ss.rate = mapping->sample_spec.rate; + if (mapping->sample_spec.channels != 0) { + ss.channels = mapping->sample_spec.channels; + if (pa_channel_map_valid(&mapping->channel_map)) + pa_assert(pa_channel_map_compatible(&mapping->channel_map, &ss)); + } + + /* Override with modargs if provided */ if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_ALSA) < 0) { pa_log("Failed to parse sample specification and channel map"); goto fail; diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c index 78125b1de..8416ba8ae 100644 --- a/src/modules/alsa/alsa-source.c +++ b/src/modules/alsa/alsa-source.c @@ -1740,6 +1740,19 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p ss = m->core->default_sample_spec; map = m->core->default_channel_map; + + /* Pick sample spec overrides from the mapping, if any */ + if (mapping->sample_spec.format != PA_SAMPLE_INVALID) + ss.format = mapping->sample_spec.format; + if (mapping->sample_spec.rate != 0) + ss.rate = mapping->sample_spec.rate; + if (mapping->sample_spec.channels != 0) { + ss.channels = mapping->sample_spec.channels; + if (pa_channel_map_valid(&mapping->channel_map)) + pa_assert(pa_channel_map_compatible(&mapping->channel_map, &ss)); + } + + /* Override with modargs if provided */ if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_ALSA) < 0) { pa_log("Failed to parse sample specification and channel map"); goto fail;