From e71a652985768e5f4ad78f23786dff08081214db Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 20 Oct 2011 02:36:26 +0200 Subject: pcm_mix: implement float samples --- src/pcm_mix.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/pcm_mix.c b/src/pcm_mix.c index b94089cfb..9f76d568f 100644 --- a/src/pcm_mix.c +++ b/src/pcm_mix.c @@ -98,6 +98,20 @@ pcm_add_vol_32(int32_t *buffer1, const int32_t *buffer2, } } +static void +pcm_add_vol_float(float *buffer1, const float *buffer2, + unsigned num_samples, float volume1, float volume2) +{ + while (num_samples > 0) { + float sample1 = *buffer1; + float sample2 = *buffer2++; + + sample1 = (sample1 * volume1 + sample2 * volume2); + *buffer1++ = sample1; + --num_samples; + } +} + static bool pcm_add_vol(void *buffer1, const void *buffer2, size_t size, int vol1, int vol2, @@ -130,8 +144,10 @@ pcm_add_vol(void *buffer1, const void *buffer2, size_t size, return true; case SAMPLE_FORMAT_FLOAT: - /* XXX */ - return false; + pcm_add_vol_float(buffer1, buffer2, size / 4, + pcm_volume_to_float(vol1), + pcm_volume_to_float(vol2)); + return true; } /* unreachable */ @@ -195,6 +211,17 @@ pcm_add_32(int32_t *buffer1, const int32_t *buffer2, unsigned num_samples) } } +static void +pcm_add_float(float *buffer1, const float *buffer2, unsigned num_samples) +{ + while (num_samples > 0) { + float sample1 = *buffer1; + float sample2 = *buffer2++; + *buffer1++ = sample1 + sample2; + --num_samples; + } +} + static bool pcm_add(void *buffer1, const void *buffer2, size_t size, enum sample_format format) @@ -222,8 +249,8 @@ pcm_add(void *buffer1, const void *buffer2, size_t size, return true; case SAMPLE_FORMAT_FLOAT: - /* XXX */ - return false; + pcm_add_float(buffer1, buffer2, size / 4); + return true; } /* unreachable */ -- cgit v1.2.3