> > Allow a mapping to relax the exact channel restriction: > > exact-channels = yes | no # If no, and the exact number of channels is not supported, > # allow device to be opened with another channel count Do you mean user have to define the mapping since these kind of devices usually support only playback channels >= 10 (even number) and capture channels >= 4 and does not support stereo ? What happen when user define a mapping of an odd number of channels which is not supported by the sound card ? > --- > src/modules/alsa/alsa-mixer.c | 43 +++++++++++++++++++++--- > src/modules/alsa/alsa-mixer.h | 1 + > src/modules/alsa/mixer/profile-sets/default.conf | 2 ++ > 3 files changed, 42 insertions(+), 4 deletions(-) > > diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c > index 58f9182..77c3c7e 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->exact_channels = true; > m->name = pa_xstrdup(name); > pa_sample_spec_init(&m->sample_spec); > pa_channel_map_init(&m->channel_map); > @@ -3485,6 +3486,30 @@ static int mapping_parse_paths(pa_config_parser_state *state) { > return 0; > } > > +static int mapping_parse_exact_channels(pa_config_parser_state *state) { > + pa_alsa_profile_set *ps; > + pa_alsa_mapping *m; > + int b; > + > + pa_assert(state); > + > + ps = state->userdata; > + > + if (!(m = pa_alsa_mapping_get(ps, state->section))) { > + pa_log("[%s:%u] %s invalid in section %s", state->filename, state->lineno, state->lvalue, state->section); > + return -1; > + } > + > + if ((b = pa_parse_boolean(state->rvalue)) < 0) { > + pa_log("[%s:%u] %s has invalid value '%s'", state->filename, state->lineno, state->lvalue, state->section); > + return -1; > + } > + > + m->exact_channels = b; > + > + return 0; > +} > + > static int mapping_parse_element(pa_config_parser_state *state) { > pa_alsa_profile_set *ps; > pa_alsa_mapping *m; > @@ -4156,6 +4181,7 @@ pa_alsa_profile_set* pa_alsa_profile_set_new(const char *fname, const pa_channel > { "element-input", mapping_parse_element, NULL, NULL }, > { "element-output", mapping_parse_element, NULL, NULL }, > { "direction", mapping_parse_direction, NULL, NULL }, > + { "exact-channels", mapping_parse_exact_channels, NULL, NULL }, > > /* Shared by [Mapping ...] and [Profile ...] */ > { "description", mapping_parse_description, NULL, NULL }, > @@ -4264,10 +4290,12 @@ static void profile_finalize_probing(pa_alsa_profile *to_be_finalized, pa_alsa_p > static snd_pcm_t* mapping_open_pcm(pa_alsa_mapping *m, > const pa_sample_spec *ss, > const char *dev_id, > + bool exact_channels, > int mode, > unsigned default_n_fragments, > unsigned default_fragment_size_msec) { > > + snd_pcm_t* handle; > pa_sample_spec try_ss = *ss; > pa_channel_map try_map = m->channel_map; > snd_pcm_uframes_t try_period_size, try_buffer_size; > @@ -4279,10 +4307,17 @@ static snd_pcm_t* mapping_open_pcm(pa_alsa_mapping *m, > pa_frame_size(&try_ss); > try_buffer_size = default_n_fragments * try_period_size; > > - return pa_alsa_open_by_template( > + handle = pa_alsa_open_by_template( > m->device_strings, dev_id, NULL, &try_ss, > &try_map, mode, &try_period_size, > - &try_buffer_size, 0, NULL, NULL, true); > + &try_buffer_size, 0, NULL, NULL, exact_channels); > + if (handle && !exact_channels && m->channel_map.channels != try_map.channels) { > + char buf[PA_CHANNEL_MAP_SNPRINT_MAX]; > + pa_log_debug("Channel map for mapping '%s' permanently changed to '%s'", m->name, > + pa_channel_map_snprint(buf, sizeof(buf), &try_map)); > + m->channel_map = try_map; > + } > + return handle; > } > -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.freedesktop.org/archives/pulseaudio-discuss/attachments/20140730/c67bd5ae/attachment-0001.html>