mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	alsa: Fix SND_MIXER_SCHN_LAST related stuff.
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.
This commit is contained in:
		
							parent
							
								
									191d60688d
								
							
						
					
					
						commit
						5a26404f12
					
				
					 4 changed files with 3 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -1577,7 +1577,7 @@ static int element_probe(pa_alsa_element *e, snd_mixer_t *m) {
 | 
			
		|||
                         *
 | 
			
		||||
                         * 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
 | 
			
		||||
| 
						 | 
				
			
			@ -3105,7 +3105,7 @@ static pa_bool_t element_is_subset(pa_alsa_element *a, pa_alsa_element *b, snd_m
 | 
			
		|||
            /* 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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -145,7 +145,7 @@ struct pa_alsa_element {
 | 
			
		|||
    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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -140,8 +140,6 @@ struct userdata {
 | 
			
		|||
 | 
			
		||||
    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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -127,8 +127,6 @@ struct userdata {
 | 
			
		|||
 | 
			
		||||
    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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue