[pulseaudio-discuss] [PATCH v2 1/3] alsa: Add "exact-channels" mapping configurability
Raymond Yau
superquad.vortex2 at gmail.com
Wed Jul 30 06:37:56 PDT 2014
>
> 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>
More information about the pulseaudio-discuss
mailing list