summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2009-01-27 00:47:07 +0100
committerLennart Poettering <lennart@poettering.net>2009-01-27 00:47:07 +0100
commit4e31e00b63117f36df6b8ed4850e7ad6264e3da7 (patch)
tree5c92e42cbcb414bc57d3325a0152e9f520c3ea11
parente52c5ea68a9c3bf6e7c4b30cb6c2d4706f214cd3 (diff)
downloadpulseaudio-4e31e00b63117f36df6b8ed4850e7ad6264e3da7.tar.gz
implement pa_cvolume_scale()
-rw-r--r--src/map-file1
-rw-r--r--src/pulse/volume.c19
-rw-r--r--src/pulse/volume.h7
3 files changed, 26 insertions, 1 deletions
diff --git a/src/map-file b/src/map-file
index cb5c749dc..d6137590f 100644
--- a/src/map-file
+++ b/src/map-file
@@ -113,6 +113,7 @@ pa_cvolume_get_balance;
pa_cvolume_init;
pa_cvolume_max;
pa_cvolume_remap;
+pa_cvolume_scale;
pa_cvolume_set;
pa_cvolume_set_balance;
pa_cvolume_snprint;
diff --git a/src/pulse/volume.c b/src/pulse/volume.c
index 10a44dafa..2c9778458 100644
--- a/src/pulse/volume.c
+++ b/src/pulse/volume.c
@@ -500,3 +500,22 @@ pa_cvolume* pa_cvolume_set_balance(const pa_channel_map *map, pa_cvolume *v, flo
return v;
}
+
+pa_cvolume* pa_cvolume_scale(pa_cvolume *v, pa_volume_t max) {
+ unsigned c;
+ pa_volume_t t = 0;
+
+ pa_assert(c);
+
+ for (c = 0; c < v->channels; c++)
+ if (v->values[c] > t)
+ t = v->values[c];
+
+ if (t <= 0)
+ 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);
+
+ return v;
+}
diff --git a/src/pulse/volume.h b/src/pulse/volume.h
index 38da5dfca..c8b73f4a8 100644
--- a/src/pulse/volume.h
+++ b/src/pulse/volume.h
@@ -244,9 +244,14 @@ float pa_cvolume_get_balance(const pa_channel_map *map, const pa_cvolume *v) PA_
* operation might not be reversable! Also, after this call
* pa_cvolume_get_balance() is not guaranteed to actually return the
* requested balance (e.g. when the input volume was zero anyway for
- * all channels)- \since 0.9.15 */
+ * all channels) \since 0.9.15 */
pa_cvolume* pa_cvolume_set_balance(const pa_channel_map *map, pa_cvolume *v, float new_balance);
+/** Scale the passed pa_cvolume structure so that the maximum volume
+ * of all channels equals max. The proportions between the channel
+ * volumes are kept. \since 0.9.15 */
+pa_cvolume* pa_cvolume_scale(pa_cvolume *v, pa_volume_t max);
+
PA_C_DECL_END
#endif