2010-10-25 17:59:08 +01:00
|
|
|
# This file is part of PulseAudio.
|
|
|
|
|
#
|
|
|
|
|
# Copyright 2010 Lennart Poettering
|
|
|
|
|
# Copyright 2010 Wim Taymans <wim.taymans@collabora.co.uk>
|
|
|
|
|
# Copyright 2010 Arun Raghavan <arun.raghavan@collabora.co.uk>
|
|
|
|
|
#
|
|
|
|
|
# PulseAudio is free software; you can redistribute it and/or modify
|
|
|
|
|
# it under the terms of the GNU Lesser General Public License as published
|
|
|
|
|
# by the Free Software Foundation; either version 2.1 of the License,
|
|
|
|
|
# or (at your option) any later version.
|
|
|
|
|
#
|
|
|
|
|
# PulseAudio is distributed in the hope that it will be useful, but
|
|
|
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
# General Public License for more details.
|
|
|
|
|
#
|
|
|
|
|
# You should have received a copy of the GNU Lesser General Public License
|
2014-11-26 14:14:51 +01:00
|
|
|
# along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
2010-10-25 17:59:08 +01:00
|
|
|
|
|
|
|
|
# S16NE 1- and 2-channel volume scaling work as follows:
|
|
|
|
|
#
|
|
|
|
|
# params: samples s (signed 16-bit), volume v (signed 32-bit < 2^31)
|
|
|
|
|
#
|
|
|
|
|
# 32 16 0 (type of operation)
|
|
|
|
|
# sample = | sample | (signed)
|
|
|
|
|
# s = | 0 | sample | (unsigned)
|
|
|
|
|
#
|
|
|
|
|
# if (sample < 0)
|
|
|
|
|
# signc = | 0 | 0xffff | (unsigned)
|
|
|
|
|
# else
|
2012-01-11 13:11:09 +05:30
|
|
|
# signc = | 0 | 0 | (unsigned)
|
2010-10-25 17:59:08 +01:00
|
|
|
#
|
|
|
|
|
# if (sample < 0)
|
2012-01-11 13:11:09 +05:30
|
|
|
# ml = | 0 | -((s*vl) >> 16) | (unsigned)
|
2010-10-25 17:59:08 +01:00
|
|
|
# else
|
2012-01-11 13:11:09 +05:30
|
|
|
# ml = | 0 | (s*vl) >> 16 | (unsigned)
|
2010-10-25 17:59:08 +01:00
|
|
|
#
|
2012-01-11 13:18:20 +05:30
|
|
|
# vh = | v >> 16 | (signed, but sign bit is always zero
|
2010-10-25 17:59:08 +01:00
|
|
|
# since PA_VOLUME_MAX is 0x0fffffff)
|
|
|
|
|
# mh = | (s * vh) >> 16 | (signed)
|
|
|
|
|
# ml = | ml + mh | (signed)
|
|
|
|
|
# sample = | (ml >> 16) | (signed, saturated)
|
|
|
|
|
|
|
|
|
|
.function pa_volume_s16ne_orc_1ch
|
|
|
|
|
.dest 2 samples int16_t
|
2015-01-07 11:20:01 +01:00
|
|
|
.param 4 vols int32_t
|
|
|
|
|
.temp 4 v
|
2010-10-25 17:59:08 +01:00
|
|
|
.temp 2 vh
|
|
|
|
|
.temp 4 s
|
|
|
|
|
.temp 4 mh
|
|
|
|
|
.temp 4 ml
|
|
|
|
|
.temp 4 signc
|
|
|
|
|
|
2015-01-07 11:20:01 +01:00
|
|
|
loadpl v, vols
|
2010-10-25 17:59:08 +01:00
|
|
|
convuwl s, samples
|
|
|
|
|
x2 cmpgtsw signc, 0, s
|
|
|
|
|
x2 andw signc, signc, v
|
|
|
|
|
x2 mulhuw ml, s, v
|
|
|
|
|
subl ml, ml, signc
|
|
|
|
|
convhlw vh, v
|
|
|
|
|
mulswl mh, samples, vh
|
|
|
|
|
addl ml, ml, mh
|
|
|
|
|
convssslw samples, ml
|
|
|
|
|
|
|
|
|
|
.function pa_volume_s16ne_orc_2ch
|
|
|
|
|
.dest 4 samples int16_t
|
|
|
|
|
.longparam 8 vols
|
|
|
|
|
.temp 8 v
|
|
|
|
|
.temp 4 vh
|
|
|
|
|
.temp 8 s
|
|
|
|
|
.temp 8 mh
|
|
|
|
|
.temp 8 ml
|
|
|
|
|
.temp 8 signc
|
|
|
|
|
|
|
|
|
|
loadpq v, vols
|
|
|
|
|
x2 convuwl s, samples
|
|
|
|
|
x4 cmpgtsw signc, 0, s
|
|
|
|
|
x4 andw signc, signc, v
|
|
|
|
|
x4 mulhuw ml, s, v
|
|
|
|
|
x2 subl ml, ml, signc
|
|
|
|
|
x2 convhlw vh, v
|
|
|
|
|
x2 mulswl mh, samples, vh
|
|
|
|
|
x2 addl ml, ml, mh
|
|
|
|
|
x2 convssslw samples, ml
|