summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/audio.c52
1 files changed, 44 insertions, 8 deletions
diff --git a/src/audio.c b/src/audio.c
index bc2e04d..9caf199 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -1,6 +1,7 @@
#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#include <math.h>
#include <xas/audio.h>
@@ -10,6 +11,17 @@ int xas_audio_format_eq(xas_audio_format a, xas_audio_format b) {
&& a.sample_rate == b.sample_rate;
}
+void xas_audio_zero(xas_audio_format format,
+ void *dest,
+ size_t index,
+ size_t count) {
+ size_t stride = format.channels * format.sample_size;
+
+ memset((uint8_t *)dest + stride * index,
+ '\0',
+ stride * count);
+}
+
void xas_audio_copy(xas_audio_format format,
void *dest,
void *src,
@@ -23,15 +35,39 @@ void xas_audio_copy(xas_audio_format format,
stride * count);
}
-void xas_audio_zero(xas_audio_format format,
- void *dest,
- size_t index,
- size_t count) {
- size_t stride = format.channels * format.sample_size;
+static inline void apply_gain_mono(int16_t *samples,
+ float gain,
+ size_t index,
+ size_t count) {
+ size_t i;
- memset((uint8_t *)dest + stride * index,
- '\0',
- stride * count);
+ for (i=index; i<count; i++) {
+ samples[i] *= (int16_t)roundf(gain * samples[i]);
+ }
+}
+
+static inline void apply_gain_stereo(int16_t *samples,
+ float gain,
+ size_t index,
+ size_t count) {
+ size_t i;
+
+ for (i=index; i<count; i++) {
+ samples[i*2] *= (int16_t)roundf(gain * samples[i*2]);
+ samples[i*2+1] *= (int16_t)roundf(gain * samples[i*2+1]);
+ }
+}
+
+void xas_audio_apply_gain(xas_audio_format format,
+ void *dest,
+ float gain,
+ size_t index,
+ size_t count) {
+ if (format.channels == XAS_AUDIO_MONO) {
+ apply_gain_mono(dest, gain, index, count);
+ } else if (format.channels == XAS_AUDIO_STEREO) {
+ apply_gain_stereo(dest, gain, index, count);
+ }
}
static xas_audio_stream *stream_new(enum xas_audio_stream_type type,