Home | History | Annotate | Download | only in audio_utils
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_AUDIO_PRIMITIVES_H
     18 #define ANDROID_AUDIO_PRIMITIVES_H
     19 
     20 #include <stdint.h>
     21 #include <stdlib.h>
     22 #include <sys/cdefs.h>
     23 
     24 __BEGIN_DECLS
     25 
     26 /* The memcpy_* conversion routines are designed to work in-place on same dst as src
     27  * buffers only if the types shrink on copy, with the exception of memcpy_to_i16_from_u8().
     28  * This allows the loops to go upwards for faster cache access (and may be more flexible
     29  * for future optimization later).
     30  */
     31 
     32 /**
     33  * Dither and clamp pairs of 32-bit input samples (sums) to 16-bit output samples (out).
     34  * Each 32-bit input sample can be viewed as a signed fixed-point Q19.12 of which the
     35  * .12 fraction bits are dithered and the 19 integer bits are clamped to signed 16 bits.
     36  * Alternatively the input can be viewed as Q4.27, of which the lowest .12 of the fraction
     37  * is dithered and the remaining fraction is converted to the output Q.15, with clamping
     38  * on the 4 integer guard bits.
     39  *
     40  * For interleaved stereo, c is the number of sample pairs,
     41  * and out is an array of interleaved pairs of 16-bit samples per channel.
     42  * For mono, c is the number of samples / 2, and out is an array of 16-bit samples.
     43  * The name "dither" is a misnomer; the current implementation does not actually dither
     44  * but uses truncation.  This may change.
     45  * The out and sums buffers must either be completely separate (non-overlapping), or
     46  * they must both start at the same address.  Partially overlapping buffers are not supported.
     47  */
     48 void ditherAndClamp(int32_t* out, const int32_t *sums, size_t c);
     49 
     50 /* Expand and copy samples from unsigned 8-bit offset by 0x80 to signed 16-bit.
     51  * Parameters:
     52  *  dst     Destination buffer
     53  *  src     Source buffer
     54  *  count   Number of samples to copy
     55  * The destination and source buffers must either be completely separate (non-overlapping), or
     56  * they must both start at the same address.  Partially overlapping buffers are not supported.
     57  */
     58 void memcpy_to_i16_from_u8(int16_t *dst, const uint8_t *src, size_t count);
     59 
     60 /* Shrink and copy samples from signed 16-bit to unsigned 8-bit offset by 0x80.
     61  * Parameters:
     62  *  dst     Destination buffer
     63  *  src     Source buffer
     64  *  count   Number of samples to copy
     65  * The destination and source buffers must either be completely separate (non-overlapping), or
     66  * they must both start at the same address.  Partially overlapping buffers are not supported.
     67  * The conversion is done by truncation, without dithering, so it loses resolution.
     68  */
     69 void memcpy_to_u8_from_i16(uint8_t *dst, const int16_t *src, size_t count);
     70 
     71 /* Shrink and copy samples from signed 32-bit fixed-point Q0.31 to signed 16-bit Q0.15.
     72  * Parameters:
     73  *  dst     Destination buffer
     74  *  src     Source buffer
     75  *  count   Number of samples to copy
     76  * The destination and source buffers must either be completely separate (non-overlapping), or
     77  * they must both start at the same address.  Partially overlapping buffers are not supported.
     78  * The conversion is done by truncation, without dithering, so it loses resolution.
     79  */
     80 void memcpy_to_i16_from_i32(int16_t *dst, const int32_t *src, size_t count);
     81 
     82 /* Shrink and copy samples from single-precision floating-point to signed 16-bit.
     83  * Each float should be in the range -1.0 to 1.0.  Values outside that range are clamped,
     84  * refer to clamp16_from_float().
     85  * Parameters:
     86  *  dst     Destination buffer
     87  *  src     Source buffer
     88  *  count   Number of samples to copy
     89  * The destination and source buffers must either be completely separate (non-overlapping), or
     90  * they must both start at the same address.  Partially overlapping buffers are not supported.
     91  * The conversion is done by truncation, without dithering, so it loses resolution.
     92  */
     93 void memcpy_to_i16_from_float(int16_t *dst, const float *src, size_t count);
     94 
     95 /* Copy samples from signed fixed-point 32-bit Q4.27 to single-precision floating-point.
     96  * The nominal output float range is [-1.0, 1.0] if the fixed-point range is
     97  * [0xf8000000, 0x07ffffff].  The full float range is [-16.0, 16.0].  Note the closed range
     98  * at 1.0 and 16.0 is due to rounding on conversion to float. See float_from_q4_27() for details.
     99  * Parameters:
    100  *  dst     Destination buffer
    101  *  src     Source buffer
    102  *  count   Number of samples to copy
    103  * The destination and source buffers must either be completely separate (non-overlapping), or
    104  * they must both start at the same address.  Partially overlapping buffers are not supported.
    105  */
    106 void memcpy_to_float_from_q4_27(float *dst, const int32_t *src, size_t count);
    107 
    108 /* Copy samples from signed fixed-point 16 bit Q0.15 to single-precision floating-point.
    109  * The output float range is [-1.0, 1.0) for the fixed-point range [0x8000, 0x7fff].
    110  * No rounding is needed as the representation is exact.
    111  * Parameters:
    112  *  dst     Destination buffer
    113  *  src     Source buffer
    114  *  count   Number of samples to copy
    115  * The destination and source buffers must be completely separate.
    116  */
    117 void memcpy_to_float_from_i16(float *dst, const int16_t *src, size_t count);
    118 
    119 /* Copy samples from signed fixed-point packed 24 bit Q0.23 to single-precision floating-point.
    120  * The packed 24 bit input is stored in native endian format in a uint8_t byte array.
    121  * The output float range is [-1.0, 1.0) for the fixed-point range [0x800000, 0x7fffff].
    122  * No rounding is needed as the representation is exact.
    123  * Parameters:
    124  *  dst     Destination buffer
    125  *  src     Source buffer
    126  *  count   Number of samples to copy
    127  * The destination and source buffers must be completely separate.
    128  */
    129 void memcpy_to_float_from_p24(float *dst, const uint8_t *src, size_t count);
    130 
    131 /* Copy samples from signed fixed-point packed 24 bit Q0.23 to signed fixed point 16 bit Q0.15.
    132  * The packed 24 bit output is stored in native endian format in a uint8_t byte array.
    133  * The data is truncated without rounding.
    134  * Parameters:
    135  *  dst     Destination buffer
    136  *  src     Source buffer
    137  *  count   Number of samples to copy
    138  * The destination and source buffers must either be completely separate (non-overlapping), or
    139  * they must both start at the same address.  Partially overlapping buffers are not supported.
    140  */
    141 void memcpy_to_i16_from_p24(int16_t *dst, const uint8_t *src, size_t count);
    142 
    143 /* Copy samples from signed fixed point 16 bit Q0.15 to signed fixed-point packed 24 bit Q0.23.
    144  * The packed 24 bit output is assumed to be a native-endian uint8_t byte array.
    145  * The output data range is [0x800000, 0x7fff00] (not full).
    146  * Nevertheless there is no DC offset on the output, if the input has no DC offset.
    147  * Parameters:
    148  *  dst     Destination buffer
    149  *  src     Source buffer
    150  *  count   Number of samples to copy
    151  * The destination and source buffers must be completely separate.
    152  */
    153 void memcpy_to_p24_from_i16(uint8_t *dst, const int16_t *src, size_t count);
    154 
    155 /* Copy samples from single-precision floating-point to signed fixed-point packed 24 bit Q0.23.
    156  * The packed 24 bit output is assumed to be a native-endian uint8_t byte array.
    157  * The data is clamped and rounded to nearest, ties away from zero. See clamp24_from_float()
    158  * for details.
    159  * Parameters:
    160  *  dst     Destination buffer
    161  *  src     Source buffer
    162  *  count   Number of samples to copy
    163  * The destination and source buffers must either be completely separate (non-overlapping), or
    164  * they must both start at the same address.  Partially overlapping buffers are not supported.
    165  */
    166 void memcpy_to_p24_from_float(uint8_t *dst, const float *src, size_t count);
    167 
    168 /* Copy samples from signed fixed-point 32-bit Q8.23 to signed fixed-point packed 24 bit Q0.23.
    169  * The packed 24 bit output is assumed to be a native-endian uint8_t byte array.
    170  * The data is clamped to the range is [0x800000, 0x7fffff].
    171  * Parameters:
    172  *  dst     Destination buffer
    173  *  src     Source buffer
    174  *  count   Number of samples to copy
    175  * The destination and source buffers must be completely separate.
    176  */
    177 void memcpy_to_p24_from_q8_23(uint8_t *dst, const int32_t *src, size_t count);
    178 
    179 /* Copy samples from signed fixed point 16-bit Q0.15 to signed fixed-point 32-bit Q8.23.
    180  * The output data range is [0xff800000, 0x007fff00] at intervals of 0x100.
    181  * Parameters:
    182  *  dst     Destination buffer
    183  *  src     Source buffer
    184  *  count   Number of samples to copy
    185  * The destination and source buffers must be completely separate.
    186  */
    187 void memcpy_to_q8_23_from_i16(int32_t *dst, const int16_t *src, size_t count);
    188 
    189 /* Copy samples from single-precision floating-point to signed fixed-point 32-bit Q8.23.
    190  * This copy will clamp the Q8.23 representation to [0xff800000, 0x007fffff] even though there
    191  * are guard bits available. Fractional lsb is rounded to nearest, ties away from zero.
    192  * See clamp24_from_float() for details.
    193  * Parameters:
    194  *  dst     Destination buffer
    195  *  src     Source buffer
    196  *  count   Number of samples to copy
    197  * The destination and source buffers must either be completely separate (non-overlapping), or
    198  * they must both start at the same address.  Partially overlapping buffers are not supported.
    199  */
    200 void memcpy_to_q8_23_from_float_with_clamp(int32_t *dst, const float *src, size_t count);
    201 
    202 /* Copy samples from single-precision floating-point to signed fixed-point 32-bit Q4.27.
    203  * The conversion will use the full available Q4.27 range, including guard bits.
    204  * Fractional lsb is rounded to nearest, ties away from zero.
    205  * See clampq4_27_from_float() for details.
    206  * Parameters:
    207  *  dst     Destination buffer
    208  *  src     Source buffer
    209  *  count   Number of samples to copy
    210  * The destination and source buffers must either be completely separate (non-overlapping), or
    211  * they must both start at the same address.  Partially overlapping buffers are not supported.
    212  */
    213 void memcpy_to_q4_27_from_float(int32_t *dst, const float *src, size_t count);
    214 
    215 /* Copy samples from signed fixed-point 32-bit Q8.23 to signed fixed point 16-bit Q0.15.
    216  * The data is clamped, and truncated without rounding.
    217  * Parameters:
    218  *  dst     Destination buffer
    219  *  src     Source buffer
    220  *  count   Number of samples to copy
    221  * The destination and source buffers must either be completely separate (non-overlapping), or
    222  * they must both start at the same address.  Partially overlapping buffers are not supported.
    223  */
    224 void memcpy_to_i16_from_q8_23(int16_t *dst, const int32_t *src, size_t count);
    225 
    226 /* Copy samples from signed fixed-point 32-bit Q8.23 to single-precision floating-point.
    227  * The nominal output float range is [-1.0, 1.0) for the fixed-point
    228  * range [0xff800000, 0x007fffff]. The maximum output float range is [-256.0, 256.0).
    229  * No rounding is needed as the representation is exact for nominal values.
    230  * Rounding for overflow values is to nearest, ties to even.
    231  * Parameters:
    232  *  dst     Destination buffer
    233  *  src     Source buffer
    234  *  count   Number of samples to copy
    235  * The destination and source buffers must either be completely separate (non-overlapping), or
    236  * they must both start at the same address.  Partially overlapping buffers are not supported.
    237  */
    238 void memcpy_to_float_from_q8_23(float *dst, const int32_t *src, size_t count);
    239 
    240 /* Copy samples from signed fixed point 16-bit Q0.15 to signed fixed-point 32-bit Q0.31.
    241  * The output data range is [0x80000000, 0x7fff0000] at intervals of 0x10000.
    242  * Parameters:
    243  *  dst     Destination buffer
    244  *  src     Source buffer
    245  *  count   Number of samples to copy
    246  * The destination and source buffers must be completely separate.
    247  */
    248 void memcpy_to_i32_from_i16(int32_t *dst, const int16_t *src, size_t count);
    249 
    250 /* Copy samples from single-precision floating-point to signed fixed-point 32-bit Q0.31.
    251  * If rounding is needed on truncation, the fractional lsb is rounded to nearest,
    252  * ties away from zero. See clamp32_from_float() for details.
    253  * Parameters:
    254  *  dst     Destination buffer
    255  *  src     Source buffer
    256  *  count   Number of samples to copy
    257  * The destination and source buffers must either be completely separate (non-overlapping), or
    258  * they must both start at the same address.  Partially overlapping buffers are not supported.
    259  */
    260 void memcpy_to_i32_from_float(int32_t *dst, const float *src, size_t count);
    261 
    262 /* Copy samples from signed fixed-point 32-bit Q0.31 to single-precision floating-point.
    263  * The float range is [-1.0, 1.0] for the fixed-point range [0x80000000, 0x7fffffff].
    264  * Rounding is done according to float_from_i32().
    265  * Parameters:
    266  *  dst     Destination buffer
    267  *  src     Source buffer
    268  *  count   Number of samples to copy
    269  * The destination and source buffers must either be completely separate (non-overlapping), or
    270  * they must both start at the same address.  Partially overlapping buffers are not supported.
    271  */
    272 void memcpy_to_float_from_i32(float *dst, const int32_t *src, size_t count);
    273 
    274 /* Downmix pairs of interleaved stereo input 16-bit samples to mono output 16-bit samples.
    275  * Parameters:
    276  *  dst     Destination buffer
    277  *  src     Source buffer
    278  *  count   Number of stereo frames to downmix
    279  * The destination and source buffers must be completely separate (non-overlapping).
    280  * The current implementation truncates the sum rather than dither, but this may change.
    281  */
    282 void downmix_to_mono_i16_from_stereo_i16(int16_t *dst, const int16_t *src, size_t count);
    283 
    284 /* Upmix mono input 16-bit samples to pairs of interleaved stereo output 16-bit samples by
    285  * duplicating.
    286  * Parameters:
    287  *  dst     Destination buffer
    288  *  src     Source buffer
    289  *  count   Number of mono samples to upmix
    290  * The destination and source buffers must be completely separate (non-overlapping).
    291  */
    292 void upmix_to_stereo_i16_from_mono_i16(int16_t *dst, const int16_t *src, size_t count);
    293 
    294 /* Return the total number of non-zero 32-bit samples */
    295 size_t nonZeroMono32(const int32_t *samples, size_t count);
    296 
    297 /* Return the total number of non-zero 16-bit samples */
    298 size_t nonZeroMono16(const int16_t *samples, size_t count);
    299 
    300 /* Return the total number of non-zero stereo frames, where a frame is considered non-zero
    301  * if either of its constituent 32-bit samples is non-zero
    302  */
    303 size_t nonZeroStereo32(const int32_t *frames, size_t count);
    304 
    305 /* Return the total number of non-zero stereo frames, where a frame is considered non-zero
    306  * if either of its constituent 16-bit samples is non-zero
    307  */
    308 size_t nonZeroStereo16(const int16_t *frames, size_t count);
    309 
    310 /* Copy frames, selecting source samples based on a source channel mask to fit
    311  * the destination channel mask. Unmatched channels in the destination channel mask
    312  * are zero filled. Unmatched channels in the source channel mask are dropped.
    313  * Channels present in the channel mask are represented by set bits in the
    314  * uint32_t value and are matched without further interpretation.
    315  * Parameters:
    316  *  dst         Destination buffer
    317  *  dst_mask    Bit mask corresponding to destination channels present
    318  *  src         Source buffer
    319  *  src_mask    Bit mask corresponding to source channels present
    320  *  sample_size Size of each sample in bytes.  Must be 1, 2, 3, or 4.
    321  *  count       Number of frames to copy
    322  * The destination and source buffers must be completely separate (non-overlapping).
    323  * If the sample size is not in range, the function will abort.
    324  */
    325 void memcpy_by_channel_mask(void *dst, uint32_t dst_mask,
    326         const void *src, uint32_t src_mask, size_t sample_size, size_t count);
    327 
    328 /* Copy frames, selecting source samples based on an index array (idxary).
    329  * The idxary[] consists of dst_channels number of elements.
    330  * The ith element if idxary[] corresponds the ith destination channel.
    331  * A non-negative value is the channel index in the source frame.
    332  * A negative index (-1) represents filling with 0.
    333  *
    334  * Example: Swapping L and R channels for stereo streams
    335  * idxary[0] = 1;
    336  * idxary[1] = 0;
    337  *
    338  * Example: Copying a mono source to the front center 5.1 channel
    339  * idxary[0] = -1;
    340  * idxary[1] = -1;
    341  * idxary[2] = 0;
    342  * idxary[3] = -1;
    343  * idxary[4] = -1;
    344  * idxary[5] = -1;
    345  *
    346  * This copy allows swizzling of channels or replication of channels.
    347  *
    348  * Parameters:
    349  *  dst           Destination buffer
    350  *  dst_channels  Number of destination channels per frame
    351  *  src           Source buffer
    352  *  src_channels  Number of source channels per frame
    353  *  idxary        Array of indices representing channels in the source frame
    354  *  sample_size   Size of each sample in bytes.  Must be 1, 2, 3, or 4.
    355  *  count         Number of frames to copy
    356  * The destination and source buffers must be completely separate (non-overlapping).
    357  * If the sample size is not in range, the function will abort.
    358  */
    359 void memcpy_by_index_array(void *dst, uint32_t dst_channels,
    360         const void *src, uint32_t src_channels,
    361         const int8_t *idxary, size_t sample_size, size_t count);
    362 
    363 /* Prepares an index array (idxary) from channel masks, which can be later
    364  * used by memcpy_by_index_array(). Returns the number of array elements required.
    365  * This may be greater than idxcount, so the return value should be checked
    366  * if idxary size is less than 32. Note that idxary is a caller allocated array
    367  * of at least as many channels as present in the dst_mask.
    368  * Channels present in the channel mask are represented by set bits in the
    369  * uint32_t value and are matched without further interpretation.
    370  *
    371  * Parameters:
    372  *  idxary      Updated array of indices of channels in the src frame for the dst frame
    373  *  idxcount    Number of caller allocated elements in idxary
    374  *  dst_mask    Bit mask corresponding to destination channels present
    375  *  src_mask    Bit mask corresponding to source channels present
    376  */
    377 size_t memcpy_by_index_array_initialization(int8_t *idxary, size_t idxcount,
    378         uint32_t dst_mask, uint32_t src_mask);
    379 
    380 /**
    381  * Clamp (aka hard limit or clip) a signed 32-bit sample to 16-bit range.
    382  */
    383 static inline int16_t clamp16(int32_t sample)
    384 {
    385     if ((sample>>15) ^ (sample>>31))
    386         sample = 0x7FFF ^ (sample>>31);
    387     return sample;
    388 }
    389 
    390 /*
    391  * Convert a IEEE 754 single precision float [-1.0, 1.0) to int16_t [-32768, 32767]
    392  * with clamping.  Note the open bound at 1.0, values within 1/65536 of 1.0 map
    393  * to 32767 instead of 32768 (early clamping due to the smaller positive integer subrange).
    394  *
    395  * Values outside the range [-1.0, 1.0) are properly clamped to -32768 and 32767,
    396  * including -Inf and +Inf. NaN will generally be treated either as -32768 or 32767,
    397  * depending on the sign bit inside NaN (whose representation is not unique).
    398  * Nevertheless, strictly speaking, NaN behavior should be considered undefined.
    399  *
    400  * Rounding of 0.5 lsb is to even (default for IEEE 754).
    401  */
    402 static inline int16_t clamp16_from_float(float f)
    403 {
    404     /* Offset is used to expand the valid range of [-1.0, 1.0) into the 16 lsbs of the
    405      * floating point significand. The normal shift is 3<<22, but the -15 offset
    406      * is used to multiply by 32768.
    407      */
    408     static const float offset = (float)(3 << (22 - 15));
    409     /* zero = (0x10f << 22) =  0x43c00000 (not directly used) */
    410     static const int32_t limneg = (0x10f << 22) /*zero*/ - 32768; /* 0x43bf8000 */
    411     static const int32_t limpos = (0x10f << 22) /*zero*/ + 32767; /* 0x43c07fff */
    412 
    413     union {
    414         float f;
    415         int32_t i;
    416     } u;
    417 
    418     u.f = f + offset; /* recenter valid range */
    419     /* Now the valid range is represented as integers between [limneg, limpos].
    420      * Clamp using the fact that float representation (as an integer) is an ordered set.
    421      */
    422     if (u.i < limneg)
    423         u.i = -32768;
    424     else if (u.i > limpos)
    425         u.i = 32767;
    426     return u.i; /* Return lower 16 bits, the part of interest in the significand. */
    427 }
    428 
    429 /* Convert a single-precision floating point value to a Q0.23 integer value, stored in a
    430  * 32 bit signed integer (technically stored as Q8.23, but clamped to Q0.23).
    431  *
    432  * Rounds to nearest, ties away from 0.
    433  *
    434  * Values outside the range [-1.0, 1.0) are properly clamped to -8388608 and 8388607,
    435  * including -Inf and +Inf. NaN values are considered undefined, and behavior may change
    436  * depending on hardware and future implementation of this function.
    437  */
    438 static inline int32_t clamp24_from_float(float f)
    439 {
    440     static const float scale = (float)(1 << 23);
    441     static const float limpos = 0x7fffff / scale;
    442     static const float limneg = -0x800000 / scale;
    443 
    444     if (f <= limneg) {
    445         return -0x800000;
    446     } else if (f >= limpos) {
    447         return 0x7fffff;
    448     }
    449     f *= scale;
    450     /* integer conversion is through truncation (though int to float is not).
    451      * ensure that we round to nearest, ties away from 0.
    452      */
    453     return f > 0 ? f + 0.5 : f - 0.5;
    454 }
    455 
    456 /* Convert a signed fixed-point 32-bit Q8.23 value to a Q0.23 integer value,
    457  * stored in a 32-bit signed integer (technically stored as Q8.23, but clamped to Q0.23).
    458  *
    459  * Values outside the range [-0x800000, 0x7fffff] are clamped to that range.
    460  */
    461 static inline int32_t clamp24_from_q8_23(int32_t ival)
    462 {
    463     static const int32_t limpos = 0x7fffff;
    464     static const int32_t limneg = -0x800000;
    465     if (ival < limneg) {
    466         return limneg;
    467     } else if (ival > limpos) {
    468         return limpos;
    469     } else {
    470         return ival;
    471     }
    472 }
    473 
    474 /* Convert a single-precision floating point value to a Q4.27 integer value.
    475  * Rounds to nearest, ties away from 0.
    476  *
    477  * Values outside the range [-16.0, 16.0) are properly clamped to -2147483648 and 2147483647,
    478  * including -Inf and +Inf. NaN values are considered undefined, and behavior may change
    479  * depending on hardware and future implementation of this function.
    480  */
    481 static inline int32_t clampq4_27_from_float(float f)
    482 {
    483     static const float scale = (float)(1UL << 27);
    484     static const float limpos = 16.;
    485     static const float limneg = -16.;
    486 
    487     if (f <= limneg) {
    488         return -0x80000000; /* or 0x80000000 */
    489     } else if (f >= limpos) {
    490         return 0x7fffffff;
    491     }
    492     f *= scale;
    493     /* integer conversion is through truncation (though int to float is not).
    494      * ensure that we round to nearest, ties away from 0.
    495      */
    496     return f > 0 ? f + 0.5 : f - 0.5;
    497 }
    498 
    499 /* Convert a single-precision floating point value to a Q0.31 integer value.
    500  * Rounds to nearest, ties away from 0.
    501  *
    502  * Values outside the range [-1.0, 1.0) are properly clamped to -2147483648 and 2147483647,
    503  * including -Inf and +Inf. NaN values are considered undefined, and behavior may change
    504  * depending on hardware and future implementation of this function.
    505  */
    506 static inline int32_t clamp32_from_float(float f)
    507 {
    508     static const float scale = (float)(1UL << 31);
    509     static const float limpos = 1.;
    510     static const float limneg = -1.;
    511 
    512     if (f <= limneg) {
    513         return -0x80000000; /* or 0x80000000 */
    514     } else if (f >= limpos) {
    515         return 0x7fffffff;
    516     }
    517     f *= scale;
    518     /* integer conversion is through truncation (though int to float is not).
    519      * ensure that we round to nearest, ties away from 0.
    520      */
    521     return f > 0 ? f + 0.5 : f - 0.5;
    522 }
    523 
    524 /* Convert a signed fixed-point 32-bit Q4.27 value to single-precision floating-point.
    525  * The nominal output float range is [-1.0, 1.0] if the fixed-point range is
    526  * [0xf8000000, 0x07ffffff].  The full float range is [-16.0, 16.0].
    527  *
    528  * Note the closed range at 1.0 and 16.0 is due to rounding on conversion to float.
    529  * In more detail: if the fixed-point integer exceeds 24 bit significand of single
    530  * precision floating point, the 0.5 lsb in the significand conversion will round
    531  * towards even, as per IEEE 754 default.
    532  */
    533 static inline float float_from_q4_27(int32_t ival)
    534 {
    535     /* The scale factor is the reciprocal of the fractional bits.
    536      *
    537      * Since the scale factor is a power of 2, the scaling is exact, and there
    538      * is no rounding due to the multiplication - the bit pattern is preserved.
    539      * However, there may be rounding due to the fixed-point to float conversion,
    540      * as described above.
    541      */
    542     static const float scale = 1. / (float)(1UL << 27);
    543 
    544     return ival * scale;
    545 }
    546 
    547 /* Convert an unsigned fixed-point 32-bit U4.28 value to single-precision floating-point.
    548  * The nominal output float range is [0.0, 1.0] if the fixed-point range is
    549  * [0x00000000, 0x10000000].  The full float range is [0.0, 16.0].
    550  *
    551  * Note the closed range at 1.0 and 16.0 is due to rounding on conversion to float.
    552  * In more detail: if the fixed-point integer exceeds 24 bit significand of single
    553  * precision floating point, the 0.5 lsb in the significand conversion will round
    554  * towards even, as per IEEE 754 default.
    555  */
    556 static inline float float_from_u4_28(uint32_t uval)
    557 {
    558     static const float scale = 1. / (float)(1UL << 28);
    559 
    560     return uval * scale;
    561 }
    562 
    563 /* Convert an unsigned fixed-point 16-bit U4.12 value to single-precision floating-point.
    564  * The nominal output float range is [0.0, 1.0] if the fixed-point range is
    565  * [0x0000, 0x1000].  The full float range is [0.0, 16.0).
    566  */
    567 static inline float float_from_u4_12(uint16_t uval)
    568 {
    569     static const float scale = 1. / (float)(1UL << 12);
    570 
    571     return uval * scale;
    572 }
    573 
    574 /* Convert a single-precision floating point value to a U4.28 integer value.
    575  * Rounds to nearest, ties away from 0.
    576  *
    577  * Values outside the range [0, 16.0] are properly clamped to [0, 4294967295]
    578  * including -Inf and +Inf. NaN values are considered undefined, and behavior may change
    579  * depending on hardware and future implementation of this function.
    580  */
    581 static inline uint32_t u4_28_from_float(float f)
    582 {
    583     static const float scale = (float)(1 << 28);
    584     static const float limpos = 0xffffffffUL / scale;
    585 
    586     if (f <= 0.) {
    587         return 0;
    588     } else if (f >= limpos) {
    589         return 0xffffffff;
    590     }
    591     /* integer conversion is through truncation (though int to float is not).
    592      * ensure that we round to nearest, ties away from 0.
    593      */
    594     return f * scale + 0.5;
    595 }
    596 
    597 /* Convert a single-precision floating point value to a U4.12 integer value.
    598  * Rounds to nearest, ties away from 0.
    599  *
    600  * Values outside the range [0, 16.0) are properly clamped to [0, 65535]
    601  * including -Inf and +Inf. NaN values are considered undefined, and behavior may change
    602  * depending on hardware and future implementation of this function.
    603  */
    604 static inline uint16_t u4_12_from_float(float f)
    605 {
    606     static const float scale = (float)(1 << 12);
    607     static const float limpos = 0xffff / scale;
    608 
    609     if (f <= 0.) {
    610         return 0;
    611     } else if (f >= limpos) {
    612         return 0xffff;
    613     }
    614     /* integer conversion is through truncation (though int to float is not).
    615      * ensure that we round to nearest, ties away from 0.
    616      */
    617     return f * scale + 0.5;
    618 }
    619 
    620 /* Convert a signed fixed-point 16-bit Q0.15 value to single-precision floating-point.
    621  * The output float range is [-1.0, 1.0) for the fixed-point range
    622  * [0x8000, 0x7fff].
    623  *
    624  * There is no rounding, the conversion and representation is exact.
    625  */
    626 static inline float float_from_i16(int16_t ival)
    627 {
    628     /* The scale factor is the reciprocal of the nominal 16 bit integer
    629      * half-sided range (32768).
    630      *
    631      * Since the scale factor is a power of 2, the scaling is exact, and there
    632      * is no rounding due to the multiplication - the bit pattern is preserved.
    633      */
    634     static const float scale = 1. / (float)(1UL << 15);
    635 
    636     return ival * scale;
    637 }
    638 
    639 /* Convert a packed 24bit Q0.23 value stored native-endian in a uint8_t ptr
    640  * to a signed fixed-point 32 bit integer Q0.31 value. The output Q0.31 range
    641  * is [0x80000000, 0x7fffff00] for the fixed-point range [0x800000, 0x7fffff].
    642  * Even though the output range is limited on the positive side, there is no
    643  * DC offset on the output, if the input has no DC offset.
    644  *
    645  * Avoid relying on the limited output range, as future implementations may go
    646  * to full range.
    647  */
    648 static inline int32_t i32_from_p24(const uint8_t *packed24)
    649 {
    650     /* convert to 32b */
    651 #if defined(HAVE_BIG_ENDIAN) == defined(HAVE_LITTLE_ENDIAN)
    652     /* check to see if we have exactly one or the other android endian flags set. */
    653 #error "Either HAVE_LITTLE_ENDIAN or HAVE_BIG_ENDIAN must be defined"
    654 #elif defined(HAVE_BIG_ENDIAN)
    655     return (packed24[2] << 8) | (packed24[1] << 16) | (packed24[0] << 24);
    656 #else /* HAVE_LITTLE_ENDIAN */
    657     return (packed24[0] << 8) | (packed24[1] << 16) | (packed24[2] << 24);
    658 #endif
    659 }
    660 
    661 /* Convert a 32-bit Q0.31 value to single-precision floating-point.
    662  * The output float range is [-1.0, 1.0] for the fixed-point range
    663  * [0x80000000, 0x7fffffff].
    664  *
    665  * Rounding may occur in the least significant 8 bits for large fixed point
    666  * values due to storage into the 24-bit floating-point significand.
    667  * Rounding will be to nearest, ties to even.
    668  */
    669 static inline float float_from_i32(int32_t ival)
    670 {
    671     static const float scale = 1. / (float)(1UL << 31);
    672 
    673     return ival * scale;
    674 }
    675 
    676 /* Convert a packed 24bit Q0.23 value stored native endian in a uint8_t ptr
    677  * to single-precision floating-point. The output float range is [-1.0, 1.0)
    678  * for the fixed-point range [0x800000, 0x7fffff].
    679  *
    680  * There is no rounding, the conversion and representation is exact.
    681  */
    682 static inline float float_from_p24(const uint8_t *packed24)
    683 {
    684     return float_from_i32(i32_from_p24(packed24));
    685 }
    686 
    687 /* Convert a 24-bit Q8.23 value to single-precision floating-point.
    688  * The nominal output float range is [-1.0, 1.0) for the fixed-point
    689  * range [0xff800000, 0x007fffff].  The maximum float range is [-256.0, 256.0).
    690  *
    691  * There is no rounding in the nominal range, the conversion and representation
    692  * is exact. For values outside the nominal range, rounding is to nearest, ties to even.
    693  */
    694 static inline float float_from_q8_23(int32_t ival)
    695 {
    696     static const float scale = 1. / (float)(1UL << 23);
    697 
    698     return ival * scale;
    699 }
    700 
    701 /**
    702  * Multiply-accumulate 16-bit terms with 32-bit result: return a + in*v.
    703  */
    704 static inline
    705 int32_t mulAdd(int16_t in, int16_t v, int32_t a)
    706 {
    707 #if defined(__arm__) && !defined(__thumb__)
    708     int32_t out;
    709     asm( "smlabb %[out], %[in], %[v], %[a] \n"
    710          : [out]"=r"(out)
    711          : [in]"%r"(in), [v]"r"(v), [a]"r"(a)
    712          : );
    713     return out;
    714 #else
    715     return a + in * (int32_t)v;
    716 #endif
    717 }
    718 
    719 /**
    720  * Multiply 16-bit terms with 32-bit result: return in*v.
    721  */
    722 static inline
    723 int32_t mul(int16_t in, int16_t v)
    724 {
    725 #if defined(__arm__) && !defined(__thumb__)
    726     int32_t out;
    727     asm( "smulbb %[out], %[in], %[v] \n"
    728          : [out]"=r"(out)
    729          : [in]"%r"(in), [v]"r"(v)
    730          : );
    731     return out;
    732 #else
    733     return in * (int32_t)v;
    734 #endif
    735 }
    736 
    737 /**
    738  * Similar to mulAdd, but the 16-bit terms are extracted from a 32-bit interleaved stereo pair.
    739  */
    740 static inline
    741 int32_t mulAddRL(int left, uint32_t inRL, uint32_t vRL, int32_t a)
    742 {
    743 #if defined(__arm__) && !defined(__thumb__)
    744     int32_t out;
    745     if (left) {
    746         asm( "smlabb %[out], %[inRL], %[vRL], %[a] \n"
    747              : [out]"=r"(out)
    748              : [inRL]"%r"(inRL), [vRL]"r"(vRL), [a]"r"(a)
    749              : );
    750     } else {
    751         asm( "smlatt %[out], %[inRL], %[vRL], %[a] \n"
    752              : [out]"=r"(out)
    753              : [inRL]"%r"(inRL), [vRL]"r"(vRL), [a]"r"(a)
    754              : );
    755     }
    756     return out;
    757 #else
    758     if (left) {
    759         return a + (int16_t)(inRL&0xFFFF) * (int16_t)(vRL&0xFFFF);
    760     } else {
    761         return a + (int16_t)(inRL>>16) * (int16_t)(vRL>>16);
    762     }
    763 #endif
    764 }
    765 
    766 /**
    767  * Similar to mul, but the 16-bit terms are extracted from a 32-bit interleaved stereo pair.
    768  */
    769 static inline
    770 int32_t mulRL(int left, uint32_t inRL, uint32_t vRL)
    771 {
    772 #if defined(__arm__) && !defined(__thumb__)
    773     int32_t out;
    774     if (left) {
    775         asm( "smulbb %[out], %[inRL], %[vRL] \n"
    776              : [out]"=r"(out)
    777              : [inRL]"%r"(inRL), [vRL]"r"(vRL)
    778              : );
    779     } else {
    780         asm( "smultt %[out], %[inRL], %[vRL] \n"
    781              : [out]"=r"(out)
    782              : [inRL]"%r"(inRL), [vRL]"r"(vRL)
    783              : );
    784     }
    785     return out;
    786 #else
    787     if (left) {
    788         return (int16_t)(inRL&0xFFFF) * (int16_t)(vRL&0xFFFF);
    789     } else {
    790         return (int16_t)(inRL>>16) * (int16_t)(vRL>>16);
    791     }
    792 #endif
    793 }
    794 
    795 __END_DECLS
    796 
    797 #endif  // ANDROID_AUDIO_PRIMITIVES_H
    798