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