mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	volume: Clamp volume to PA_VOLUME_MAX
This ensures that we always clamp the volume to PA_VOLUME_MAX. While this currently has no effect, it will be required for making sure we don't exceed PA_VOLUME_MAX when its value changes in the future.
This commit is contained in:
		
							parent
							
								
									1d2ef7923d
								
							
						
					
					
						commit
						49101fc540
					
				
					 7 changed files with 24 additions and 19 deletions
				
			
		| 
						 | 
				
			
			@ -172,7 +172,7 @@ fail:
 | 
			
		|||
int pa__init(pa_module*m) {
 | 
			
		||||
    pa_modargs *ma = NULL;
 | 
			
		||||
    struct userdata *u;
 | 
			
		||||
    pa_volume_t volume_limit = PA_VOLUME_NORM*3/2;
 | 
			
		||||
    pa_volume_t volume_limit = PA_CLAMP_VOLUME(PA_VOLUME_NORM*3/2);
 | 
			
		||||
    pa_volume_t volume_step = PA_VOLUME_NORM/20;
 | 
			
		||||
 | 
			
		||||
    pa_assert(m);
 | 
			
		||||
| 
						 | 
				
			
			@ -199,8 +199,8 @@ int pa__init(pa_module*m) {
 | 
			
		|||
    u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL));
 | 
			
		||||
    u->lirc_fd = -1;
 | 
			
		||||
    u->mute_toggle_save = 0;
 | 
			
		||||
    u->volume_limit = volume_limit;
 | 
			
		||||
    u->volume_step = volume_step;
 | 
			
		||||
    u->volume_limit = PA_CLAMP_VOLUME(volume_limit);
 | 
			
		||||
    u->volume_step = PA_CLAMP_VOLUME(volume_step);
 | 
			
		||||
 | 
			
		||||
    if ((u->lirc_fd = lirc_init((char*) pa_modargs_get_value(ma, "appname", "pulseaudio"), 1)) < 0) {
 | 
			
		||||
        pa_log("lirc_init() failed.");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -127,7 +127,7 @@ static int load_rules(struct userdata *u, const char *filename) {
 | 
			
		|||
 | 
			
		||||
        *d = 0;
 | 
			
		||||
        if (pa_atou(v, &k) >= 0) {
 | 
			
		||||
            volume = (pa_volume_t) k;
 | 
			
		||||
            volume = (pa_volume_t) PA_CLAMP_VOLUME(k);
 | 
			
		||||
        } else if (*v == '"') {
 | 
			
		||||
            char *e;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -188,8 +188,8 @@ int pa__init(pa_module*m) {
 | 
			
		|||
    u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL));
 | 
			
		||||
    u->fd = -1;
 | 
			
		||||
    u->fd_type = 0;
 | 
			
		||||
    u->volume_limit = volume_limit;
 | 
			
		||||
    u->volume_step = volume_step;
 | 
			
		||||
    u->volume_limit = PA_CLAMP_VOLUME(volume_limit);
 | 
			
		||||
    u->volume_step = PA_CLAMP_VOLUME(volume_step);
 | 
			
		||||
 | 
			
		||||
    if ((u->fd = pa_open_cloexec(pa_modargs_get_value(ma, "device", DEFAULT_DEVICE), O_RDONLY, 0)) < 0) {
 | 
			
		||||
        pa_log("Failed to open evdev device: %s", pa_cstrerror(errno));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -359,8 +359,8 @@ static int sink_get_hw_volume_cb(pa_sink *s) {
 | 
			
		|||
    if (waveOutGetVolume(u->hwo, &vol) != MMSYSERR_NOERROR)
 | 
			
		||||
        return -1;
 | 
			
		||||
 | 
			
		||||
    left = (vol & 0xFFFF) * PA_VOLUME_NORM / WAVEOUT_MAX_VOLUME;
 | 
			
		||||
    right = ((vol >> 16) & 0xFFFF) * PA_VOLUME_NORM / WAVEOUT_MAX_VOLUME;
 | 
			
		||||
    left = PA_CLAMP_VOLUME((vol & 0xFFFF) * PA_VOLUME_NORM / WAVEOUT_MAX_VOLUME);
 | 
			
		||||
    right = PA_CLAMP_VOLUME(((vol >> 16) & 0xFFFF) * PA_VOLUME_NORM / WAVEOUT_MAX_VOLUME);
 | 
			
		||||
 | 
			
		||||
    /* Windows supports > 2 channels, except for volume control */
 | 
			
		||||
    if (s->hw_volume.channels > 2)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -271,10 +271,10 @@ int pa_oss_get_volume(int fd, unsigned long mixer, const pa_sample_spec *ss, pa_
 | 
			
		|||
 | 
			
		||||
    pa_cvolume_reset(volume, ss->channels);
 | 
			
		||||
 | 
			
		||||
    volume->values[0] = ((vol & 0xFF) * PA_VOLUME_NORM) / 100;
 | 
			
		||||
    volume->values[0] = PA_CLAMP_VOLUME(((vol & 0xFF) * PA_VOLUME_NORM) / 100);
 | 
			
		||||
 | 
			
		||||
    if (volume->channels >= 2)
 | 
			
		||||
        volume->values[1] = (((vol >> 8) & 0xFF) * PA_VOLUME_NORM) / 100;
 | 
			
		||||
        volume->values[1] = PA_CLAMP_VOLUME((((vol >> 8) & 0xFF) * PA_VOLUME_NORM) / 100);
 | 
			
		||||
 | 
			
		||||
    pa_log_debug("Read mixer settings: %s", pa_cvolume_snprint(cv, sizeof(cv), volume));
 | 
			
		||||
    return 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -79,7 +79,9 @@ pa_cvolume* pa_cvolume_set(pa_cvolume *a, unsigned channels, pa_volume_t v) {
 | 
			
		|||
    a->channels = (uint8_t) channels;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < a->channels; i++)
 | 
			
		||||
        a->values[i] = v;
 | 
			
		||||
        /* Clamp in case there is stale data that exceeds the current
 | 
			
		||||
         * PA_VOLUME_MAX */
 | 
			
		||||
        a->values[i] = PA_CLAMP_VOLUME(v);
 | 
			
		||||
 | 
			
		||||
    return a;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -206,7 +208,7 @@ pa_volume_t pa_sw_volume_multiply(pa_volume_t a, pa_volume_t b) {
 | 
			
		|||
 | 
			
		||||
    /* cbrt((a/PA_VOLUME_NORM)^3*(b/PA_VOLUME_NORM)^3)*PA_VOLUME_NORM = a*b/PA_VOLUME_NORM */
 | 
			
		||||
 | 
			
		||||
    return (pa_volume_t) (((uint64_t) a * (uint64_t) b + (uint64_t) PA_VOLUME_NORM / 2ULL) / (uint64_t) PA_VOLUME_NORM);
 | 
			
		||||
    return (pa_volume_t) PA_CLAMP_VOLUME((((uint64_t) a * (uint64_t) b + (uint64_t) PA_VOLUME_NORM / 2ULL) / (uint64_t) PA_VOLUME_NORM));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pa_volume_t pa_sw_volume_divide(pa_volume_t a, pa_volume_t b) {
 | 
			
		||||
| 
						 | 
				
			
			@ -261,7 +263,7 @@ pa_volume_t pa_sw_volume_from_linear(double v) {
 | 
			
		|||
     * same volume value! That's why we need the lround() below!
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    return (pa_volume_t) lround(cbrt(v) * PA_VOLUME_NORM);
 | 
			
		||||
    return (pa_volume_t) PA_CLAMP_VOLUME(lround(cbrt(v) * PA_VOLUME_NORM));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
double pa_sw_volume_to_linear(pa_volume_t v) {
 | 
			
		||||
| 
						 | 
				
			
			@ -667,12 +669,12 @@ pa_cvolume* pa_cvolume_set_balance(pa_cvolume *v, const pa_channel_map *map, flo
 | 
			
		|||
            if (left == 0)
 | 
			
		||||
                v->values[c] = nleft;
 | 
			
		||||
            else
 | 
			
		||||
                v->values[c] = (pa_volume_t) (((uint64_t) v->values[c] * (uint64_t) nleft) / (uint64_t) left);
 | 
			
		||||
                v->values[c] = (pa_volume_t) PA_CLAMP_VOLUME(((uint64_t) v->values[c] * (uint64_t) nleft) / (uint64_t) left);
 | 
			
		||||
        } else if (on_right(map->map[c])) {
 | 
			
		||||
            if (right == 0)
 | 
			
		||||
                v->values[c] = nright;
 | 
			
		||||
            else
 | 
			
		||||
                v->values[c] = (pa_volume_t) (((uint64_t) v->values[c] * (uint64_t) nright) / (uint64_t) right);
 | 
			
		||||
                v->values[c] = (pa_volume_t) PA_CLAMP_VOLUME(((uint64_t) v->values[c] * (uint64_t) nright) / (uint64_t) right);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -694,7 +696,7 @@ pa_cvolume* pa_cvolume_scale(pa_cvolume *v, pa_volume_t max) {
 | 
			
		|||
        return pa_cvolume_set(v, v->channels, max);
 | 
			
		||||
 | 
			
		||||
    for (c = 0; c < v->channels; c++)
 | 
			
		||||
        v->values[c] = (pa_volume_t) (((uint64_t)  v->values[c] * (uint64_t) max) / (uint64_t) t);
 | 
			
		||||
        v->values[c] = (pa_volume_t) PA_CLAMP_VOLUME(((uint64_t) v->values[c] * (uint64_t) max) / (uint64_t) t);
 | 
			
		||||
 | 
			
		||||
    return v;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -718,7 +720,7 @@ pa_cvolume* pa_cvolume_scale_mask(pa_cvolume *v, pa_volume_t max, pa_channel_map
 | 
			
		|||
        return pa_cvolume_set(v, v->channels, max);
 | 
			
		||||
 | 
			
		||||
    for (c = 0; c < v->channels; c++)
 | 
			
		||||
        v->values[c] = (pa_volume_t) (((uint64_t)  v->values[c] * (uint64_t) max) / (uint64_t) t);
 | 
			
		||||
        v->values[c] = (pa_volume_t) PA_CLAMP_VOLUME(((uint64_t)  v->values[c] * (uint64_t) max) / (uint64_t) t);
 | 
			
		||||
 | 
			
		||||
    return v;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -808,12 +810,12 @@ pa_cvolume* pa_cvolume_set_fade(pa_cvolume *v, const pa_channel_map *map, float
 | 
			
		|||
            if (front == 0)
 | 
			
		||||
                v->values[c] = nfront;
 | 
			
		||||
            else
 | 
			
		||||
                v->values[c] = (pa_volume_t) (((uint64_t) v->values[c] * (uint64_t) nfront) / (uint64_t) front);
 | 
			
		||||
                v->values[c] = (pa_volume_t) PA_CLAMP_VOLUME(((uint64_t) v->values[c] * (uint64_t) nfront) / (uint64_t) front);
 | 
			
		||||
        } else if (on_rear(map->map[c])) {
 | 
			
		||||
            if (rear == 0)
 | 
			
		||||
                v->values[c] = nrear;
 | 
			
		||||
            else
 | 
			
		||||
                v->values[c] = (pa_volume_t) (((uint64_t) v->values[c] * (uint64_t) nrear) / (uint64_t) rear);
 | 
			
		||||
                v->values[c] = (pa_volume_t) PA_CLAMP_VOLUME(((uint64_t) v->values[c] * (uint64_t) nrear) / (uint64_t) rear);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -121,6 +121,9 @@ typedef uint32_t pa_volume_t;
 | 
			
		|||
/** Check if volume is valid. \since 0.9.22 */
 | 
			
		||||
#define PA_VOLUME_IS_VALID(v) ((v) <= PA_VOLUME_MAX)
 | 
			
		||||
 | 
			
		||||
/** Clamp volume to the permitted range. \since 0.9.22 */
 | 
			
		||||
#define PA_CLAMP_VOLUME(v) (PA_CLAMP_UNLIKELY((v), PA_VOLUME_MUTED, PA_VOLUME_MAX))
 | 
			
		||||
 | 
			
		||||
/** A structure encapsulating a per-channel volume */
 | 
			
		||||
typedef struct pa_cvolume {
 | 
			
		||||
    uint8_t channels;                     /**< Number of channels */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue