diff options
author | Max Kellermann <max@duempel.org> | 2008-09-28 18:37:43 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2008-09-28 18:37:43 +0200 |
commit | 88aaa6b759daf02706daddb7a7a7fde83f76c592 (patch) | |
tree | a88ae861d78775a8eacaa66ac9cb079c3f424e20 /src/pcm_utils.c | |
parent | 5b5e46f5ef34bdc6c1745c4e778b116e856393c9 (diff) | |
download | mpd-88aaa6b759daf02706daddb7a7a7fde83f76c592.tar.gz mpd-88aaa6b759daf02706daddb7a7a7fde83f76c592.tar.xz mpd-88aaa6b759daf02706daddb7a7a7fde83f76c592.zip |
pcm_utils: added pcm_range()
Make the code more readable by moving the range checks to pcm_range().
gcc does quite a good job at optimizing it: the resulting binary is
exactly the same, although it contains a parametrized shift instead of
hard-coded boundaries.
Diffstat (limited to '')
-rw-r--r-- | src/pcm_utils.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/src/pcm_utils.c b/src/pcm_utils.c index bd7192acf..653df8569 100644 --- a/src/pcm_utils.c +++ b/src/pcm_utils.c @@ -31,6 +31,20 @@ pcm_dither(void) return (rand() & 511) - (rand() & 511); } +/** + * Check if the value is within the range of the provided bit size, + * and caps it if necessary. + */ +static mpd_sint32 +pcm_range(mpd_sint32 sample, unsigned bits) +{ + if (mpd_unlikely(sample < (-1 << (bits - 1)))) + return -1 << (bits - 1); + if (mpd_unlikely(sample >= (1 << (bits - 1)))) + return (1 << (bits - 1)) - 1; + return sample; +} + void pcm_volumeChange(char *buffer, int bufferSize, const struct audio_format *format, int volume) @@ -55,8 +69,7 @@ void pcm_volumeChange(char *buffer, int bufferSize, temp32 += pcm_dither(); temp32 += 500; temp32 /= 1000; - *buffer16 = temp32 > 32767 ? 32767 : - (temp32 < -32768 ? -32768 : temp32); + *buffer16 = pcm_range(temp32, 16); buffer16++; bufferSize -= 2; } @@ -68,8 +81,7 @@ void pcm_volumeChange(char *buffer, int bufferSize, temp32 += pcm_dither(); temp32 += 500; temp32 /= 1000; - *buffer8 = temp32 > 127 ? 127 : - (temp32 < -128 ? -128 : temp32); + *buffer8 = pcm_range(temp32, 8); buffer8++; bufferSize--; } @@ -99,9 +111,7 @@ static void pcm_add(char *buffer1, const char *buffer2, size_t bufferSize1, temp32 += pcm_dither(); temp32 += 500; temp32 /= 1000; - *buffer16_1 = - temp32 > 32767 ? 32767 : (temp32 < - -32768 ? -32768 : temp32); + *buffer16_1 = pcm_range(temp32, 16); buffer16_1++; buffer16_2++; bufferSize1 -= 2; @@ -117,9 +127,7 @@ static void pcm_add(char *buffer1, const char *buffer2, size_t bufferSize1, temp32 += pcm_dither(); temp32 += 500; temp32 /= 1000; - *buffer8_1 = - temp32 > 127 ? 127 : (temp32 < - -128 ? -128 : temp32); + *buffer8_1 = pcm_range(temp32, 8); buffer8_1++; buffer8_2++; bufferSize1--; |