volume: introduce pa_cvolume_min() and pa_cvolume_min_mask()

This commit is contained in:
Lennart Poettering 2009-08-19 00:56:16 +02:00
parent 8f928b2e57
commit d634555a3e
3 changed files with 51 additions and 2 deletions

View file

@ -131,6 +131,8 @@ pa_cvolume_init;
pa_cvolume_max; pa_cvolume_max;
pa_cvolume_max_mask; pa_cvolume_max_mask;
pa_cvolume_merge; pa_cvolume_merge;
pa_cvolume_min;
pa_cvolume_min_mask;
pa_cvolume_remap; pa_cvolume_remap;
pa_cvolume_scale; pa_cvolume_scale;
pa_cvolume_scale_mask; pa_cvolume_scale_mask;

View file

@ -126,7 +126,7 @@ pa_volume_t pa_cvolume_avg_mask(const pa_cvolume *a, const pa_channel_map *cm, p
} }
pa_volume_t pa_cvolume_max(const pa_cvolume *a) { pa_volume_t pa_cvolume_max(const pa_cvolume *a) {
pa_volume_t m = 0; pa_volume_t m = PA_VOLUME_MUTED;
unsigned c; unsigned c;
pa_assert(a); pa_assert(a);
@ -139,8 +139,22 @@ pa_volume_t pa_cvolume_max(const pa_cvolume *a) {
return m; return m;
} }
pa_volume_t pa_cvolume_min(const pa_cvolume *a) {
pa_volume_t m = (pa_volume_t) -1;
unsigned c;
pa_assert(a);
pa_return_val_if_fail(pa_cvolume_valid(a), PA_VOLUME_MUTED);
for (c = 0; c < a->channels; c++)
if (m == (pa_volume_t) -1 || a->values[c] < m)
m = a->values[c];
return m;
}
pa_volume_t pa_cvolume_max_mask(const pa_cvolume *a, const pa_channel_map *cm, pa_channel_position_mask_t mask) { pa_volume_t pa_cvolume_max_mask(const pa_cvolume *a, const pa_channel_map *cm, pa_channel_position_mask_t mask) {
pa_volume_t m = 0; pa_volume_t m = PA_VOLUME_MUTED;
unsigned c, n; unsigned c, n;
pa_assert(a); pa_assert(a);
@ -162,6 +176,29 @@ pa_volume_t pa_cvolume_max_mask(const pa_cvolume *a, const pa_channel_map *cm, p
return m; return m;
} }
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_t) -1;
unsigned c, n;
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 = n = 0; c < a->channels; c++) {
if (!(PA_CHANNEL_POSITION_MASK(cm->map[c]) & mask))
continue;
if (m == (pa_volume_t) -1 || a->values[c] < m)
m = a->values[c];
}
return m;
}
pa_volume_t pa_sw_volume_multiply(pa_volume_t a, pa_volume_t b) { pa_volume_t pa_sw_volume_multiply(pa_volume_t a, pa_volume_t b) {
return pa_sw_volume_from_linear(pa_sw_volume_to_linear(a) * pa_sw_volume_to_linear(b)); return pa_sw_volume_from_linear(pa_sw_volume_to_linear(a) * pa_sw_volume_to_linear(b));
} }

View file

@ -195,6 +195,16 @@ pa_volume_t pa_cvolume_max(const pa_cvolume *a) PA_GCC_PURE;
* \since 0.9.16 */ * \since 0.9.16 */
pa_volume_t pa_cvolume_max_mask(const pa_cvolume *a, const pa_channel_map *cm, pa_channel_position_mask_t mask) PA_GCC_PURE; pa_volume_t pa_cvolume_max_mask(const pa_cvolume *a, const pa_channel_map *cm, pa_channel_position_mask_t mask) PA_GCC_PURE;
/** Return the minimum volume of all channels. \since 0.9.16 */
pa_volume_t pa_cvolume_min(const pa_cvolume *a) PA_GCC_PURE;
/** Return the minimum volume of all channels that are included in the
* specified channel map with the specified channel position mask. If
* cm is NULL this call is identical to pa_cvolume_min(). If no
* channel is selected the returned value will be PA_VOLUME_MUTED.
* \since 0.9.16 */
pa_volume_t pa_cvolume_min_mask(const pa_cvolume *a, const pa_channel_map *cm, pa_channel_position_mask_t mask) PA_GCC_PURE;
/** Return TRUE when the passed cvolume structure is valid, FALSE otherwise */ /** Return TRUE when the passed cvolume structure is valid, FALSE otherwise */
int pa_cvolume_valid(const pa_cvolume *v) PA_GCC_PURE; int pa_cvolume_valid(const pa_cvolume *v) PA_GCC_PURE;