pa_volume_t pa_cvolume_avg_mask(const pa_cvolume *a, const pa_channel_map *cm, pa_channel_position_mask_t mask) { uint64_t sum = 0; unsigned c, n; pa_assert(a); if (!cm) return pa_cvolume_avg(a); pa_return_val_if_fail(pa_cvolume_compatible_with_channel_map(a, cm), PA_VOLUME_MUTED); for (c = n = 0; c < a->channels; c++) { if (!(PA_CHANNEL_POSITION_MASK(cm->map[c]) & mask)) continue; sum += a->values[c]; n ++; } if (n > 0) sum /= n; return (pa_volume_t) sum; }
pa_channel_position_mask_t pa_channel_map_mask(const pa_channel_map *map) { unsigned c; pa_channel_position_mask_t r = 0; pa_return_val_if_fail(pa_channel_map_valid(map), 0); for (c = 0; c < map->channels; c++) r |= PA_CHANNEL_POSITION_MASK(map->map[c]); return r; }
pa_volume_t pa_cvolume_min_mask(const pa_cvolume *a, const pa_channel_map *cm, pa_channel_position_mask_t mask) { pa_volume_t m = PA_VOLUME_MAX; unsigned c; pa_assert(a); if (!cm) return pa_cvolume_min(a); pa_return_val_if_fail(pa_cvolume_compatible_with_channel_map(a, cm), PA_VOLUME_MUTED); for (c = 0; c < a->channels; c++) { if (!(PA_CHANNEL_POSITION_MASK(cm->map[c]) & mask)) continue; if (a->values[c] < m) m = a->values[c]; } return m; }
static pa_bool_t on_rear(pa_channel_position_t p) { return !!(PA_CHANNEL_POSITION_MASK(p) & PA_CHANNEL_POSITION_MASK_REAR); }
static pa_bool_t on_front(pa_channel_position_t p) { return !!(PA_CHANNEL_POSITION_MASK(p) & PA_CHANNEL_POSITION_MASK_FRONT); }
static pa_bool_t on_center(pa_channel_position_t p) { return !!(PA_CHANNEL_POSITION_MASK(p) & PA_CHANNEL_POSITION_MASK_CENTER); }
static pa_bool_t on_right(pa_channel_position_t p) { return !!(PA_CHANNEL_POSITION_MASK(p) & PA_CHANNEL_POSITION_MASK_RIGHT); }
static pa_bool_t on_left(pa_channel_position_t p) { return !!(PA_CHANNEL_POSITION_MASK(p) & PA_CHANNEL_POSITION_MASK_LEFT); }
static bool on_lfe(pa_channel_position_t p) { return !!(PA_CHANNEL_POSITION_MASK(p) & PA_CHANNEL_POSITION_MASK_LFE); }