aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pcm_volume.c15
-rw-r--r--src/pcm_volume.h6
2 files changed, 19 insertions, 2 deletions
diff --git a/src/pcm_volume.c b/src/pcm_volume.c
index f732060b2..de4bda6c9 100644
--- a/src/pcm_volume.c
+++ b/src/pcm_volume.c
@@ -132,6 +132,16 @@ pcm_volume_change_32(int32_t *buffer, const int32_t *end, int volume)
}
}
+static void
+pcm_volume_change_float(float *buffer, const float *end, float volume)
+{
+ while (buffer < end) {
+ float sample = *buffer;
+ sample *= volume;
+ *buffer++ = sample;
+ }
+}
+
bool
pcm_volume(void *buffer, size_t length,
enum sample_format format,
@@ -169,8 +179,9 @@ pcm_volume(void *buffer, size_t length,
return true;
case SAMPLE_FORMAT_FLOAT:
- /* XXX */
- return false;
+ pcm_volume_change_float(buffer, end,
+ pcm_volume_to_float(volume));
+ return true;
}
/* unreachable */
diff --git a/src/pcm_volume.h b/src/pcm_volume.h
index 741c4db40..64e3c7641 100644
--- a/src/pcm_volume.h
+++ b/src/pcm_volume.h
@@ -43,6 +43,12 @@ pcm_float_to_volume(float volume)
return volume * PCM_VOLUME_1 + 0.5;
}
+static inline float
+pcm_volume_to_float(int volume)
+{
+ return (float)volume / (float)PCM_VOLUME_1;
+}
+
/**
* Returns the next volume dithering number, between -511 and +511.
* This number is taken from a global PRNG, see pcm_prng().