mirror of
				https://github.com/alsa-project/alsa-lib.git
				synced 2025-10-29 05:40:25 -04:00 
			
		
		
		
	snd_tlv_convert_from_dB: fix decreasing gain across entries
Currently, for a TLV consisting of TLV_DB_SCALE_ITEMs, if e.g. alsamixer calls snd_mixer_selem_set_playback_dB() with a value that is in-between two TLV_DB_SCALE_ITEMs, and xdir is negative, the selected raw hardware value is the minimum in the first range above that value, rather than the maximum in the last range below that value. The user-visible symptom is that in alsamixer, pressing the down key to reduce the value sticks at certain points, and cannot be incrementally reduced any further, although directly selecting a much lower value (e.g. by pressing 0..9) works as expected. This is triggered e.g. by sound/soc/codec/max98090.c's max98090_hp_tlv[]. Fix this by checking whether xdir is positive or not, rather than checking whether it has a non-zero value. The code to select the previous range's max value is already present. This matches how xdir is used in other parts of the code. Signed-off-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
		
							parent
							
								
									383912ef83
								
							
						
					
					
						commit
						529706fc32
					
				
					 1 changed files with 1 additions and 1 deletions
				
			
		|  | @ -312,7 +312,7 @@ int snd_tlv_convert_from_dB(unsigned int *tlv, long rangemin, long rangemax, | |||
| 							       submin, submax, | ||||
| 							       db_gain, value, xdir); | ||||
| 			else if (db_gain < dbmin) { | ||||
| 				*value = xdir || pos == 2 ? submin : prev_submax; | ||||
| 				*value = xdir > 0 || pos == 2 ? submin : prev_submax; | ||||
| 				return 0; | ||||
| 			} | ||||
| 			prev_submax = submax; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Stephen Warren
						Stephen Warren