pa_cvolume *pa_cvolume_remap(pa_cvolume *v, const pa_channel_map *from, const pa_channel_map *to) { int a, b; pa_cvolume result; pa_assert(v); pa_assert(from); pa_assert(to); pa_return_val_if_fail(pa_channel_map_valid(to), NULL); pa_return_val_if_fail(pa_cvolume_compatible_with_channel_map(v, from), NULL); if (pa_channel_map_equal(from, to)) return v; result.channels = to->channels; for (b = 0; b < to->channels; b++) { pa_volume_t k = 0; int n = 0; for (a = 0; a < from->channels; a++) if (from->map[a] == to->map[b]) { k += v->values[a]; n ++; } if (n <= 0) { for (a = 0; a < from->channels; a++) if ((on_left(from->map[a]) && on_left(to->map[b])) || (on_right(from->map[a]) && on_right(to->map[b])) || (on_center(from->map[a]) && on_center(to->map[b])) || (on_lfe(from->map[a]) && on_lfe(to->map[b]))) { k += v->values[a]; n ++; } } if (n <= 0) k = pa_cvolume_avg(v); else k /= n; result.values[b] = k; } *v = result; return v; }
static void get_avg_lr(const pa_channel_map *map, const pa_cvolume *v, pa_volume_t *l, pa_volume_t *r) { int c; pa_volume_t left = 0, right = 0; unsigned n_left = 0, n_right = 0; pa_assert(v); pa_assert(map); pa_assert(map->channels == v->channels); pa_assert(l); pa_assert(r); for (c = 0; c < map->channels; c++) { if (on_left(map->map[c])) { left += v->values[c]; n_left++; } else if (on_right(map->map[c])) { right += v->values[c]; n_right++; } } if (n_left <= 0) *l = PA_VOLUME_NORM; else *l = left / n_left; if (n_right <= 0) *r = PA_VOLUME_NORM; else *r = right / n_right; }
static int parent(int n) { int h = height(n); if (on_right(n, h)) return n - (1<<h); else return n + (1<<h); }
bool WndButton::OnKeyDown(unsigned key_code) { switch (key_code) { case VK_LEFT: return on_left(); case VK_RIGHT: return on_right(); } return ButtonWindow::OnKeyDown(key_code); }
pa_cvolume* pa_cvolume_set_balance(pa_cvolume *v, const pa_channel_map *map, float new_balance) { pa_volume_t left, nleft, right, nright, m; unsigned c; pa_assert(map); pa_assert(v); pa_return_val_if_fail(pa_cvolume_compatible_with_channel_map(v, map), NULL); pa_return_val_if_fail(new_balance >= -1.0f, NULL); pa_return_val_if_fail(new_balance <= 1.0f, NULL); if (!pa_channel_map_can_balance(map)) return v; get_avg_lr(map, v, &left, &right); m = PA_MAX(left, right); if (new_balance <= 0) { nright = (new_balance + 1.0f) * m; nleft = m; } else { nleft = (1.0f - new_balance) * m; nright = m; } for (c = 0; c < map->channels; c++) { if (on_left(map->map[c])) { if (left == 0) v->values[c] = nleft; else 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) PA_CLAMP_VOLUME(((uint64_t) v->values[c] * (uint64_t) nright) / (uint64_t) right); } } return v; }