diff options
| -rw-r--r-- | src/modules/module-lirc.c | 6 | ||||
| -rw-r--r-- | src/modules/module-match.c | 2 | ||||
| -rw-r--r-- | src/modules/module-mmkbd-evdev.c | 4 | ||||
| -rw-r--r-- | src/modules/module-waveout.c | 4 | ||||
| -rw-r--r-- | src/modules/oss/oss-util.c | 4 | ||||
| -rw-r--r-- | src/pulse/volume.c | 20 | ||||
| -rw-r--r-- | src/pulse/volume.h | 3 | 
7 files changed, 24 insertions, 19 deletions
diff --git a/src/modules/module-lirc.c b/src/modules/module-lirc.c index e9778620..15f3442d 100644 --- a/src/modules/module-lirc.c +++ b/src/modules/module-lirc.c @@ -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."); diff --git a/src/modules/module-match.c b/src/modules/module-match.c index b1693f18..d83c86c3 100644 --- a/src/modules/module-match.c +++ b/src/modules/module-match.c @@ -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; diff --git a/src/modules/module-mmkbd-evdev.c b/src/modules/module-mmkbd-evdev.c index 193c1f40..4e89aed9 100644 --- a/src/modules/module-mmkbd-evdev.c +++ b/src/modules/module-mmkbd-evdev.c @@ -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)); diff --git a/src/modules/module-waveout.c b/src/modules/module-waveout.c index d1b9f2ff..6fedceb2 100644 --- a/src/modules/module-waveout.c +++ b/src/modules/module-waveout.c @@ -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) diff --git a/src/modules/oss/oss-util.c b/src/modules/oss/oss-util.c index b95023c3..966a6ca1 100644 --- a/src/modules/oss/oss-util.c +++ b/src/modules/oss/oss-util.c @@ -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; diff --git a/src/pulse/volume.c b/src/pulse/volume.c index 7d4951b4..f74d7202 100644 --- a/src/pulse/volume.c +++ b/src/pulse/volume.c @@ -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);          }      } diff --git a/src/pulse/volume.h b/src/pulse/volume.h index 9ef26f13..2f71a62c 100644 --- a/src/pulse/volume.h +++ b/src/pulse/volume.h @@ -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 */  | 
