Valid channel id range is from 0 to SND_MIXER_SCHN_LAST,
inclusive, so the size of the masks array in pa_alsa_element
has to be SND_MIXER_SCHN_LAST + 1. Similar "too small"
arrays were also in alsa-sink's and alsa-source's userdata,
but actually those arrays were not used at all so they were
removed.
element_is_subset() in alsa-mixer.c skipped the last channel
id when iterating the element masks array; that's now fixed
as well.
Thanks to David Henningsson for spotting the too small
arrays in alsa-sink and alsa-source and the
element_is_subset() problem.
*
* The definition of e->masks is
*
*
* The definition of e->masks is
*
- * pa_channel_position_mask_t masks[SND_MIXER_SCHN_LAST][2];
+ * pa_channel_position_mask_t masks[SND_MIXER_SCHN_LAST + 1][2];
*
* Since the array size is fixed at 2, we obviously
* don't support elements with more than two
*
* Since the array size is fixed at 2, we obviously
* don't support elements with more than two
/* If override-maps are different, they're not subsets */
if (a->n_channels != b->n_channels)
return FALSE;
/* If override-maps are different, they're not subsets */
if (a->n_channels != b->n_channels)
return FALSE;
- for (s = 0; s < SND_MIXER_SCHN_LAST; s++)
+ for (s = 0; s <= SND_MIXER_SCHN_LAST; s++)
if (a->masks[s][a->n_channels-1] != b->masks[s][b->n_channels-1]) {
pa_log_debug("Element %s is not a subset - mask a: 0x%" PRIx64 ", mask b: 0x%" PRIx64 ", at channel %d",
a->alsa_name, a->masks[s][a->n_channels-1], b->masks[s][b->n_channels-1], s);
if (a->masks[s][a->n_channels-1] != b->masks[s][b->n_channels-1]) {
pa_log_debug("Element %s is not a subset - mask a: 0x%" PRIx64 ", mask b: 0x%" PRIx64 ", at channel %d",
a->alsa_name, a->masks[s][a->n_channels-1], b->masks[s][b->n_channels-1], s);
long volume_limit; /* -1 for no configured limit */
double min_dB, max_dB;
long volume_limit; /* -1 for no configured limit */
double min_dB, max_dB;
- pa_channel_position_mask_t masks[SND_MIXER_SCHN_LAST][2];
+ pa_channel_position_mask_t masks[SND_MIXER_SCHN_LAST + 1][2];
unsigned n_channels;
pa_channel_position_mask_t merged_mask;
unsigned n_channels;
pa_channel_position_mask_t merged_mask;
pa_rtpoll_item *alsa_rtpoll_item;
pa_rtpoll_item *alsa_rtpoll_item;
- snd_mixer_selem_channel_id_t mixer_map[SND_MIXER_SCHN_LAST];
-
pa_smoother *smoother;
uint64_t write_count;
uint64_t since_start;
pa_smoother *smoother;
uint64_t write_count;
uint64_t since_start;
pa_rtpoll_item *alsa_rtpoll_item;
pa_rtpoll_item *alsa_rtpoll_item;
- snd_mixer_selem_channel_id_t mixer_map[SND_MIXER_SCHN_LAST];
-
pa_smoother *smoother;
uint64_t read_count;
pa_usec_t smoother_interval;
pa_smoother *smoother;
uint64_t read_count;
pa_usec_t smoother_interval;