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.
This commit is contained in:
parent
5b5e46f5ef
commit
88aaa6b759
|
@ -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--;
|
||||
|
|
Loading…
Reference in New Issue