[pulseaudio-discuss] [RFC PATCH] softvolume: implement fast volume translation
Wang Xingchao
wangxingchao2011 at gmail.com
Tue Oct 18 02:24:42 PDT 2011
Hi all,
I didnot touch much formats optermization, only for most used
s16nr/re, please help review whether the idea is acceptable. If so, i
will take the responsbility for all formats.
--xingchao
2011/10/18 Wang Xingchao <xingchao.wang at intel.com>:
> if all channels have same volume setting, use fast way to
> do volume change. this patch intended to work for two formats:
> s16ne/s16re.
>
> Signed-off-by: Wang Xingchao <xingchao.wang at intel.com>
> ---
> src/pulsecore/svolume_c.c | 70 +++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 70 insertions(+), 0 deletions(-)
>
> diff --git a/src/pulsecore/svolume_c.c b/src/pulsecore/svolume_c.c
> index 272e7a7..7919faa 100644
> --- a/src/pulsecore/svolume_c.c
> +++ b/src/pulsecore/svolume_c.c
> @@ -90,9 +90,43 @@ static void pa_volume_ulaw_c(uint8_t *samples, int32_t *volumes, unsigned channe
>
> static void pa_volume_s16ne_c(int16_t *samples, int32_t *volumes, unsigned channels, unsigned length) {
> unsigned channel;
> + int32_t same_vol = volumes[0];
> + unsigned fast_vol;
>
> length /= sizeof(int16_t);
>
> + for (channel = 0; channel < channels; channel++) {
> + if (volumes[channel] != same_vol)
> + break;
> + }
> +
> + fast_vol = channel < channels? 0 : 1;
> +
> + if (fast_vol) {
> + int32_t t, hi, lo;
> + int32_t ht, lt;
> +
> + hi = same_vol >> 16;
> + lo = same_vol & 0xffff;
> + while (length) {
> + t = *((int32_t *)samples);
> + ht = t >> 16;
> + lt = t & 0xffff;
> +
> + ht = ((ht * lo) >> 16) + (ht * hi);
> + ht = PA_CLAMP_UNLIKELY(ht, -0x8000, 0x7FFF);
> +
> + lt = ((lt * lo) >> 16) + (lt * hi);
> + lt = PA_CLAMP_UNLIKELY(lt, -0x8000, 0x7FFF);
> +
> + *((int32_t *)samples) = ht<<16|lt;
> +
> + samples += 2;
> + length -= 2;
> + }
> +
> + return;
> + }
> for (channel = 0; length; length--) {
> int32_t t, hi, lo;
>
> @@ -117,9 +151,45 @@ static void pa_volume_s16ne_c(int16_t *samples, int32_t *volumes, unsigned chann
>
> static void pa_volume_s16re_c(int16_t *samples, int32_t *volumes, unsigned channels, unsigned length) {
> unsigned channel;
> + int32_t same_vol = volumes[0];
> + unsigned fast_vol;
>
> length /= sizeof(int16_t);
>
> + for (channel = 0; channel < channels; channel++) {
> + if (volumes[channel] != same_vol)
> + break;
> + }
> +
> + fast_vol = channel < channels? 0 : 1;
> +
> + if (fast_vol) {
> + int32_t t, hi, lo;
> + int32_t ht, lt;
> +
> + hi = same_vol >> 16;
> + lo = same_vol & 0xffff;
> +
> + while (length) {
> + t = *((int32_t *)samples);
> + ht = (int32_t)PA_INT16_SWAP((int16_t)(t >> 16));
> + lt = (int32_t)PA_INT16_SWAP((int16_t)(t & 0xffff));
> +
> + ht = ((ht * lo) >> 16) + (ht * hi);
> + ht = PA_CLAMP_UNLIKELY(ht, -0x8000, 0x7FFF);
> +
> + lt = ((lt * lo) >> 16) + (lt * hi);
> + lt = PA_CLAMP_UNLIKELY(lt, -0x8000, 0x7FFF);
> +
> + *((int32_t *)samples) = PA_INT16_SWAP((int16_t) ht<<16)|PA_INT16_SWAP((int16_t) lt);
> +
> + samples += 2;
> + length -= 2;
> + }
> +
> + return;
> + }
> +
> for (channel = 0; length; length--) {
> int32_t t, hi, lo;
>
> --
> 1.7.1
>
> _______________________________________________
> pulseaudio-discuss mailing list
> pulseaudio-discuss at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss
>
More information about the pulseaudio-discuss
mailing list