Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2004-2010 NXP Software
      3  * Copyright (C) 2010 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 /**********************************************************************************
     19    INCLUDE FILES
     20 ***********************************************************************************/
     21 
     22 #include "VectorArithmetic.h"
     23 
     24 /**********************************************************************************
     25    FUNCTION COPY_16
     26 ***********************************************************************************/
     27 
     28 void Copy_16( const LVM_INT16 *src,
     29                     LVM_INT16 *dst,
     30                     LVM_INT16  n )
     31 {
     32     LVM_INT16 ii;
     33 
     34     if (src > dst)
     35     {
     36         for (ii = n; ii != 0; ii--)
     37         {
     38             *dst = *src;
     39             dst++;
     40             src++;
     41         }
     42     }
     43     else
     44     {
     45         src += n - 1;
     46         dst += n - 1;
     47         for (ii = n; ii != 0; ii--)
     48         {
     49             *dst = *src;
     50             dst--;
     51             src--;
     52         }
     53     }
     54 
     55     return;
     56 }
     57 #ifdef BUILD_FLOAT
     58 void Copy_Float( const LVM_FLOAT *src,
     59                  LVM_FLOAT *dst,
     60                  LVM_INT16  n )
     61 {
     62     LVM_INT16 ii;
     63 
     64     if (src > dst)
     65     {
     66         for (ii = n; ii != 0; ii--)
     67         {
     68             *dst = *src;
     69             dst++;
     70             src++;
     71         }
     72     }
     73     else
     74     {
     75         src += n - 1;
     76         dst += n - 1;
     77         for (ii = n; ii != 0; ii--)
     78         {
     79             *dst = *src;
     80             dst--;
     81             src--;
     82         }
     83     }
     84 
     85     return;
     86 }
     87 #ifdef SUPPORT_MC
     88 // Extract out the stereo channel pair from multichannel source.
     89 void Copy_Float_Mc_Stereo(const LVM_FLOAT *src,
     90                  LVM_FLOAT *dst,
     91                  LVM_INT16 NrFrames, /* Number of frames */
     92                  LVM_INT32 NrChannels)
     93 {
     94     LVM_INT16 ii;
     95 
     96     if (NrChannels >= 2)
     97     {
     98         for (ii = NrFrames; ii != 0; ii--)
     99         {
    100             dst[0] = src[0];
    101             dst[1] = src[1];
    102             dst += 2;
    103             src += NrChannels;
    104         }
    105     }
    106     else if (NrChannels == 1)
    107     {   // not expected to occur, provided for completeness.
    108         src += (NrFrames - 1);
    109         dst += 2 * (NrFrames - 1);
    110         for (ii = NrFrames; ii != 0; ii--)
    111         {
    112             dst[0] = src[0];
    113             dst[1] = src[0];
    114             dst -= 2;
    115             src --;
    116         }
    117     }
    118 }
    119 
    120 // Merge a multichannel source with stereo contained in dst, to dst.
    121 void Copy_Float_Stereo_Mc(const LVM_FLOAT *src,
    122                  LVM_FLOAT *dst,
    123                  LVM_INT16 NrFrames, /* Number of frames*/
    124                  LVM_INT32 NrChannels)
    125 {
    126     LVM_INT16 ii, jj;
    127     LVM_FLOAT *src_st = dst + 2 * (NrFrames - 1);
    128 
    129     // repack dst which carries stereo information
    130     // together with the upper channels of src.
    131     dst += NrChannels * (NrFrames - 1);
    132     src += NrChannels * (NrFrames - 1);
    133     for (ii = NrFrames; ii != 0; ii--)
    134     {
    135         dst[1] = src_st[1];
    136         dst[0] = src_st[0]; // copy 1 before 0 is required for NrChannels == 3.
    137         for (jj = 2; jj < NrChannels; jj++)
    138         {
    139             dst[jj] = src[jj];
    140         }
    141         dst    -= NrChannels;
    142         src    -= NrChannels;
    143         src_st -= 2;
    144     }
    145 }
    146 #endif
    147 #endif
    148 /**********************************************************************************/
    149