mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-31 22:25:33 -04:00
implement pa_sw_volume_divide() and pa_sw_cvolume_divide()
This commit is contained in:
parent
87c8132ce3
commit
da4ad5ed01
2 changed files with 40 additions and 7 deletions
|
|
@ -104,6 +104,15 @@ 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));
|
||||
}
|
||||
|
||||
pa_volume_t pa_sw_volume_divide(pa_volume_t a, pa_volume_t b) {
|
||||
double v = pa_sw_volume_to_linear(b);
|
||||
|
||||
if (v <= 0)
|
||||
return 0;
|
||||
|
||||
return pa_sw_volume_from_linear(pa_sw_volume_to_linear(a) / v);
|
||||
}
|
||||
|
||||
#define USER_DECIBEL_RANGE 60
|
||||
|
||||
pa_volume_t pa_sw_volume_from_dB(double dB) {
|
||||
|
|
@ -220,12 +229,23 @@ pa_cvolume *pa_sw_cvolume_multiply(pa_cvolume *dest, const pa_cvolume *a, const
|
|||
pa_assert(a);
|
||||
pa_assert(b);
|
||||
|
||||
for (i = 0; i < a->channels && i < b->channels && i < PA_CHANNELS_MAX; i++) {
|
||||
for (i = 0; i < a->channels && i < b->channels && i < PA_CHANNELS_MAX; i++)
|
||||
dest->values[i] = pa_sw_volume_multiply(a->values[i], b->values[i]);
|
||||
|
||||
dest->values[i] = pa_sw_volume_multiply(
|
||||
i < a->channels ? a->values[i] : PA_VOLUME_NORM,
|
||||
i < b->channels ? b->values[i] : PA_VOLUME_NORM);
|
||||
}
|
||||
dest->channels = (uint8_t) i;
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
||||
pa_cvolume *pa_sw_cvolume_divide(pa_cvolume *dest, const pa_cvolume *a, const pa_cvolume *b) {
|
||||
unsigned i;
|
||||
|
||||
pa_assert(dest);
|
||||
pa_assert(a);
|
||||
pa_assert(b);
|
||||
|
||||
for (i = 0; i < a->channels && i < b->channels && i < PA_CHANNELS_MAX; i++)
|
||||
dest->values[i] = pa_sw_volume_divide(a->values[i], b->values[i]);
|
||||
|
||||
dest->channels = (uint8_t) i;
|
||||
|
||||
|
|
|
|||
|
|
@ -168,12 +168,25 @@ int pa_cvolume_channels_equal_to(const pa_cvolume *a, pa_volume_t v) PA_GCC_PURE
|
|||
/** Return 1 if the specified volume has all channels on normal level */
|
||||
#define pa_cvolume_is_norm(a) pa_cvolume_channels_equal_to((a), PA_VOLUME_NORM)
|
||||
|
||||
/** Multiply two volumes specifications, return the result. This uses PA_VOLUME_NORM as neutral element of multiplication. This is only valid for software volumes! */
|
||||
/** Multiply two volume specifications, return the result. This uses
|
||||
* PA_VOLUME_NORM as neutral element of multiplication. This is only
|
||||
* valid for software volumes! */
|
||||
pa_volume_t pa_sw_volume_multiply(pa_volume_t a, pa_volume_t b) PA_GCC_CONST;
|
||||
|
||||
/** Multiply to per-channel volumes and return the result in *dest. This is only valid for software volumes! */
|
||||
/** Multiply two per-channel volumes and return the result in
|
||||
* *dest. This is only valid for software volumes! */
|
||||
pa_cvolume *pa_sw_cvolume_multiply(pa_cvolume *dest, const pa_cvolume *a, const pa_cvolume *b);
|
||||
|
||||
/** Divide two volume specifications, return the result. This uses
|
||||
* PA_VOLUME_NORM as neutral element of division. This is only valid
|
||||
* for software volumes! If a division by zero is tried the result
|
||||
* will be 0. \since 0.9.13 */
|
||||
pa_volume_t pa_sw_volume_divide(pa_volume_t a, pa_volume_t b) PA_GCC_CONST;
|
||||
|
||||
/** Multiply to per-channel volumes and return the result in
|
||||
* *dest. This is only valid for software volumes! \since 0.9.13 */
|
||||
pa_cvolume *pa_sw_cvolume_divide(pa_cvolume *dest, const pa_cvolume *a, const pa_cvolume *b);
|
||||
|
||||
/** Convert a decibel value to a volume. This is only valid for software volumes! */
|
||||
pa_volume_t pa_sw_volume_from_dB(double f) PA_GCC_CONST;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue