From 11a8868e8e4803e6375eb1bd2002351786f55ebc Mon Sep 17 00:00:00 2001 From: "andrew@webrtc.org" Date: Fri, 6 Sep 2013 21:15:55 +0000 Subject: Reduce cost of PushSincResampler::Resample(). Ideally, PushSincResampler would have very little overhead on SincResampler. This gets closer to that ideal. Replace std::min/max and floor with inline functions. Add a benchmark test to verify the improvement. On a MacBook Retina, this results in PushSincResampler::Resample() accounting for ~1% of CPU usage on voe_cmd_test vs the earlier ~2% (with ISAC16 and 48 kHz audio devices). Using the new benchmark, this results in a performance improvement of: 16 -> 44.1 : 1.7x 16 -> 48 : 1.9x 32 -> 44.1 : 1.6x 32 -> 48 : 1.7x 44.1 -> 16 : 1.5x 44.1 -> 32 : 1.7x 44.1 -> 48 : 1.7x 48 -> 16 : 1.5x 48 -> 32 : 1.5x 48 -> 44.1 : 1.8x R=turaj@webrtc.org Review URL: https://webrtc-codereview.appspot.com/2157005 git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@4695 4adac7df-926f-26a2-2b94-8c16560cd09d --- common_audio/include/audio_util.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'common_audio/include') diff --git a/common_audio/include/audio_util.h b/common_audio/include/audio_util.h index 2196fc34..5e86c1f0 100644 --- a/common_audio/include/audio_util.h +++ b/common_audio/include/audio_util.h @@ -15,6 +15,20 @@ namespace webrtc { +// Clamp the floating |value| to the range representable by an int16_t. +static inline float ClampInt16(float value) { + const float kMaxInt16 = 32767.f; + const float kMinInt16 = -32768.f; + return value < kMinInt16 ? kMinInt16 : + (value > kMaxInt16 ? kMaxInt16 : value); +} + +// Return a rounded int16_t of the floating |value|. Doesn't handle overflow; +// use ClampInt16 if necessary. +static inline int16_t RoundToInt16(float value) { + return static_cast(value < 0.f ? value - 0.5f : value + 0.5f); +} + // Deinterleave audio from |interleaved| to the channel buffers pointed to // by |deinterleaved|. There must be sufficient space allocated in the // |deinterleaved| buffers (|num_channel| buffers with |samples_per_channel| -- cgit v1.2.3